From eb060018f39ed96b083b8c11b79c0ca500bf9e14 Mon Sep 17 00:00:00 2001 From: Apple OSS Distributions <91980991+AppleOSSDistributions@users.noreply.github.com> Date: Wed, 6 Aug 2014 19:31:31 +0000 Subject: [PATCH] SmartcardCCID-55008 Imported from SmartcardCCID-55008.tar.gz --- COPYING | 602 +- SmartcardCCID.plist | 56 +- ccid/Makefile | 14 +- ccid/ccid-1.4.14.tar.bz2 | Bin 0 -> 484659 bytes ccid/ccid/ChangeLog | 3323 +++ ccid/ccid/INSTALL | 4 +- ccid/ccid/MacOSX/configure | 57 +- ccid/ccid/MacOSX/configure.orig | 113 + ccid/ccid/MacOSX/debuglog.h | 47 +- ccid/ccid/MacOSX/ifdhandler.h | 757 +- ccid/ccid/MacOSX/reader.h | 54 +- ccid/ccid/MacOSX/reader.h.in | 223 - ccid/ccid/Makefile.am | 5 +- ccid/ccid/Makefile.in | 552 +- ccid/ccid/README | 732 +- ccid/ccid/SCARDGETATTRIB.txt | 19 +- ccid/ccid/aclocal.m4 | 1084 +- ccid/ccid/ar-lib | 270 + ccid/ccid/bootstrap | 2 +- ccid/ccid/compile | 245 +- ccid/ccid/config.guess | 541 +- ccid/ccid/config.h.in | 28 +- ccid/ccid/config.sub | 299 +- ccid/ccid/configure | 10966 ++++----- ccid/ccid/{configure.in => configure.ac} | 175 +- .../Kobil_mIDentity_switch.c | 147 +- .../Kobil_mIDentity_switch/Makefile.am | 8 +- .../Kobil_mIDentity_switch/Makefile.in | 481 +- ccid/ccid/contrib/Makefile.in | 411 +- ccid/ccid/contrib/RSA_SecurID/Makefile.am | 6 +- ccid/ccid/contrib/RSA_SecurID/Makefile.in | 456 +- .../RSA_SecurID/RSA_SecurID_getpasswd.c | 21 +- ccid/ccid/depcomp | 586 +- ccid/ccid/examples/GPL-2 | 339 + ccid/ccid/examples/Makefile.am | 3 +- ccid/ccid/examples/Makefile.in | 372 +- ccid/ccid/examples/PCSCv2part10.c | 127 + ccid/ccid/examples/PCSCv2part10.h | 140 + ccid/ccid/examples/scardcontrol.c | 300 +- ccid/ccid/install-sh | 38 +- ccid/ccid/ltmain.sh | 4016 ++-- ccid/ccid/m4/Makefile.am | 3 - ccid/ccid/m4/Makefile.in | 353 - ccid/ccid/m4/as-ac-expand.m4 | 43 + .../ccid/m4/{acx_pthread.m4 => ax_pthread.m4} | 142 +- ccid/ccid/m4/libtool.m4 | 2251 +- ccid/ccid/m4/ltoptions.m4 | 32 +- ccid/ccid/m4/ltversion.m4 | 12 +- ccid/ccid/m4/lt~obsolete.m4 | 12 +- ccid/ccid/missing | 460 +- ccid/ccid/readers/ACR122U.txt | 50 - ccid/ccid/readers/ACR122U_PICC.txt | 48 - ccid/ccid/readers/ACR38U-CCID.txt | 46 - ccid/ccid/readers/ASEDrive_IIIe_KB.txt | 52 - ccid/ccid/readers/ASE_IIIe.txt | 50 - ccid/ccid/readers/ATMEL_AT91SO.txt | 57 - ccid/ccid/readers/ActivCardV2.txt | 53 - ccid/ccid/readers/ActivCardV3.txt | 51 - .../Aladdin_eToken_PRO_USB_72K_Java.txt | 53 - ccid/ccid/readers/Alya.txt | 90 - ccid/ccid/readers/AxaltoV3.txt | 51 - ccid/ccid/readers/BludriveII.txt | 65 - ccid/ccid/readers/Broadcom_5880.txt | 54 - ccid/ccid/readers/C3PO_KBR36.txt | 54 - ccid/ccid/readers/C3PO_LTC32_USBv2.txt | 54 - ccid/ccid/readers/C3PO_TLTC2USB.txt | 50 - ccid/ccid/readers/CL1356T.txt | 50 - ccid/ccid/readers/CardMan1021.txt | 76 - ccid/ccid/readers/CardMan3021.txt | 165 - ccid/ccid/readers/CardMan3121.txt | 52 - ccid/ccid/readers/CardMan3621.txt | 167 - ccid/ccid/readers/CardMan3821.txt | 170 - ccid/ccid/readers/CardMan4321.txt | 170 - ccid/ccid/readers/CardMan5125.txt | 168 - ccid/ccid/readers/CardMan5321.txt | 170 - ccid/ccid/readers/CardMan6121.txt | 166 - ccid/ccid/readers/ChangeLog | 1814 ++ ccid/ccid/readers/Charismathics.txt | 51 - ccid/ccid/readers/CherryST1044U.txt | 166 - ccid/ccid/readers/CherrySmartBoardXX1X.txt | 188 - .../readers/CherrySmartTerminalST2XXX.txt | 55 - ccid/ccid/readers/CherryXX33.txt | 51 - ccid/ccid/readers/CherryXX44.txt | 168 - ccid/ccid/readers/CryptoIdentity.txt | 50 - ccid/ccid/readers/DellSCRK.txt | 91 - ccid/ccid/readers/DellSK-3106.txt | 52 - ccid/ccid/readers/Eutron_CryptoIdentity.txt | 51 - ccid/ccid/readers/Eutron_Digipass_860.txt | 51 - ccid/ccid/readers/Eutron_Smart_Pocket.txt | 51 - ...jitsuSiemens_SmartCard_Keyboard_USB_2A.txt | 170 - .../FujitsuSiemens_SmartCard_USB_2A.txt | 170 - ccid/ccid/readers/GemCoreSIMPro.txt | 91 - ccid/ccid/readers/GemPC433_SL.txt | 50 - ccid/ccid/readers/GemPCKey.txt | 90 - ccid/ccid/readers/GemPCPinpad.txt | 93 - ccid/ccid/readers/GemPCTwin.txt | 90 - ccid/ccid/readers/GemPC_Express.txt | 89 - ccid/ccid/readers/Gem_e-SealPro.txt | 55 - .../GemaltoSmartEnterpriseGuardian.txt | 52 - ccid/ccid/readers/Gemalto_PDT.txt | 49 - .../ccid/readers/GnD_StarSignCardToken350.txt | 49 - .../ccid/readers/GnD_StarSignCardToken550.txt | 49 - ccid/ccid/readers/HPUSBSmartCardKeyboard.txt | 53 - ccid/ccid/readers/HP_MFP_SmartCardReader.txt | 53 - ccid/ccid/readers/KAAN_Advanced.txt | 62 - ccid/ccid/readers/KAAN_Base.txt | 60 - ccid/ccid/readers/KAAN_SIM_III.txt | 55 - .../KEBTechnology_KONA_USB_SmartCard.txt | 49 - ccid/ccid/readers/Kobil_EMV_CAP.txt | 59 - ccid/ccid/readers/LTC31.txt | 45 - ccid/ccid/readers/LTC31v2.txt | 50 - ccid/ccid/readers/Lenovo.txt | 91 - ccid/ccid/readers/Makefile.am | 108 +- ccid/ccid/readers/Makefile.in | 279 +- ccid/ccid/readers/MySmartPad.txt | 48 - ccid/ccid/readers/Oberthur-CosmoCard.txt | 51 - ccid/ccid/readers/Oz776S.txt | 47 - ccid/ccid/readers/Oz776_7772.txt | 50 - ccid/ccid/readers/Philips_SmartMX.txt | 49 - ccid/ccid/readers/Precise_250_MC.txt | 52 - ccid/ccid/readers/ReinerSCT.txt | 59 - ccid/ccid/readers/SCR331-DI-NTTCom.txt | 52 - ccid/ccid/readers/SCR331-DI.txt | 55 - ccid/ccid/readers/SCR331.txt | 53 - ccid/ccid/readers/SCR3310.txt | 53 - ccid/ccid/readers/SCR3311.txt | 53 - ccid/ccid/readers/SCR3320.txt | 53 - ccid/ccid/readers/SCR333.txt | 53 - ccid/ccid/readers/SCR3340.txt | 53 - ccid/ccid/readers/SCR335.txt | 53 - ccid/ccid/readers/SCR355.txt | 51 - ccid/ccid/readers/SDI010.txt | 55 - ccid/ccid/readers/SIM_Pocket_Combo.txt | 100 - ccid/ccid/readers/SPR532.txt | 55 - ccid/ccid/readers/Sitecom_MD-010.txt | 109 - ccid/ccid/readers/SpringCard_CSB6_Basic.txt | 56 - ccid/ccid/readers/SpringCard_CSB6_Secure.txt | 56 - .../ccid/readers/SpringCard_CSB6_Ultimate.txt | 56 - ccid/ccid/readers/SpringCard_CrazyWriter.txt | 56 - .../SpringCard_EasyFinger_Standard.txt | 56 - .../SpringCard_EasyFinger_Ultimate.txt | 56 - ccid/ccid/readers/SpringCard_Prox_N_Roll.txt | 56 - ccid/ccid/readers/Validy_TokenA.txt | 50 - ccid/ccid/readers/Vasco_DP905.txt | 111 - ccid/ccid/readers/Vega-Alpha.txt | 93 - .../readers/Verisign_secure_storage_token.txt | 53 - ccid/ccid/readers/Verisign_secure_token.txt | 53 - ccid/ccid/readers/Winbond.txt | 55 - ccid/ccid/readers/e-gate.txt | 51 - ccid/ccid/readers/iDream.txt | 50 - ccid/ccid/readers/id3_CL1356A_HID.txt | 52 - ccid/ccid/readers/id3_CL1356D.txt | 50 - ccid/ccid/readers/mIDentity.txt | 55 - ccid/ccid/readers/mIDentityXL.txt | 57 - ccid/ccid/readers/sid800.txt | 47 - ccid/ccid/readers/supported_readers.txt | 684 +- ccid/ccid/src/92_pcscd_ccid.rules | 20 + ccid/ccid/src/Info.plist.src | 11 +- ccid/ccid/src/Makefile.am | 58 +- ccid/ccid/src/Makefile.in | 969 +- ccid/ccid/src/Makefile.in.orig | 969 +- ccid/ccid/src/ccid.c | 193 +- ccid/ccid/src/ccid.h | 106 +- ccid/ccid/src/ccid_ifdhandler.h | 13 +- ccid/ccid/src/ccid_serial.c | 46 +- ccid/ccid/src/ccid_serial.h | 4 +- ccid/ccid/src/ccid_usb.c | 1553 +- ccid/ccid/src/ccid_usb.h | 14 +- ccid/ccid/src/commands.c | 476 +- ccid/ccid/src/commands.h | 6 +- ccid/ccid/src/convert_version.pl | 2 +- ccid/ccid/src/create_Info_plist.pl | 24 +- ccid/ccid/src/debug.c | 128 +- ccid/ccid/src/debug.h | 8 +- ccid/ccid/src/defs.h | 43 +- ccid/ccid/src/ifdhandler.c | 836 +- ccid/ccid/src/misc.h | 19 +- ccid/ccid/src/openct/proto-t1.c | 30 +- ccid/ccid/src/parse.c | 487 +- ccid/ccid/src/parser.h | 30 +- ccid/ccid/src/pcscd_ccid.rules | 38 - ccid/ccid/src/reader.conf.in | 2 +- ccid/ccid/src/simclist.c | 1525 ++ ccid/ccid/src/simclist.h | 980 + ccid/ccid/src/strlcpycat.h | 8 +- ccid/ccid/src/tokenparser.c | 262 +- ccid/ccid/src/tokenparser.l | 264 +- ccid/ccid/src/towitoko/atr.c | 2 +- ccid/ccid/src/utils.c | 5 +- ccid/ccid/src/utils.h | 4 +- ccid/ccid/ylwrap | 224 +- ccid/files/ForceWithoutPcsc.patch | 47 +- ccid/files/RSA_SecurID_getpasswd.c.patch | 65 + ccid/files/ccid-info-plist.patch | 5 +- ccid/files/destDirFix.patch | 17 +- ccid/files/osxConfigure.patch | 9 +- ccid/files/scardcontrol.c.patch | 117 + libusb/Makefile | 8 +- libusb/files/FixConfigureAddCPP.patch | 12 - libusb/files/allowWarnings.patch | 13 - libusb/files/automake_copy.patch | 18 - libusb/files/darwin_no_seize.patch | 35 +- libusb/files/darwinwarnings.patch | 44 - libusb/files/remove_config_libdir.patch | 10 - libusb/files/skipConfigure.patch | 21 - libusb/libusb-1.0.9.tar.bz2 | Bin 0 -> 421971 bytes libusb/libusb/AUTHORS | 48 +- libusb/libusb/COMPILE.SVN | 16 - libusb/libusb/COPYING | 6 +- libusb/libusb/ChangeLog | 4378 +++- libusb/libusb/INSTALL | 234 + libusb/libusb/INSTALL.libusb.in | 59 - libusb/libusb/LICENSE | 47 - libusb/libusb/Mainpage.dox | 6 - libusb/libusb/Makefile.am | 110 +- libusb/libusb/Makefile.in | 516 +- libusb/libusb/NEWS | 66 +- libusb/libusb/PORTING | 95 + libusb/libusb/README | 22 + libusb/libusb/README.in | 94 - libusb/libusb/THANKS | 8 + libusb/libusb/TODO | 9 + libusb/libusb/acinclude.m4 | 101 - libusb/libusb/aclocal.m4 | 1155 +- libusb/libusb/apidocs/doxygen.css | 0 libusb/libusb/apidocs/doxygen.png | Bin 2351 -> 0 bytes libusb/libusb/apidocs/footer.html | 11 - libusb/libusb/apidocs/header.html | 34 - libusb/libusb/autogen.sh | 75 - libusb/libusb/autom4te.cache/output.0 | 19570 ---------------- libusb/libusb/autom4te.cache/output.1 | 19566 --------------- libusb/libusb/autom4te.cache/requests | 293 - libusb/libusb/autom4te.cache/traces.0 | 2615 --- libusb/libusb/autom4te.cache/traces.1 | 810 - libusb/libusb/bsd.c | 637 - libusb/libusb/compile | 6 +- libusb/libusb/config.guess | 274 +- libusb/libusb/config.h.in | 91 +- libusb/libusb/config.sub | 137 +- libusb/libusb/configure | 8500 ++----- libusb/libusb/configure.ac | 222 + libusb/libusb/configure.in | 264 - libusb/libusb/darwin.c | 1320 -- libusb/libusb/descriptors.c | 520 - libusb/libusb/doc/Makefile.am | 35 +- libusb/libusb/doc/Makefile.in | 102 +- libusb/libusb/doc/api.sgml | 38 - .../{Doxyfile.in => doc/doxygen.cfg.in} | 469 +- libusb/libusb/doc/examples.sgml | 71 - libusb/libusb/doc/functions.sgml | 540 - libusb/libusb/doc/intro.sgml | 17 - libusb/libusb/doc/manual.sgml | 75 - libusb/libusb/doc/website.dsl | 197 - libusb/libusb/error.c | 36 - libusb/libusb/error.h | 31 - libusb/libusb/examples/Makefile.am | 21 + libusb/libusb/examples/Makefile.in | 542 + libusb/libusb/examples/dpfp.c | 507 + libusb/libusb/examples/dpfp_threaded.c | 545 + libusb/libusb/examples/listdevs.c | 64 + libusb/libusb/libusb-1.0.pc.in | 12 + libusb/libusb/libusb-config.in | 79 - libusb/libusb/libusb.pc.in | 11 - libusb/libusb/libusb.spec.in | 65 - libusb/libusb/libusb/Makefile.am | 49 + libusb/libusb/libusb/Makefile.in | 718 + libusb/libusb/libusb/core.c | 1875 ++ libusb/libusb/libusb/descriptor.c | 730 + libusb/libusb/libusb/io.c | 2454 ++ libusb/libusb/libusb/libusb-1.0.def | 120 + libusb/libusb/libusb/libusb-1.0.rc | 56 + libusb/libusb/libusb/libusb.h | 1443 ++ libusb/libusb/libusb/libusbi.h | 935 + libusb/libusb/libusb/os/darwin_usb.c | 1750 ++ libusb/libusb/libusb/os/darwin_usb.h | 169 + libusb/libusb/libusb/os/linux_usbfs.c | 2438 ++ libusb/libusb/libusb/os/linux_usbfs.h | 139 + libusb/libusb/libusb/os/openbsd_usb.c | 727 + libusb/libusb/libusb/os/poll_posix.h | 10 + libusb/libusb/libusb/os/poll_windows.c | 745 + libusb/libusb/libusb/os/poll_windows.h | 115 + libusb/libusb/libusb/os/threads_posix.c | 55 + libusb/libusb/libusb/os/threads_posix.h | 48 + libusb/libusb/libusb/os/threads_windows.c | 207 + libusb/libusb/libusb/os/threads_windows.h | 86 + libusb/libusb/libusb/os/windows_usb.c | 2996 +++ libusb/libusb/libusb/os/windows_usb.h | 608 + libusb/libusb/libusb/sync.c | 314 + libusb/libusb/libusb/version.h | 18 + libusb/libusb/linux.c | 733 - libusb/libusb/linux.h | 119 - libusb/libusb/ltmain.sh | 2423 +- libusb/libusb/msvc/config.h | 24 + libusb/libusb/msvc/ddk_build.cmd | 106 + libusb/libusb/msvc/inttypes.h | 295 + libusb/libusb/msvc/libusb.dsw | 56 + libusb/libusb/msvc/libusb_dll.dsp | 190 + libusb/libusb/msvc/libusb_dll.vcproj | 421 + libusb/libusb/msvc/libusb_dll.vcxproj | 166 + libusb/libusb/msvc/libusb_dll.vcxproj.filters | 69 + libusb/libusb/msvc/libusb_sources | 36 + libusb/libusb/msvc/libusb_static.dsp | 170 + libusb/libusb/msvc/libusb_static.vcproj | 346 + libusb/libusb/msvc/libusb_static.vcxproj | 150 + .../libusb/msvc/libusb_static.vcxproj.filters | 56 + libusb/libusb/msvc/libusb_vs2005.sln | 61 + libusb/libusb/msvc/libusb_vs2010.sln | 49 + libusb/libusb/msvc/listdevs.dsp | 103 + libusb/libusb/msvc/listdevs.vcproj | 360 + libusb/libusb/msvc/listdevs.vcxproj | 165 + libusb/libusb/msvc/listdevs.vcxproj.filters | 14 + libusb/libusb/msvc/listdevs_sources | 19 + libusb/libusb/msvc/stdint.h | 256 + libusb/libusb/tests/Makefile.am | 37 - libusb/libusb/tests/Makefile.in | 707 - libusb/libusb/tests/descriptor_test.cpp | 82 - libusb/libusb/tests/driver_name.cpp | 63 - libusb/libusb/tests/find_hubs.cpp | 37 - libusb/libusb/tests/find_mice.cpp | 53 - libusb/libusb/tests/get_resolution.cpp | 71 - libusb/libusb/tests/hub_strings.cpp | 83 - libusb/libusb/tests/id_test.cpp | 50 - libusb/libusb/tests/testlibusb.c | 154 - libusb/libusb/usb.c | 307 - libusb/libusb/usb.h.in | 337 - libusb/libusb/usbi.h | 74 - libusb/libusb/usbpp.cpp | 581 - libusb/libusb/usbpp.h | 855 - 328 files changed, 61192 insertions(+), 83759 deletions(-) create mode 100644 ccid/ccid-1.4.14.tar.bz2 create mode 100755 ccid/ccid/MacOSX/configure.orig delete mode 100644 ccid/ccid/MacOSX/reader.h.in create mode 100755 ccid/ccid/ar-lib rename ccid/ccid/{configure.in => configure.ac} (63%) create mode 100644 ccid/ccid/examples/GPL-2 create mode 100644 ccid/ccid/examples/PCSCv2part10.c create mode 100644 ccid/ccid/examples/PCSCv2part10.h mode change 100755 => 100644 ccid/ccid/ltmain.sh delete mode 100644 ccid/ccid/m4/Makefile.am delete mode 100644 ccid/ccid/m4/Makefile.in create mode 100644 ccid/ccid/m4/as-ac-expand.m4 rename ccid/ccid/m4/{acx_pthread.m4 => ax_pthread.m4} (70%) delete mode 100644 ccid/ccid/readers/ACR122U.txt delete mode 100644 ccid/ccid/readers/ACR122U_PICC.txt delete mode 100644 ccid/ccid/readers/ACR38U-CCID.txt delete mode 100644 ccid/ccid/readers/ASEDrive_IIIe_KB.txt delete mode 100644 ccid/ccid/readers/ASE_IIIe.txt delete mode 100644 ccid/ccid/readers/ATMEL_AT91SO.txt delete mode 100644 ccid/ccid/readers/ActivCardV2.txt delete mode 100644 ccid/ccid/readers/ActivCardV3.txt delete mode 100644 ccid/ccid/readers/Aladdin_eToken_PRO_USB_72K_Java.txt delete mode 100644 ccid/ccid/readers/Alya.txt delete mode 100644 ccid/ccid/readers/AxaltoV3.txt delete mode 100644 ccid/ccid/readers/BludriveII.txt delete mode 100644 ccid/ccid/readers/Broadcom_5880.txt delete mode 100644 ccid/ccid/readers/C3PO_KBR36.txt delete mode 100644 ccid/ccid/readers/C3PO_LTC32_USBv2.txt delete mode 100644 ccid/ccid/readers/C3PO_TLTC2USB.txt delete mode 100644 ccid/ccid/readers/CL1356T.txt delete mode 100644 ccid/ccid/readers/CardMan1021.txt delete mode 100644 ccid/ccid/readers/CardMan3021.txt delete mode 100644 ccid/ccid/readers/CardMan3121.txt delete mode 100644 ccid/ccid/readers/CardMan3621.txt delete mode 100644 ccid/ccid/readers/CardMan3821.txt delete mode 100644 ccid/ccid/readers/CardMan4321.txt delete mode 100644 ccid/ccid/readers/CardMan5125.txt delete mode 100644 ccid/ccid/readers/CardMan5321.txt delete mode 100644 ccid/ccid/readers/CardMan6121.txt create mode 100644 ccid/ccid/readers/ChangeLog delete mode 100644 ccid/ccid/readers/Charismathics.txt delete mode 100644 ccid/ccid/readers/CherryST1044U.txt delete mode 100644 ccid/ccid/readers/CherrySmartBoardXX1X.txt delete mode 100644 ccid/ccid/readers/CherrySmartTerminalST2XXX.txt delete mode 100644 ccid/ccid/readers/CherryXX33.txt delete mode 100644 ccid/ccid/readers/CherryXX44.txt delete mode 100644 ccid/ccid/readers/CryptoIdentity.txt delete mode 100644 ccid/ccid/readers/DellSCRK.txt delete mode 100644 ccid/ccid/readers/DellSK-3106.txt delete mode 100644 ccid/ccid/readers/Eutron_CryptoIdentity.txt delete mode 100644 ccid/ccid/readers/Eutron_Digipass_860.txt delete mode 100644 ccid/ccid/readers/Eutron_Smart_Pocket.txt delete mode 100644 ccid/ccid/readers/FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt delete mode 100644 ccid/ccid/readers/FujitsuSiemens_SmartCard_USB_2A.txt delete mode 100644 ccid/ccid/readers/GemCoreSIMPro.txt delete mode 100644 ccid/ccid/readers/GemPC433_SL.txt delete mode 100644 ccid/ccid/readers/GemPCKey.txt delete mode 100644 ccid/ccid/readers/GemPCPinpad.txt delete mode 100644 ccid/ccid/readers/GemPCTwin.txt delete mode 100644 ccid/ccid/readers/GemPC_Express.txt delete mode 100644 ccid/ccid/readers/Gem_e-SealPro.txt delete mode 100644 ccid/ccid/readers/GemaltoSmartEnterpriseGuardian.txt delete mode 100644 ccid/ccid/readers/Gemalto_PDT.txt delete mode 100644 ccid/ccid/readers/GnD_StarSignCardToken350.txt delete mode 100644 ccid/ccid/readers/GnD_StarSignCardToken550.txt delete mode 100644 ccid/ccid/readers/HPUSBSmartCardKeyboard.txt delete mode 100644 ccid/ccid/readers/HP_MFP_SmartCardReader.txt delete mode 100644 ccid/ccid/readers/KAAN_Advanced.txt delete mode 100644 ccid/ccid/readers/KAAN_Base.txt delete mode 100644 ccid/ccid/readers/KAAN_SIM_III.txt delete mode 100644 ccid/ccid/readers/KEBTechnology_KONA_USB_SmartCard.txt delete mode 100644 ccid/ccid/readers/Kobil_EMV_CAP.txt delete mode 100644 ccid/ccid/readers/LTC31.txt delete mode 100644 ccid/ccid/readers/LTC31v2.txt delete mode 100644 ccid/ccid/readers/Lenovo.txt delete mode 100644 ccid/ccid/readers/MySmartPad.txt delete mode 100644 ccid/ccid/readers/Oberthur-CosmoCard.txt delete mode 100644 ccid/ccid/readers/Oz776S.txt delete mode 100644 ccid/ccid/readers/Oz776_7772.txt delete mode 100644 ccid/ccid/readers/Philips_SmartMX.txt delete mode 100644 ccid/ccid/readers/Precise_250_MC.txt delete mode 100644 ccid/ccid/readers/ReinerSCT.txt delete mode 100644 ccid/ccid/readers/SCR331-DI-NTTCom.txt delete mode 100644 ccid/ccid/readers/SCR331-DI.txt delete mode 100644 ccid/ccid/readers/SCR331.txt delete mode 100644 ccid/ccid/readers/SCR3310.txt delete mode 100644 ccid/ccid/readers/SCR3311.txt delete mode 100644 ccid/ccid/readers/SCR3320.txt delete mode 100644 ccid/ccid/readers/SCR333.txt delete mode 100644 ccid/ccid/readers/SCR3340.txt delete mode 100644 ccid/ccid/readers/SCR335.txt delete mode 100644 ccid/ccid/readers/SCR355.txt delete mode 100644 ccid/ccid/readers/SDI010.txt delete mode 100644 ccid/ccid/readers/SIM_Pocket_Combo.txt delete mode 100644 ccid/ccid/readers/SPR532.txt delete mode 100644 ccid/ccid/readers/Sitecom_MD-010.txt delete mode 100644 ccid/ccid/readers/SpringCard_CSB6_Basic.txt delete mode 100644 ccid/ccid/readers/SpringCard_CSB6_Secure.txt delete mode 100644 ccid/ccid/readers/SpringCard_CSB6_Ultimate.txt delete mode 100644 ccid/ccid/readers/SpringCard_CrazyWriter.txt delete mode 100644 ccid/ccid/readers/SpringCard_EasyFinger_Standard.txt delete mode 100644 ccid/ccid/readers/SpringCard_EasyFinger_Ultimate.txt delete mode 100644 ccid/ccid/readers/SpringCard_Prox_N_Roll.txt delete mode 100644 ccid/ccid/readers/Validy_TokenA.txt delete mode 100644 ccid/ccid/readers/Vasco_DP905.txt delete mode 100644 ccid/ccid/readers/Vega-Alpha.txt delete mode 100644 ccid/ccid/readers/Verisign_secure_storage_token.txt delete mode 100644 ccid/ccid/readers/Verisign_secure_token.txt delete mode 100644 ccid/ccid/readers/Winbond.txt delete mode 100644 ccid/ccid/readers/e-gate.txt delete mode 100644 ccid/ccid/readers/iDream.txt delete mode 100644 ccid/ccid/readers/id3_CL1356A_HID.txt delete mode 100644 ccid/ccid/readers/id3_CL1356D.txt delete mode 100644 ccid/ccid/readers/mIDentity.txt delete mode 100644 ccid/ccid/readers/mIDentityXL.txt delete mode 100644 ccid/ccid/readers/sid800.txt create mode 100644 ccid/ccid/src/92_pcscd_ccid.rules delete mode 100644 ccid/ccid/src/pcscd_ccid.rules create mode 100644 ccid/ccid/src/simclist.c create mode 100644 ccid/ccid/src/simclist.h create mode 100644 ccid/files/RSA_SecurID_getpasswd.c.patch create mode 100644 ccid/files/scardcontrol.c.patch delete mode 100644 libusb/files/FixConfigureAddCPP.patch delete mode 100644 libusb/files/allowWarnings.patch delete mode 100644 libusb/files/automake_copy.patch delete mode 100644 libusb/files/darwinwarnings.patch delete mode 100644 libusb/files/remove_config_libdir.patch delete mode 100644 libusb/files/skipConfigure.patch create mode 100644 libusb/libusb-1.0.9.tar.bz2 delete mode 100644 libusb/libusb/COMPILE.SVN create mode 100644 libusb/libusb/INSTALL delete mode 100644 libusb/libusb/INSTALL.libusb.in delete mode 100644 libusb/libusb/LICENSE delete mode 100644 libusb/libusb/Mainpage.dox create mode 100644 libusb/libusb/PORTING create mode 100644 libusb/libusb/README delete mode 100644 libusb/libusb/README.in create mode 100644 libusb/libusb/THANKS create mode 100644 libusb/libusb/TODO delete mode 100644 libusb/libusb/acinclude.m4 delete mode 100755 libusb/libusb/apidocs/doxygen.css delete mode 100644 libusb/libusb/apidocs/doxygen.png delete mode 100755 libusb/libusb/apidocs/footer.html delete mode 100755 libusb/libusb/apidocs/header.html delete mode 100755 libusb/libusb/autogen.sh delete mode 100644 libusb/libusb/autom4te.cache/output.0 delete mode 100644 libusb/libusb/autom4te.cache/output.1 delete mode 100644 libusb/libusb/autom4te.cache/requests delete mode 100644 libusb/libusb/autom4te.cache/traces.0 delete mode 100644 libusb/libusb/autom4te.cache/traces.1 delete mode 100644 libusb/libusb/bsd.c create mode 100644 libusb/libusb/configure.ac delete mode 100644 libusb/libusb/configure.in delete mode 100644 libusb/libusb/darwin.c delete mode 100644 libusb/libusb/descriptors.c delete mode 100644 libusb/libusb/doc/api.sgml rename libusb/libusb/{Doxyfile.in => doc/doxygen.cfg.in} (71%) delete mode 100644 libusb/libusb/doc/examples.sgml delete mode 100644 libusb/libusb/doc/functions.sgml delete mode 100644 libusb/libusb/doc/intro.sgml delete mode 100644 libusb/libusb/doc/manual.sgml delete mode 100644 libusb/libusb/doc/website.dsl delete mode 100644 libusb/libusb/error.c delete mode 100644 libusb/libusb/error.h create mode 100644 libusb/libusb/examples/Makefile.am create mode 100644 libusb/libusb/examples/Makefile.in create mode 100644 libusb/libusb/examples/dpfp.c create mode 100644 libusb/libusb/examples/dpfp_threaded.c create mode 100644 libusb/libusb/examples/listdevs.c create mode 100644 libusb/libusb/libusb-1.0.pc.in delete mode 100644 libusb/libusb/libusb-config.in delete mode 100644 libusb/libusb/libusb.pc.in delete mode 100644 libusb/libusb/libusb.spec.in create mode 100644 libusb/libusb/libusb/Makefile.am create mode 100644 libusb/libusb/libusb/Makefile.in create mode 100644 libusb/libusb/libusb/core.c create mode 100644 libusb/libusb/libusb/descriptor.c create mode 100644 libusb/libusb/libusb/io.c create mode 100644 libusb/libusb/libusb/libusb-1.0.def create mode 100644 libusb/libusb/libusb/libusb-1.0.rc create mode 100644 libusb/libusb/libusb/libusb.h create mode 100644 libusb/libusb/libusb/libusbi.h create mode 100644 libusb/libusb/libusb/os/darwin_usb.c create mode 100644 libusb/libusb/libusb/os/darwin_usb.h create mode 100644 libusb/libusb/libusb/os/linux_usbfs.c create mode 100644 libusb/libusb/libusb/os/linux_usbfs.h create mode 100644 libusb/libusb/libusb/os/openbsd_usb.c create mode 100644 libusb/libusb/libusb/os/poll_posix.h create mode 100644 libusb/libusb/libusb/os/poll_windows.c create mode 100644 libusb/libusb/libusb/os/poll_windows.h create mode 100644 libusb/libusb/libusb/os/threads_posix.c create mode 100644 libusb/libusb/libusb/os/threads_posix.h create mode 100644 libusb/libusb/libusb/os/threads_windows.c create mode 100644 libusb/libusb/libusb/os/threads_windows.h create mode 100644 libusb/libusb/libusb/os/windows_usb.c create mode 100644 libusb/libusb/libusb/os/windows_usb.h create mode 100644 libusb/libusb/libusb/sync.c create mode 100644 libusb/libusb/libusb/version.h delete mode 100644 libusb/libusb/linux.c delete mode 100644 libusb/libusb/linux.h create mode 100644 libusb/libusb/msvc/config.h create mode 100644 libusb/libusb/msvc/ddk_build.cmd create mode 100644 libusb/libusb/msvc/inttypes.h create mode 100644 libusb/libusb/msvc/libusb.dsw create mode 100644 libusb/libusb/msvc/libusb_dll.dsp create mode 100644 libusb/libusb/msvc/libusb_dll.vcproj create mode 100644 libusb/libusb/msvc/libusb_dll.vcxproj create mode 100644 libusb/libusb/msvc/libusb_dll.vcxproj.filters create mode 100644 libusb/libusb/msvc/libusb_sources create mode 100644 libusb/libusb/msvc/libusb_static.dsp create mode 100644 libusb/libusb/msvc/libusb_static.vcproj create mode 100644 libusb/libusb/msvc/libusb_static.vcxproj create mode 100644 libusb/libusb/msvc/libusb_static.vcxproj.filters create mode 100644 libusb/libusb/msvc/libusb_vs2005.sln create mode 100644 libusb/libusb/msvc/libusb_vs2010.sln create mode 100644 libusb/libusb/msvc/listdevs.dsp create mode 100644 libusb/libusb/msvc/listdevs.vcproj create mode 100644 libusb/libusb/msvc/listdevs.vcxproj create mode 100644 libusb/libusb/msvc/listdevs.vcxproj.filters create mode 100644 libusb/libusb/msvc/listdevs_sources create mode 100644 libusb/libusb/msvc/stdint.h delete mode 100644 libusb/libusb/tests/Makefile.am delete mode 100644 libusb/libusb/tests/Makefile.in delete mode 100644 libusb/libusb/tests/descriptor_test.cpp delete mode 100644 libusb/libusb/tests/driver_name.cpp delete mode 100644 libusb/libusb/tests/find_hubs.cpp delete mode 100644 libusb/libusb/tests/find_mice.cpp delete mode 100644 libusb/libusb/tests/get_resolution.cpp delete mode 100644 libusb/libusb/tests/hub_strings.cpp delete mode 100644 libusb/libusb/tests/id_test.cpp delete mode 100644 libusb/libusb/tests/testlibusb.c delete mode 100644 libusb/libusb/usb.c delete mode 100644 libusb/libusb/usb.h.in delete mode 100644 libusb/libusb/usbi.h delete mode 100644 libusb/libusb/usbpp.cpp delete mode 100644 libusb/libusb/usbpp.h diff --git a/COPYING b/COPYING index 0484efe..c891f57 100644 --- a/COPYING +++ b/COPYING @@ -1,4 +1,4 @@ -======================== ccid-1.3.11 ======================== +======================== ccid-1.4.14 ======================== Licensed under the LGPL: ---------------------------------------------------------------------------- @@ -512,100 +512,510 @@ if necessary. Here is a sample; alter the names: That's all there is to it! +======================== libusb-1.0.9 ======================== +Licensed under the LGPL: + +---------------------------------------------------------------------------- + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. -libusb is covered by the LGPL: - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the -Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. - ----- - -Alternatively, the files usb.h.in and/or usb.h may be licensed under the -BSD license: - -Copyright (c) 2000-2003 Johannes Erdfelt -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -======================== libusb-0.1.13b ======================== - -libusb is covered by the LGPL: - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the -Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. - ----- - -Alternatively, the files usb.h.in and/or usb.h may be licensed under the -BSD license: - -Copyright (c) 2000-2003 Johannes Erdfelt -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/SmartcardCCID.plist b/SmartcardCCID.plist index 43a41cc..8a271ee 100644 --- a/SmartcardCCID.plist +++ b/SmartcardCCID.plist @@ -6,36 +6,46 @@ OpenSourceProject ccid OpenSourceVersion - 1.3.11 + 1.4.14 OpenSourceWebsiteURL - http://alioth.debian.org/frs/?group_id=30105&release_id=1192 + http://pcsclite.alioth.debian.org/ccid.html OpenSourceURL - http://alioth.debian.org/frs/download.php/3080/ccid-1.3.11.tar.bz2 + https://alioth.debian.org/frs/download.php/file/3971/ccid-1.4.14.tar.bz2 OpenSourceImportDate - 2010-04-13 + 2013-12-10 + OpenSourceModifications + + destDirFix.patch - makefile.in, customized destination directory + ForceWithoutPcsc.patch - Makefile.am, Makefile.in, define PROVIDED_BY_PCSC + ccid-info-plist.patch - Info.plist.src, ifdLogLevel 0x0001 + osxConfigure.patch - configure, if [[ ("$*" =~ "--no-configure") ]]; then exit 0 fi + scardcontrol.c.patch - scardcontrol.c, fix formating string warnings + RSA_SecurID_getpasswd.c.patch - RSA_SecurID_getpasswd.c, fix formating string warnings + OpenSourceLicense - GPL + LGPL OpenSourceLicenseFile - ccid.txt + SmartcardCCID.txt - OpenSourceProject - libusb - OpenSourceVersion - 0.1.13b - OpenSourceWebsiteURL - http://www.ellert.se/twain-sane/ - OpenSourceURL - http://www.ellert.se/PKGS/libusb-2008-02-02/src/libusb-2008-02-02-svn-macosx.tar.gz - OpenSourceImportDate - 2008-07-22 - OpenSourceModifications - - - OpenSourceLicense - LGPL - OpenSourceLicenseFile - libusb.txt + OpenSourceProject + libusb + OpenSourceVersion + 1.0.9 + OpenSourceWebsiteURL + http://www.libusb.org + OpenSourceURL + http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.9/libusb-1.0.9.tar.bz2/download + OpenSourceImportDate + 2013-12-10 + OpenSourceModifications + + darwin_no_seize.patch - darwin.c, replace USBDeviceOpenSeize by USBDeviceOpen + + OpenSourceLicense + LGPL + OpenSourceLicenseFile + SmartcardCCID.txt diff --git a/ccid/Makefile b/ccid/Makefile index bca6c3b..91e62cc 100644 --- a/ccid/Makefile +++ b/ccid/Makefile @@ -3,10 +3,10 @@ UserType = Administrator ToolType = Commands GnuAfterInstall = post-install Extra_Configure_Flags = --enable-usbdropdir=/usr/libexec/SmartCardServices/drivers \ - PCSC_CFLAGS="-I$(SRCROOT)/ccid/MacOSX -DRESPONSECODE_DEFINED_IN_WINTYPES_H" \ + PCSC_CFLAGS="-I$(SRCROOT)/ccid/MacOSX -DRESPONSECODE_DEFINED_IN_WINTYPES_H -DUSE_COMPOSITE_AS_MULTISLOT" \ PCSC_LIBS="-framework PCSC" \ - LIBUSB_CFLAGS="-I$(DSTROOT)/usr/include" \ - LIBUSB_LIBS="-L$(DSTROOT)/usr/lib -lusb -framework IOKit -framework CoreFoundation" + LIBUSB_CFLAGS="-I$(DSTROOT)/usr/include/libusb-1.0" \ + LIBUSB_LIBS="-L$(DSTROOT)/usr/lib -lusb-1.0 -framework IOKit -framework CoreFoundation -framework Foundation" Extra_Environment = @@ -20,14 +20,16 @@ post-install: find $(DSTROOT)/ -name '*.dylib*' -exec strip -S \{\} \; find $(DSTROOT)/ -name 'libusb*' -exec rm \{\} \; find $(DSTROOT)/ -name 'usb*.h' -exec rm \{\} \; + rm -r $(DSTROOT)/usr/include + rm -r $(DSTROOT)/usr/lib # Automatic Extract & Patch AEP_Project = ccid -AEP_Version = 1.3.11 +AEP_Version = 1.4.14 AEP_ProjVers = $(AEP_Project)-$(AEP_Version) AEP_Filename = $(AEP_ProjVers).tar.bz2 AEP_ExtractDir = $(AEP_ProjVers) -AEP_Patches = destDirFix.patch ForceWithoutPcsc.patch ccid-info-plist.patch osxConfigure.patch # ccid-info-plist.patch ForceWithoutPcsc.patch destDirFix.patch +AEP_Patches = destDirFix.patch ForceWithoutPcsc.patch ccid-info-plist.patch osxConfigure.patch scardcontrol.c.patch RSA_SecurID_getpasswd.c.patch # Extract the source. install_source:: @@ -37,5 +39,5 @@ install_source:: for patchfile in $(AEP_Patches); do \ (cd $(SRCROOT)/$(Project) && patch -p0 < $(SRCROOT)/files/$$patchfile) || exit 1; \ done - (cd $(SRCROOT)/$(Project) && MacOSX/configure --no-configure --disable-opensc --disable-pcsclite) + (cd $(SRCROOT)/$(Project) && MacOSX/configure --no-configure) diff --git a/ccid/ccid-1.4.14.tar.bz2 b/ccid/ccid-1.4.14.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cf4793f43ba392a2f1d8390c8b93a05654c5d0cf GIT binary patch literal 484659 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%0DnF#VDYV#7pvE~YEf_*31~U?l9JovOz!5(r*?M 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 p195(Ty8#De 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%0AecYTbY%s%PtbGd_fo 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
?s~FL(RJar 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 z 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

^>> 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

johannes@erdfelt.com
- - - - - 0.3 - June 28, 2002 - jerdfelt - More cleanups. Add the rest of the API and clean up some places. Add some examples. Hopefully, this should document the entire 0.1 API now. - - - - 0.2 - June 11, 2002 - jerdfelt - Cleanup, update for all of the changes that have happened in the last couple of months. - - - - 0.1 - August 26, 2001 - jerdfelt - First stab. - - - - - libusb - - - - - Preface - - - This document's purpose is to explain the API for libusb and how to use it to make a &usb; aware application - Any suggestions, corrections and comments regarding this document can be sent to the author: Johannes Erdfelt or the libusb developers mailing list. - - - - -&intro; - - - -&api; - - - -&functions; - - - -&examples; - - diff --git a/libusb/libusb/doc/website.dsl b/libusb/libusb/doc/website.dsl deleted file mode 100644 index 5dc51bc..0000000 --- a/libusb/libusb/doc/website.dsl +++ /dev/null @@ -1,197 +0,0 @@ - -]> - - - - - - - ;; ============================== -;; customize the print stylesheet -;; ============================== - -(declare-characteristic preserve-sdata? - ;; this is necessary because right now jadetex does not understand - ;; symbolic entities, whereas things work well with numeric entities. - "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" - #f) - -(define %generate-article-toc% - ;; Should a Table of Contents be produced for Articles? - #t) - -(define (toc-depth nd) - 2) - -(define %generate-article-titlepage-on-separate-page% - ;; Should the article title page be on a separate page? - #t) - -(define %section-autolabel% - ;; Are sections enumerated? - #t) - -(define %footnote-ulinks% - ;; Generate footnotes for ULinks? - #f) - -(define %bop-footnotes% - ;; Make "bottom-of-page" footnotes? - #f) - -(define %body-start-indent% - ;; Default indent of body text - 0pi) - -(define %para-indent-firstpara% - ;; First line start-indent for the first paragraph - 0pt) - -(define %para-indent% - ;; First line start-indent for paragraphs (other than the first) - 0pt) - -(define %block-start-indent% - ;; Extra start-indent for block-elements - 0pt) - -(define formal-object-float - ;; Do formal objects float? - #t) - -(define %hyphenation% - ;; Allow automatic hyphenation? - #t) - -(define %admon-graphics% - ;; Use graphics in admonitions? - #f) - - - - - - - - - - - - -;; ========================= -;; Indexes - -;; Returns the depth of the auto-generated TOC (table of contents) that -;; should be made at the nd-level -(define (toc-depth nd) - (if (string=? (gi nd) "book") - 2 ; the depth of the top-level TOC - 2 ; the depth of all other TOCs - )) - -(define %page-n-columns% - ;; Sets the number of columns on each page - 2) - -(define %generate-article-toc% - #t) - - -(define %header-navigation% - #t) - -(define %footer-navigation% - #t) - -(define %gentext-nav-use-tables% - #t) - -(define %gentext-nav-tblwidth% - "100%") - - -(define %indent-programlisting-lines% - " ") - -(define %indent-screen-lines% - " ") - -(define %shade-verbatim% - #t) - -(define ($shade-verbatim-attr$) - (list - (list "BORDER" "0") - (list "BGCOLOR" "#E0E0E0") - (list "WIDTH" ($table-width$)))) - -(define %callout-default-col% - 70) - -(define biblio-number - #t) - -(define %graphic-default-extension% - "jpg") - -(define %graphic-extensions% - '("gif" "jpg" "jpeg" "png" "tif" "tiff" "eps" "epsf")) - -(define %stylesheet% - "/base.css") - -(define %stylesheet-type% - "text/css") - -(define %use-id-as-filename% - #t) - -(define use-output-dir - #t) - -(define %output-dir% - "html") - -(define %html-ext% - ".html") - -(define %root-filename% - "index") - -(define %html-use-lang-in-filename% - #f) - -(define %html40% - #t) - -(define %fix-para-wrappers% - #t) - -(define %section-autolabel% - #t) - -(define (chunk-skip-first-element-list) - '()) - - - - - - - - diff --git a/libusb/libusb/error.c b/libusb/libusb/error.c deleted file mode 100644 index f7d496d..0000000 --- a/libusb/libusb/error.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * USB Error messages - * - * Copyright (c) 2000-2001 Johannes Erdfelt - * - * This library is covered by the LGPL, read LICENSE for details. - */ - -#include -#include - -#include "usb.h" -#include "error.h" - -char usb_error_str[1024] = ""; -int usb_error_errno = 0; -usb_error_type_t usb_error_type = USB_ERROR_TYPE_NONE; - -char *usb_strerror(void) -{ - switch (usb_error_type) { - case USB_ERROR_TYPE_NONE: - return "No error"; - case USB_ERROR_TYPE_STRING: - return usb_error_str; - case USB_ERROR_TYPE_ERRNO: - if (usb_error_errno > -USB_ERROR_BEGIN) - return strerror(usb_error_errno); - else - /* Any error we don't know falls under here */ - return "Unknown error"; - } - - return "Unknown error"; -} - diff --git a/libusb/libusb/error.h b/libusb/libusb/error.h deleted file mode 100644 index 173e6fd..0000000 --- a/libusb/libusb/error.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _ERROR_H_ -#define _ERROR_H_ - -typedef enum { - USB_ERROR_TYPE_NONE = 0, - USB_ERROR_TYPE_STRING, - USB_ERROR_TYPE_ERRNO, -} usb_error_type_t; - -extern char usb_error_str[1024]; -extern int usb_error_errno; -extern usb_error_type_t usb_error_type; - -#define USB_ERROR(x) \ - do { \ - usb_error_type = USB_ERROR_TYPE_ERRNO; \ - usb_error_errno = x; \ - return x; \ - } while (0) - -#define USB_ERROR_STR(x, format, args...) \ - do { \ - usb_error_type = USB_ERROR_TYPE_STRING; \ - snprintf(usb_error_str, sizeof(usb_error_str) - 1, format, ## args); \ - if (usb_debug >= 2) \ - fprintf(stderr, "USB error: %s\n", usb_error_str); \ - return x; \ - } while (0) - -#endif /* _ERROR_H_ */ - diff --git a/libusb/libusb/examples/Makefile.am b/libusb/libusb/examples/Makefile.am new file mode 100644 index 0000000..c7630d2 --- /dev/null +++ b/libusb/libusb/examples/Makefile.am @@ -0,0 +1,21 @@ +INCLUDES = -I$(top_srcdir)/libusb +noinst_PROGRAMS = listdevs + +listdevs_SOURCES = listdevs.c +listdevs_LDADD = ../libusb/libusb-1.0.la + +if HAVE_SIGACTION +dpfp_SOURCES = dpfp.c +dpfp_LDADD = ../libusb/libusb-1.0.la +noinst_PROGRAMS += dpfp +endif + +if THREADS_POSIX +if HAVE_SIGACTION +dpfp_threaded_SOURCES = dpfp_threaded.c +dpfp_threaded_CFLAGS = $(THREAD_CFLAGS) $(AM_CFLAGS) +dpfp_threaded_LDADD = ../libusb/libusb-1.0.la +noinst_PROGRAMS += dpfp_threaded +endif +endif + diff --git a/libusb/libusb/examples/Makefile.in b/libusb/libusb/examples/Makefile.in new file mode 100644 index 0000000..b9bf469 --- /dev/null +++ b/libusb/libusb/examples/Makefile.in @@ -0,0 +1,542 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = listdevs$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) +@HAVE_SIGACTION_TRUE@am__append_1 = dpfp +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@am__append_2 = dpfp_threaded +subdir = examples +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/libusb/version.h \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@HAVE_SIGACTION_TRUE@am__EXEEXT_1 = dpfp$(EXEEXT) +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@am__EXEEXT_2 = dpfp_threaded$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am__dpfp_SOURCES_DIST = dpfp.c +@HAVE_SIGACTION_TRUE@am_dpfp_OBJECTS = dpfp.$(OBJEXT) +dpfp_OBJECTS = $(am_dpfp_OBJECTS) +@HAVE_SIGACTION_TRUE@dpfp_DEPENDENCIES = ../libusb/libusb-1.0.la +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__dpfp_threaded_SOURCES_DIST = dpfp_threaded.c +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@am_dpfp_threaded_OBJECTS = dpfp_threaded-dpfp_threaded.$(OBJEXT) +dpfp_threaded_OBJECTS = $(am_dpfp_threaded_OBJECTS) +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@dpfp_threaded_DEPENDENCIES = ../libusb/libusb-1.0.la +dpfp_threaded_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dpfp_threaded_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_listdevs_OBJECTS = listdevs.$(OBJEXT) +listdevs_OBJECTS = $(am_listdevs_OBJECTS) +listdevs_DEPENDENCIES = ../libusb/libusb-1.0.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(dpfp_SOURCES) $(dpfp_threaded_SOURCES) $(listdevs_SOURCES) +DIST_SOURCES = $(am__dpfp_SOURCES_DIST) \ + $(am__dpfp_threaded_SOURCES_DIST) $(listdevs_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLDFLAGS = @LTLDFLAGS@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OS_DARWIN = @OS_DARWIN@ +OS_LINUX = @OS_LINUX@ +OS_OPENBSD = @OS_OPENBSD@ +OS_WINDOWS = @OS_WINDOWS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_LIBS_PRIVATE = @PC_LIBS_PRIVATE@ +RANLIB = @RANLIB@ +RC = @RC@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +THREAD_CFLAGS = @THREAD_CFLAGS@ +VERSION = @VERSION@ +VISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_srcdir)/libusb +listdevs_SOURCES = listdevs.c +listdevs_LDADD = ../libusb/libusb-1.0.la +@HAVE_SIGACTION_TRUE@dpfp_SOURCES = dpfp.c +@HAVE_SIGACTION_TRUE@dpfp_LDADD = ../libusb/libusb-1.0.la +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@dpfp_threaded_SOURCES = dpfp_threaded.c +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@dpfp_threaded_CFLAGS = $(THREAD_CFLAGS) $(AM_CFLAGS) +@HAVE_SIGACTION_TRUE@@THREADS_POSIX_TRUE@dpfp_threaded_LDADD = ../libusb/libusb-1.0.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +dpfp$(EXEEXT): $(dpfp_OBJECTS) $(dpfp_DEPENDENCIES) + @rm -f dpfp$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dpfp_OBJECTS) $(dpfp_LDADD) $(LIBS) +dpfp_threaded$(EXEEXT): $(dpfp_threaded_OBJECTS) $(dpfp_threaded_DEPENDENCIES) + @rm -f dpfp_threaded$(EXEEXT) + $(AM_V_CCLD)$(dpfp_threaded_LINK) $(dpfp_threaded_OBJECTS) $(dpfp_threaded_LDADD) $(LIBS) +listdevs$(EXEEXT): $(listdevs_OBJECTS) $(listdevs_DEPENDENCIES) + @rm -f listdevs$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(listdevs_OBJECTS) $(listdevs_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dpfp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dpfp_threaded-dpfp_threaded.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listdevs.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +dpfp_threaded-dpfp_threaded.o: dpfp_threaded.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpfp_threaded_CFLAGS) $(CFLAGS) -MT dpfp_threaded-dpfp_threaded.o -MD -MP -MF $(DEPDIR)/dpfp_threaded-dpfp_threaded.Tpo -c -o dpfp_threaded-dpfp_threaded.o `test -f 'dpfp_threaded.c' || echo '$(srcdir)/'`dpfp_threaded.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dpfp_threaded-dpfp_threaded.Tpo $(DEPDIR)/dpfp_threaded-dpfp_threaded.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpfp_threaded.c' object='dpfp_threaded-dpfp_threaded.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpfp_threaded_CFLAGS) $(CFLAGS) -c -o dpfp_threaded-dpfp_threaded.o `test -f 'dpfp_threaded.c' || echo '$(srcdir)/'`dpfp_threaded.c + +dpfp_threaded-dpfp_threaded.obj: dpfp_threaded.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpfp_threaded_CFLAGS) $(CFLAGS) -MT dpfp_threaded-dpfp_threaded.obj -MD -MP -MF $(DEPDIR)/dpfp_threaded-dpfp_threaded.Tpo -c -o dpfp_threaded-dpfp_threaded.obj `if test -f 'dpfp_threaded.c'; then $(CYGPATH_W) 'dpfp_threaded.c'; else $(CYGPATH_W) '$(srcdir)/dpfp_threaded.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dpfp_threaded-dpfp_threaded.Tpo $(DEPDIR)/dpfp_threaded-dpfp_threaded.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpfp_threaded.c' object='dpfp_threaded-dpfp_threaded.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpfp_threaded_CFLAGS) $(CFLAGS) -c -o dpfp_threaded-dpfp_threaded.obj `if test -f 'dpfp_threaded.c'; then $(CYGPATH_W) 'dpfp_threaded.c'; else $(CYGPATH_W) '$(srcdir)/dpfp_threaded.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libusb/libusb/examples/dpfp.c b/libusb/libusb/examples/dpfp.c new file mode 100644 index 0000000..ecd5a92 --- /dev/null +++ b/libusb/libusb/examples/dpfp.c @@ -0,0 +1,507 @@ +/* + * libusb example program to manipulate U.are.U 4000B fingerprint scanner. + * Copyright (C) 2007 Daniel Drake + * + * Basic image capture program only, does not consider the powerup quirks or + * the fact that image encryption may be enabled. Not expected to work + * flawlessly all of the time. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +#include + +#define EP_INTR (1 | LIBUSB_ENDPOINT_IN) +#define EP_DATA (2 | LIBUSB_ENDPOINT_IN) +#define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN) +#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT) +#define USB_RQ 0x04 +#define INTR_LENGTH 64 + +enum { + MODE_INIT = 0x00, + MODE_AWAIT_FINGER_ON = 0x10, + MODE_AWAIT_FINGER_OFF = 0x12, + MODE_CAPTURE = 0x20, + MODE_SHUT_UP = 0x30, + MODE_READY = 0x80, +}; + +static int next_state(void); + +enum { + STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON = 1, + STATE_AWAIT_IRQ_FINGER_DETECTED, + STATE_AWAIT_MODE_CHANGE_CAPTURE, + STATE_AWAIT_IMAGE, + STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF, + STATE_AWAIT_IRQ_FINGER_REMOVED, +}; + +static int state = 0; +static struct libusb_device_handle *devh = NULL; +static unsigned char imgbuf[0x1b340]; +static unsigned char irqbuf[INTR_LENGTH]; +static struct libusb_transfer *img_transfer = NULL; +static struct libusb_transfer *irq_transfer = NULL; +static int img_idx = 0; +static int do_exit = 0; + +static int find_dpfp_device(void) +{ + devh = libusb_open_device_with_vid_pid(NULL, 0x05ba, 0x000a); + return devh ? 0 : -EIO; +} + +static int print_f0_data(void) +{ + unsigned char data[0x10]; + int r; + unsigned int i; + + r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0xf0, 0, data, + sizeof(data), 0); + if (r < 0) { + fprintf(stderr, "F0 error %d\n", r); + return r; + } + if ((unsigned int) r < sizeof(data)) { + fprintf(stderr, "short read (%d)\n", r); + return -1; + } + + printf("F0 data:"); + for (i = 0; i < sizeof(data); i++) + printf("%02x ", data[i]); + printf("\n"); + return 0; +} + +static int get_hwstat(unsigned char *status) +{ + int r; + + r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0x07, 0, status, 1, 0); + if (r < 0) { + fprintf(stderr, "read hwstat error %d\n", r); + return r; + } + if ((unsigned int) r < 1) { + fprintf(stderr, "short read (%d)\n", r); + return -1; + } + + printf("hwstat reads %02x\n", *status); + return 0; +} + +static int set_hwstat(unsigned char data) +{ + int r; + + printf("set hwstat to %02x\n", data); + r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x07, 0, &data, 1, 0); + if (r < 0) { + fprintf(stderr, "set hwstat error %d\n", r); + return r; + } + if ((unsigned int) r < 1) { + fprintf(stderr, "short write (%d)", r); + return -1; + } + + return 0; +} + +static int set_mode(unsigned char data) +{ + int r; + printf("set mode %02x\n", data); + + r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x4e, 0, &data, 1, 0); + if (r < 0) { + fprintf(stderr, "set mode error %d\n", r); + return r; + } + if ((unsigned int) r < 1) { + fprintf(stderr, "short write (%d)", r); + return -1; + } + + return 0; +} + +static void LIBUSB_CALL cb_mode_changed(struct libusb_transfer *transfer) +{ + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "mode change transfer not completed!\n"); + do_exit = 2; + } + + printf("async cb_mode_changed length=%d actual_length=%d\n", + transfer->length, transfer->actual_length); + if (next_state() < 0) + do_exit = 2; +} + +static int set_mode_async(unsigned char data) +{ + unsigned char *buf = malloc(LIBUSB_CONTROL_SETUP_SIZE + 1); + struct libusb_transfer *transfer; + + if (!buf) + return -ENOMEM; + + transfer = libusb_alloc_transfer(0); + if (!transfer) { + free(buf); + return -ENOMEM; + } + + printf("async set mode %02x\n", data); + libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1); + buf[LIBUSB_CONTROL_SETUP_SIZE] = data; + libusb_fill_control_transfer(transfer, devh, buf, cb_mode_changed, NULL, + 1000); + + transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK + | LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; + return libusb_submit_transfer(transfer); +} + +static int do_sync_intr(unsigned char *data) +{ + int r; + int transferred; + + r = libusb_interrupt_transfer(devh, EP_INTR, data, INTR_LENGTH, + &transferred, 1000); + if (r < 0) { + fprintf(stderr, "intr error %d\n", r); + return r; + } + if (transferred < INTR_LENGTH) { + fprintf(stderr, "short read (%d)\n", r); + return -1; + } + + printf("recv interrupt %04x\n", *((uint16_t *) data)); + return 0; +} + +static int sync_intr(unsigned char type) +{ + int r; + unsigned char data[INTR_LENGTH]; + + while (1) { + r = do_sync_intr(data); + if (r < 0) + return r; + if (data[0] == type) + return 0; + } +} + +static int save_to_file(unsigned char *data) +{ + FILE *fd; + char filename[64]; + + snprintf(filename, sizeof(filename), "finger%d.pgm", img_idx++); + fd = fopen(filename, "w"); + if (!fd) + return -1; + + fputs("P5 384 289 255 ", fd); + (void) fwrite(data + 64, 1, 384*289, fd); + fclose(fd); + printf("saved image to %s\n", filename); + return 0; +} + +static int next_state(void) +{ + int r = 0; + printf("old state: %d\n", state); + switch (state) { + case STATE_AWAIT_IRQ_FINGER_REMOVED: + state = STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON; + r = set_mode_async(MODE_AWAIT_FINGER_ON); + break; + case STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON: + state = STATE_AWAIT_IRQ_FINGER_DETECTED; + break; + case STATE_AWAIT_IRQ_FINGER_DETECTED: + state = STATE_AWAIT_MODE_CHANGE_CAPTURE; + r = set_mode_async(MODE_CAPTURE); + break; + case STATE_AWAIT_MODE_CHANGE_CAPTURE: + state = STATE_AWAIT_IMAGE; + break; + case STATE_AWAIT_IMAGE: + state = STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF; + r = set_mode_async(MODE_AWAIT_FINGER_OFF); + break; + case STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF: + state = STATE_AWAIT_IRQ_FINGER_REMOVED; + break; + default: + printf("unrecognised state %d\n", state); + } + if (r < 0) { + fprintf(stderr, "error detected changing state\n"); + return r; + } + + printf("new state: %d\n", state); + return 0; +} + +static void LIBUSB_CALL cb_irq(struct libusb_transfer *transfer) +{ + unsigned char irqtype = transfer->buffer[0]; + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "irq transfer status %d?\n", transfer->status); + do_exit = 2; + libusb_free_transfer(transfer); + irq_transfer = NULL; + return; + } + + printf("IRQ callback %02x\n", irqtype); + switch (state) { + case STATE_AWAIT_IRQ_FINGER_DETECTED: + if (irqtype == 0x01) { + if (next_state() < 0) { + do_exit = 2; + return; + } + } else { + printf("finger-on-sensor detected in wrong state!\n"); + } + break; + case STATE_AWAIT_IRQ_FINGER_REMOVED: + if (irqtype == 0x02) { + if (next_state() < 0) { + do_exit = 2; + return; + } + } else { + printf("finger-on-sensor detected in wrong state!\n"); + } + break; + } + if (libusb_submit_transfer(irq_transfer) < 0) + do_exit = 2; +} + +static void LIBUSB_CALL cb_img(struct libusb_transfer *transfer) +{ + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "img transfer status %d?\n", transfer->status); + do_exit = 2; + libusb_free_transfer(transfer); + img_transfer = NULL; + return; + } + + printf("Image callback\n"); + save_to_file(imgbuf); + if (next_state() < 0) { + do_exit = 2; + return; + } + if (libusb_submit_transfer(img_transfer) < 0) + do_exit = 2; +} + +static int init_capture(void) +{ + int r; + + r = libusb_submit_transfer(irq_transfer); + if (r < 0) + return r; + + r = libusb_submit_transfer(img_transfer); + if (r < 0) { + libusb_cancel_transfer(irq_transfer); + while (irq_transfer) + if (libusb_handle_events(NULL) < 0) + break; + return r; + } + + /* start state machine */ + state = STATE_AWAIT_IRQ_FINGER_REMOVED; + return next_state(); +} + +static int do_init(void) +{ + unsigned char status; + int r; + + r = get_hwstat(&status); + if (r < 0) + return r; + + if (!(status & 0x80)) { + r = set_hwstat(status | 0x80); + if (r < 0) + return r; + r = get_hwstat(&status); + if (r < 0) + return r; + } + + status &= ~0x80; + r = set_hwstat(status); + if (r < 0) + return r; + + r = get_hwstat(&status); + if (r < 0) + return r; + + r = sync_intr(0x56); + if (r < 0) + return r; + + return 0; +} + +static int alloc_transfers(void) +{ + img_transfer = libusb_alloc_transfer(0); + if (!img_transfer) + return -ENOMEM; + + irq_transfer = libusb_alloc_transfer(0); + if (!irq_transfer) + return -ENOMEM; + + libusb_fill_bulk_transfer(img_transfer, devh, EP_DATA, imgbuf, + sizeof(imgbuf), cb_img, NULL, 0); + libusb_fill_interrupt_transfer(irq_transfer, devh, EP_INTR, irqbuf, + sizeof(irqbuf), cb_irq, NULL, 0); + + return 0; +} + +static void sighandler(int signum) +{ + do_exit = 1; +} + +int main(void) +{ + struct sigaction sigact; + int r = 1; + + r = libusb_init(NULL); + if (r < 0) { + fprintf(stderr, "failed to initialise libusb\n"); + exit(1); + } + + r = find_dpfp_device(); + if (r < 0) { + fprintf(stderr, "Could not find/open device\n"); + goto out; + } + + r = libusb_claim_interface(devh, 0); + if (r < 0) { + fprintf(stderr, "usb_claim_interface error %d\n", r); + goto out; + } + printf("claimed interface\n"); + + r = print_f0_data(); + if (r < 0) + goto out_release; + + r = do_init(); + if (r < 0) + goto out_deinit; + + /* async from here onwards */ + + r = alloc_transfers(); + if (r < 0) + goto out_deinit; + + r = init_capture(); + if (r < 0) + goto out_deinit; + + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + + while (!do_exit) { + r = libusb_handle_events(NULL); + if (r < 0) + goto out_deinit; + } + + printf("shutting down...\n"); + + if (irq_transfer) { + r = libusb_cancel_transfer(irq_transfer); + if (r < 0) + goto out_deinit; + } + + if (img_transfer) { + r = libusb_cancel_transfer(img_transfer); + if (r < 0) + goto out_deinit; + } + + while (irq_transfer || img_transfer) + if (libusb_handle_events(NULL) < 0) + break; + + if (do_exit == 1) + r = 0; + else + r = 1; + +out_deinit: + libusb_free_transfer(img_transfer); + libusb_free_transfer(irq_transfer); + set_mode(0); + set_hwstat(0x80); +out_release: + libusb_release_interface(devh, 0); +out: + libusb_close(devh); + libusb_exit(NULL); + return r >= 0 ? r : -r; +} + diff --git a/libusb/libusb/examples/dpfp_threaded.c b/libusb/libusb/examples/dpfp_threaded.c new file mode 100644 index 0000000..93de9d7 --- /dev/null +++ b/libusb/libusb/examples/dpfp_threaded.c @@ -0,0 +1,545 @@ +/* + * libusb example program to manipulate U.are.U 4000B fingerprint scanner. + * Copyright (C) 2007 Daniel Drake + * + * Basic image capture program only, does not consider the powerup quirks or + * the fact that image encryption may be enabled. Not expected to work + * flawlessly all of the time. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include + +#include + +#define EP_INTR (1 | LIBUSB_ENDPOINT_IN) +#define EP_DATA (2 | LIBUSB_ENDPOINT_IN) +#define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN) +#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT) +#define USB_RQ 0x04 +#define INTR_LENGTH 64 + +enum { + MODE_INIT = 0x00, + MODE_AWAIT_FINGER_ON = 0x10, + MODE_AWAIT_FINGER_OFF = 0x12, + MODE_CAPTURE = 0x20, + MODE_SHUT_UP = 0x30, + MODE_READY = 0x80, +}; + +static int next_state(void); + +enum { + STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON = 1, + STATE_AWAIT_IRQ_FINGER_DETECTED, + STATE_AWAIT_MODE_CHANGE_CAPTURE, + STATE_AWAIT_IMAGE, + STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF, + STATE_AWAIT_IRQ_FINGER_REMOVED, +}; + +static int state = 0; +static struct libusb_device_handle *devh = NULL; +static unsigned char imgbuf[0x1b340]; +static unsigned char irqbuf[INTR_LENGTH]; +static struct libusb_transfer *img_transfer = NULL; +static struct libusb_transfer *irq_transfer = NULL; +static int img_idx = 0; +static int do_exit = 0; + +static pthread_t poll_thread; +static pthread_cond_t exit_cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t exit_cond_lock = PTHREAD_MUTEX_INITIALIZER; + +static void request_exit(int code) +{ + do_exit = code; + pthread_cond_signal(&exit_cond); +} + +static void *poll_thread_main(void *arg) +{ + int r = 0; + printf("poll thread running\n"); + + while (!do_exit) { + struct timeval tv = { 1, 0 }; + r = libusb_handle_events_timeout(NULL, &tv); + if (r < 0) { + request_exit(2); + break; + } + } + + printf("poll thread shutting down\n"); + return NULL; +} + +static int find_dpfp_device(void) +{ + devh = libusb_open_device_with_vid_pid(NULL, 0x05ba, 0x000a); + return devh ? 0 : -EIO; +} + +static int print_f0_data(void) +{ + unsigned char data[0x10]; + int r; + unsigned int i; + + r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0xf0, 0, data, + sizeof(data), 0); + if (r < 0) { + fprintf(stderr, "F0 error %d\n", r); + return r; + } + if ((unsigned int) r < sizeof(data)) { + fprintf(stderr, "short read (%d)\n", r); + return -1; + } + + printf("F0 data:"); + for (i = 0; i < sizeof(data); i++) + printf("%02x ", data[i]); + printf("\n"); + return 0; +} + +static int get_hwstat(unsigned char *status) +{ + int r; + + r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0x07, 0, status, 1, 0); + if (r < 0) { + fprintf(stderr, "read hwstat error %d\n", r); + return r; + } + if ((unsigned int) r < 1) { + fprintf(stderr, "short read (%d)\n", r); + return -1; + } + + printf("hwstat reads %02x\n", *status); + return 0; +} + +static int set_hwstat(unsigned char data) +{ + int r; + + printf("set hwstat to %02x\n", data); + r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x07, 0, &data, 1, 0); + if (r < 0) { + fprintf(stderr, "set hwstat error %d\n", r); + return r; + } + if ((unsigned int) r < 1) { + fprintf(stderr, "short write (%d)", r); + return -1; + } + + return 0; +} + +static int set_mode(unsigned char data) +{ + int r; + printf("set mode %02x\n", data); + + r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x4e, 0, &data, 1, 0); + if (r < 0) { + fprintf(stderr, "set mode error %d\n", r); + return r; + } + if ((unsigned int) r < 1) { + fprintf(stderr, "short write (%d)", r); + return -1; + } + + return 0; +} + +static void LIBUSB_CALL cb_mode_changed(struct libusb_transfer *transfer) +{ + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "mode change transfer not completed!\n"); + request_exit(2); + } + + printf("async cb_mode_changed length=%d actual_length=%d\n", + transfer->length, transfer->actual_length); + if (next_state() < 0) + request_exit(2); +} + +static int set_mode_async(unsigned char data) +{ + unsigned char *buf = malloc(LIBUSB_CONTROL_SETUP_SIZE + 1); + struct libusb_transfer *transfer; + + if (!buf) + return -ENOMEM; + + transfer = libusb_alloc_transfer(0); + if (!transfer) { + free(buf); + return -ENOMEM; + } + + printf("async set mode %02x\n", data); + libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1); + buf[LIBUSB_CONTROL_SETUP_SIZE] = data; + libusb_fill_control_transfer(transfer, devh, buf, cb_mode_changed, NULL, + 1000); + + transfer->flags = LIBUSB_TRANSFER_SHORT_NOT_OK + | LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; + return libusb_submit_transfer(transfer); +} + +static int do_sync_intr(unsigned char *data) +{ + int r; + int transferred; + + r = libusb_interrupt_transfer(devh, EP_INTR, data, INTR_LENGTH, + &transferred, 1000); + if (r < 0) { + fprintf(stderr, "intr error %d\n", r); + return r; + } + if (transferred < INTR_LENGTH) { + fprintf(stderr, "short read (%d)\n", r); + return -1; + } + + printf("recv interrupt %04x\n", *((uint16_t *) data)); + return 0; +} + +static int sync_intr(unsigned char type) +{ + int r; + unsigned char data[INTR_LENGTH]; + + while (1) { + r = do_sync_intr(data); + if (r < 0) + return r; + if (data[0] == type) + return 0; + } +} + +static int save_to_file(unsigned char *data) +{ + FILE *fd; + char filename[64]; + + snprintf(filename, sizeof(filename), "finger%d.pgm", img_idx++); + fd = fopen(filename, "w"); + if (!fd) + return -1; + + fputs("P5 384 289 255 ", fd); + (void) fwrite(data + 64, 1, 384*289, fd); + fclose(fd); + printf("saved image to %s\n", filename); + return 0; +} + +static int next_state(void) +{ + int r = 0; + printf("old state: %d\n", state); + switch (state) { + case STATE_AWAIT_IRQ_FINGER_REMOVED: + state = STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON; + r = set_mode_async(MODE_AWAIT_FINGER_ON); + break; + case STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON: + state = STATE_AWAIT_IRQ_FINGER_DETECTED; + break; + case STATE_AWAIT_IRQ_FINGER_DETECTED: + state = STATE_AWAIT_MODE_CHANGE_CAPTURE; + r = set_mode_async(MODE_CAPTURE); + break; + case STATE_AWAIT_MODE_CHANGE_CAPTURE: + state = STATE_AWAIT_IMAGE; + break; + case STATE_AWAIT_IMAGE: + state = STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF; + r = set_mode_async(MODE_AWAIT_FINGER_OFF); + break; + case STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF: + state = STATE_AWAIT_IRQ_FINGER_REMOVED; + break; + default: + printf("unrecognised state %d\n", state); + } + if (r < 0) { + fprintf(stderr, "error detected changing state\n"); + return r; + } + + printf("new state: %d\n", state); + return 0; +} + +static void LIBUSB_CALL cb_irq(struct libusb_transfer *transfer) +{ + unsigned char irqtype = transfer->buffer[0]; + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "irq transfer status %d?\n", transfer->status); + irq_transfer = NULL; + request_exit(2); + return; + } + + printf("IRQ callback %02x\n", irqtype); + switch (state) { + case STATE_AWAIT_IRQ_FINGER_DETECTED: + if (irqtype == 0x01) { + if (next_state() < 0) { + request_exit(2); + return; + } + } else { + printf("finger-on-sensor detected in wrong state!\n"); + } + break; + case STATE_AWAIT_IRQ_FINGER_REMOVED: + if (irqtype == 0x02) { + if (next_state() < 0) { + request_exit(2); + return; + } + } else { + printf("finger-on-sensor detected in wrong state!\n"); + } + break; + } + if (libusb_submit_transfer(irq_transfer) < 0) + request_exit(2); +} + +static void LIBUSB_CALL cb_img(struct libusb_transfer *transfer) +{ + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fprintf(stderr, "img transfer status %d?\n", transfer->status); + img_transfer = NULL; + request_exit(2); + return; + } + + printf("Image callback\n"); + save_to_file(imgbuf); + if (next_state() < 0) { + request_exit(2); + return; + } + if (libusb_submit_transfer(img_transfer) < 0) + request_exit(2); +} + +static int init_capture(void) +{ + int r; + + r = libusb_submit_transfer(irq_transfer); + if (r < 0) + return r; + + r = libusb_submit_transfer(img_transfer); + if (r < 0) { + libusb_cancel_transfer(irq_transfer); + while (irq_transfer) + if (libusb_handle_events(NULL) < 0) + break; + return r; + } + + /* start state machine */ + state = STATE_AWAIT_IRQ_FINGER_REMOVED; + return next_state(); +} + +static int do_init(void) +{ + unsigned char status; + int r; + + r = get_hwstat(&status); + if (r < 0) + return r; + + if (!(status & 0x80)) { + r = set_hwstat(status | 0x80); + if (r < 0) + return r; + r = get_hwstat(&status); + if (r < 0) + return r; + } + + status &= ~0x80; + r = set_hwstat(status); + if (r < 0) + return r; + + r = get_hwstat(&status); + if (r < 0) + return r; + + r = sync_intr(0x56); + if (r < 0) + return r; + + return 0; +} + +static int alloc_transfers(void) +{ + img_transfer = libusb_alloc_transfer(0); + if (!img_transfer) + return -ENOMEM; + + irq_transfer = libusb_alloc_transfer(0); + if (!irq_transfer) + return -ENOMEM; + + libusb_fill_bulk_transfer(img_transfer, devh, EP_DATA, imgbuf, + sizeof(imgbuf), cb_img, NULL, 0); + libusb_fill_interrupt_transfer(irq_transfer, devh, EP_INTR, irqbuf, + sizeof(irqbuf), cb_irq, NULL, 0); + + return 0; +} + +static void sighandler(int signum) +{ + request_exit(1); +} + +int main(void) +{ + struct sigaction sigact; + int r = 1; + + r = libusb_init(NULL); + if (r < 0) { + fprintf(stderr, "failed to initialise libusb\n"); + exit(1); + } + + r = find_dpfp_device(); + if (r < 0) { + fprintf(stderr, "Could not find/open device\n"); + goto out; + } + + r = libusb_claim_interface(devh, 0); + if (r < 0) { + fprintf(stderr, "usb_claim_interface error %d %s\n", r, strerror(-r)); + goto out; + } + printf("claimed interface\n"); + + r = print_f0_data(); + if (r < 0) + goto out_release; + + r = do_init(); + if (r < 0) + goto out_deinit; + + /* async from here onwards */ + + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + + r = pthread_create(&poll_thread, NULL, poll_thread_main, NULL); + if (r) + goto out_deinit; + + r = alloc_transfers(); + if (r < 0) { + request_exit(1); + pthread_join(poll_thread, NULL); + goto out_deinit; + } + + r = init_capture(); + if (r < 0) { + request_exit(1); + pthread_join(poll_thread, NULL); + goto out_deinit; + } + + while (!do_exit) { + pthread_mutex_lock(&exit_cond_lock); + pthread_cond_wait(&exit_cond, &exit_cond_lock); + pthread_mutex_unlock(&exit_cond_lock); + } + + printf("shutting down...\n"); + pthread_join(poll_thread, NULL); + + r = libusb_cancel_transfer(irq_transfer); + if (r < 0) { + request_exit(1); + goto out_deinit; + } + + r = libusb_cancel_transfer(img_transfer); + if (r < 0) { + request_exit(1); + goto out_deinit; + } + + while (img_transfer || irq_transfer) + if (libusb_handle_events(NULL) < 0) + break; + + if (do_exit == 1) + r = 0; + else + r = 1; + +out_deinit: + libusb_free_transfer(img_transfer); + libusb_free_transfer(irq_transfer); + set_mode(0); + set_hwstat(0x80); +out_release: + libusb_release_interface(devh, 0); +out: + libusb_close(devh); + libusb_exit(NULL); + return r >= 0 ? r : -r; +} + diff --git a/libusb/libusb/examples/listdevs.c b/libusb/libusb/examples/listdevs.c new file mode 100644 index 0000000..6ab8917 --- /dev/null +++ b/libusb/libusb/examples/listdevs.c @@ -0,0 +1,64 @@ +/* + * libusb example program to list devices on the bus + * Copyright (C) 2007 Daniel Drake + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include + +static void print_devs(libusb_device **devs) +{ + libusb_device *dev; + int i = 0; + + while ((dev = devs[i++]) != NULL) { + struct libusb_device_descriptor desc; + int r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) { + fprintf(stderr, "failed to get device descriptor"); + return; + } + + printf("%04x:%04x (bus %d, device %d)\n", + desc.idVendor, desc.idProduct, + libusb_get_bus_number(dev), libusb_get_device_address(dev)); + } +} + +int main(void) +{ + libusb_device **devs; + int r; + ssize_t cnt; + + r = libusb_init(NULL); + if (r < 0) + return r; + + cnt = libusb_get_device_list(NULL, &devs); + if (cnt < 0) + return (int) cnt; + + print_devs(devs); + libusb_free_device_list(devs, 1); + + libusb_exit(NULL); + return 0; +} + diff --git a/libusb/libusb/libusb-1.0.pc.in b/libusb/libusb/libusb-1.0.pc.in new file mode 100644 index 0000000..f26babc --- /dev/null +++ b/libusb/libusb/libusb-1.0.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libusb-1.0 +Description: C API for USB device access from Linux, Mac OS X, OpenBSD, NetBSD and Windows userspace +Version: @VERSION@ +Libs: -L${libdir} -lusb-1.0 +Libs.private: @PC_LIBS_PRIVATE@ +Cflags: -I${includedir}/libusb-1.0 + diff --git a/libusb/libusb/libusb-config.in b/libusb/libusb/libusb-config.in deleted file mode 100644 index de08e81..0000000 --- a/libusb/libusb/libusb-config.in +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -exec_prefix_set=no - -usage() -{ - cat <&2 -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo_prefix=yes - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo_exec_prefix=yes - ;; - --version) - echo @LIBUSB_VERSION@ - exit 0 - ;; - --cflags) - if test "@includedir@" != /usr/include ; then - includes="-I@includedir@" - fi - echo_cflags=yes - ;; - --libs) - echo_libs=yes - ;; - *) - usage 1 1>&2 - ;; - esac - shift -done - -if test "$echo_prefix" = "yes"; then - echo $prefix -fi -if test "$echo_exec_prefix" = "yes"; then - echo $exec_prefix -fi -if test "$echo_cflags" = "yes"; then - echo $includes -fi -if test "$echo_libs" = "yes"; then - echo -lusb @OSLIBS@ -fi diff --git a/libusb/libusb/libusb.pc.in b/libusb/libusb/libusb.pc.in deleted file mode 100644 index 6f434f9..0000000 --- a/libusb/libusb/libusb.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libusb -Description: USB access library -Version: @VERSION@ -Libs: -L${libdir} -lusb -Cflags: -I${includedir} - diff --git a/libusb/libusb/libusb.spec.in b/libusb/libusb/libusb.spec.in deleted file mode 100644 index f04cf0a..0000000 --- a/libusb/libusb/libusb.spec.in +++ /dev/null @@ -1,65 +0,0 @@ -# Note that this is NOT a relocatable package -%define ver @VERSION@ -%define RELEASE 1 -%define rel %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE} -%define prefix /usr - -Summary: Application access to USB devices -Name: libusb -Version: %ver -Release: %rel -License: LGPL -Group: Libraries -Source: ftp://ftp.libusb.sourceforge.net/pub/libusb/libusb-%{ver}.tar.gz -BuildRoot: /var/tmp/libusb-%{PACKAGE_VERSION}-root -URL: http://libusb.sourceforge.net - -%description -Provides a library for application access to USB devices. Development -libs and headers are in libusb-devel - -%package devel -Summary: Application USB device access library -Group: System Environment/Libraries - -%description devel -Static libraries and header files for the USB device access library - - -%changelog - -%prep -%setup - -%build -CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} -make - -%install -rm -rf $RPM_BUILD_ROOT - -make DESTDIR=$RPM_BUILD_ROOT install - -%clean -rm -rf $RPM_BUILD_ROOT - -%post -p /sbin/ldconfig - -%postun -p /sbin/ldconfig - -%files -%defattr(-, root, root) - -%doc AUTHORS COPYING LICENSE NEWS README -%{prefix}/lib/libusb-0.1.so.* -%{prefix}/lib/libusbpp-0.1.so.* - -%files devel -%defattr(-, root, root) - -%{prefix}/lib/*.so -%{prefix}/lib/*a -%{prefix}/include/* -%{prefix}/bin/* -%{prefix}/lib/pkgconfig/libusb.pc - diff --git a/libusb/libusb/libusb/Makefile.am b/libusb/libusb/libusb/Makefile.am new file mode 100644 index 0000000..3316ebc --- /dev/null +++ b/libusb/libusb/libusb/Makefile.am @@ -0,0 +1,49 @@ +lib_LTLIBRARIES = libusb-1.0.la + +LINUX_USBFS_SRC = os/linux_usbfs.c +DARWIN_USB_SRC = os/darwin_usb.c +OPENBSD_USB_SRC = os/openbsd_usb.c +WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc \ + libusb-1.0.def + +EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \ + $(WINDOWS_USB_SRC) os/threads_posix.c os/threads_windows.c + +if OS_LINUX +OS_SRC = $(LINUX_USBFS_SRC) +endif + +if OS_DARWIN +OS_SRC = $(DARWIN_USB_SRC) +AM_CFLAGS_EXT = -no-cpp-precomp +endif + +if OS_OPENBSD +OS_SRC = $(OPENBSD_USB_SRC) +endif + +if OS_WINDOWS +OS_SRC = $(WINDOWS_USB_SRC) + +.rc.lo: + $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@ + +libusb-1.0.rc: version.h +endif + +if THREADS_POSIX +THREADS_SRC = os/threads_posix.h os/threads_posix.c +else +THREADS_SRC = os/threads_windows.h os/threads_windows.c +endif + +libusb_1_0_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) $(THREAD_CFLAGS) \ + -DLIBUSB_DESCRIBE=\"`git --git-dir "$(top_srcdir)/.git" describe --tags 2>/dev/null`\" +libusb_1_0_la_LDFLAGS = $(LTLDFLAGS) +libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c sync.c $(OS_SRC) \ + os/linux_usbfs.h os/darwin_usb.h os/windows_usb.h \ + $(THREADS_SRC) \ + os/poll_posix.h os/poll_windows.h + +hdrdir = $(includedir)/libusb-1.0 +hdr_HEADERS = libusb.h diff --git a/libusb/libusb/libusb/Makefile.in b/libusb/libusb/libusb/Makefile.in new file mode 100644 index 0000000..193adae --- /dev/null +++ b/libusb/libusb/libusb/Makefile.in @@ -0,0 +1,718 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = libusb +DIST_COMMON = $(hdr_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/libusb/version.h \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hdrdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libusb_1_0_la_LIBADD = +am__libusb_1_0_la_SOURCES_DIST = libusbi.h core.c descriptor.c io.c \ + sync.c os/darwin_usb.c os/linux_usbfs.c os/openbsd_usb.c \ + os/poll_windows.c os/windows_usb.c libusb-1.0.rc \ + libusb-1.0.def os/linux_usbfs.h os/darwin_usb.h \ + os/windows_usb.h os/threads_windows.h os/threads_windows.c \ + os/threads_posix.h os/threads_posix.c os/poll_posix.h \ + os/poll_windows.h +am__objects_1 = libusb_1_0_la-darwin_usb.lo +am__objects_2 = libusb_1_0_la-linux_usbfs.lo +am__objects_3 = libusb_1_0_la-openbsd_usb.lo +am__objects_4 = libusb_1_0_la-poll_windows.lo \ + libusb_1_0_la-windows_usb.lo libusb-1.0.lo +@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_OPENBSD_FALSE@@OS_WINDOWS_TRUE@am__objects_5 = $(am__objects_4) +@OS_DARWIN_FALSE@@OS_LINUX_FALSE@@OS_OPENBSD_TRUE@am__objects_5 = $(am__objects_3) +@OS_DARWIN_FALSE@@OS_LINUX_TRUE@am__objects_5 = $(am__objects_2) +@OS_DARWIN_TRUE@am__objects_5 = $(am__objects_1) +@THREADS_POSIX_FALSE@am__objects_6 = libusb_1_0_la-threads_windows.lo +@THREADS_POSIX_TRUE@am__objects_6 = libusb_1_0_la-threads_posix.lo +am_libusb_1_0_la_OBJECTS = libusb_1_0_la-core.lo \ + libusb_1_0_la-descriptor.lo libusb_1_0_la-io.lo \ + libusb_1_0_la-sync.lo $(am__objects_5) $(am__objects_6) +libusb_1_0_la_OBJECTS = $(am_libusb_1_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libusb_1_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libusb_1_0_la_CFLAGS) \ + $(CFLAGS) $(libusb_1_0_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libusb_1_0_la_SOURCES) +DIST_SOURCES = $(am__libusb_1_0_la_SOURCES_DIST) +HEADERS = $(hdr_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLDFLAGS = @LTLDFLAGS@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OS_DARWIN = @OS_DARWIN@ +OS_LINUX = @OS_LINUX@ +OS_OPENBSD = @OS_OPENBSD@ +OS_WINDOWS = @OS_WINDOWS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_LIBS_PRIVATE = @PC_LIBS_PRIVATE@ +RANLIB = @RANLIB@ +RC = @RC@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +THREAD_CFLAGS = @THREAD_CFLAGS@ +VERSION = @VERSION@ +VISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +lib_LTLIBRARIES = libusb-1.0.la +LINUX_USBFS_SRC = os/linux_usbfs.c +DARWIN_USB_SRC = os/darwin_usb.c +OPENBSD_USB_SRC = os/openbsd_usb.c +WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc \ + libusb-1.0.def + +EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \ + $(WINDOWS_USB_SRC) os/threads_posix.c os/threads_windows.c + +@OS_DARWIN_TRUE@OS_SRC = $(DARWIN_USB_SRC) +@OS_LINUX_TRUE@OS_SRC = $(LINUX_USBFS_SRC) +@OS_OPENBSD_TRUE@OS_SRC = $(OPENBSD_USB_SRC) +@OS_WINDOWS_TRUE@OS_SRC = $(WINDOWS_USB_SRC) +@OS_DARWIN_TRUE@AM_CFLAGS_EXT = -no-cpp-precomp +@THREADS_POSIX_FALSE@THREADS_SRC = os/threads_windows.h os/threads_windows.c +@THREADS_POSIX_TRUE@THREADS_SRC = os/threads_posix.h os/threads_posix.c +libusb_1_0_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) $(THREAD_CFLAGS) \ + -DLIBUSB_DESCRIBE=\"`git --git-dir "$(top_srcdir)/.git" describe --tags 2>/dev/null`\" + +libusb_1_0_la_LDFLAGS = $(LTLDFLAGS) +libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c sync.c $(OS_SRC) \ + os/linux_usbfs.h os/darwin_usb.h os/windows_usb.h \ + $(THREADS_SRC) \ + os/poll_posix.h os/poll_windows.h + +hdrdir = $(includedir)/libusb-1.0 +hdr_HEADERS = libusb.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj .rc +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libusb/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu libusb/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libusb-1.0.la: $(libusb_1_0_la_OBJECTS) $(libusb_1_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libusb_1_0_la_LINK) -rpath $(libdir) $(libusb_1_0_la_OBJECTS) $(libusb_1_0_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-darwin_usb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-descriptor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-io.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-linux_usbfs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-openbsd_usb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-poll_windows.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-sync.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-threads_posix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-threads_windows.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libusb_1_0_la-windows_usb.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libusb_1_0_la-core.lo: core.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-core.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-core.Tpo -c -o libusb_1_0_la-core.lo `test -f 'core.c' || echo '$(srcdir)/'`core.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-core.Tpo $(DEPDIR)/libusb_1_0_la-core.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='core.c' object='libusb_1_0_la-core.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-core.lo `test -f 'core.c' || echo '$(srcdir)/'`core.c + +libusb_1_0_la-descriptor.lo: descriptor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-descriptor.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-descriptor.Tpo -c -o libusb_1_0_la-descriptor.lo `test -f 'descriptor.c' || echo '$(srcdir)/'`descriptor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-descriptor.Tpo $(DEPDIR)/libusb_1_0_la-descriptor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='descriptor.c' object='libusb_1_0_la-descriptor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-descriptor.lo `test -f 'descriptor.c' || echo '$(srcdir)/'`descriptor.c + +libusb_1_0_la-io.lo: io.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-io.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-io.Tpo -c -o libusb_1_0_la-io.lo `test -f 'io.c' || echo '$(srcdir)/'`io.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-io.Tpo $(DEPDIR)/libusb_1_0_la-io.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='io.c' object='libusb_1_0_la-io.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-io.lo `test -f 'io.c' || echo '$(srcdir)/'`io.c + +libusb_1_0_la-sync.lo: sync.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-sync.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-sync.Tpo -c -o libusb_1_0_la-sync.lo `test -f 'sync.c' || echo '$(srcdir)/'`sync.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-sync.Tpo $(DEPDIR)/libusb_1_0_la-sync.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sync.c' object='libusb_1_0_la-sync.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-sync.lo `test -f 'sync.c' || echo '$(srcdir)/'`sync.c + +libusb_1_0_la-darwin_usb.lo: os/darwin_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-darwin_usb.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-darwin_usb.Tpo -c -o libusb_1_0_la-darwin_usb.lo `test -f 'os/darwin_usb.c' || echo '$(srcdir)/'`os/darwin_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-darwin_usb.Tpo $(DEPDIR)/libusb_1_0_la-darwin_usb.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/darwin_usb.c' object='libusb_1_0_la-darwin_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-darwin_usb.lo `test -f 'os/darwin_usb.c' || echo '$(srcdir)/'`os/darwin_usb.c + +libusb_1_0_la-linux_usbfs.lo: os/linux_usbfs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-linux_usbfs.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-linux_usbfs.Tpo -c -o libusb_1_0_la-linux_usbfs.lo `test -f 'os/linux_usbfs.c' || echo '$(srcdir)/'`os/linux_usbfs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-linux_usbfs.Tpo $(DEPDIR)/libusb_1_0_la-linux_usbfs.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/linux_usbfs.c' object='libusb_1_0_la-linux_usbfs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-linux_usbfs.lo `test -f 'os/linux_usbfs.c' || echo '$(srcdir)/'`os/linux_usbfs.c + +libusb_1_0_la-openbsd_usb.lo: os/openbsd_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-openbsd_usb.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-openbsd_usb.Tpo -c -o libusb_1_0_la-openbsd_usb.lo `test -f 'os/openbsd_usb.c' || echo '$(srcdir)/'`os/openbsd_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-openbsd_usb.Tpo $(DEPDIR)/libusb_1_0_la-openbsd_usb.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/openbsd_usb.c' object='libusb_1_0_la-openbsd_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-openbsd_usb.lo `test -f 'os/openbsd_usb.c' || echo '$(srcdir)/'`os/openbsd_usb.c + +libusb_1_0_la-poll_windows.lo: os/poll_windows.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-poll_windows.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-poll_windows.Tpo -c -o libusb_1_0_la-poll_windows.lo `test -f 'os/poll_windows.c' || echo '$(srcdir)/'`os/poll_windows.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-poll_windows.Tpo $(DEPDIR)/libusb_1_0_la-poll_windows.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/poll_windows.c' object='libusb_1_0_la-poll_windows.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-poll_windows.lo `test -f 'os/poll_windows.c' || echo '$(srcdir)/'`os/poll_windows.c + +libusb_1_0_la-windows_usb.lo: os/windows_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-windows_usb.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-windows_usb.Tpo -c -o libusb_1_0_la-windows_usb.lo `test -f 'os/windows_usb.c' || echo '$(srcdir)/'`os/windows_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-windows_usb.Tpo $(DEPDIR)/libusb_1_0_la-windows_usb.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/windows_usb.c' object='libusb_1_0_la-windows_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-windows_usb.lo `test -f 'os/windows_usb.c' || echo '$(srcdir)/'`os/windows_usb.c + +libusb_1_0_la-threads_windows.lo: os/threads_windows.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-threads_windows.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-threads_windows.Tpo -c -o libusb_1_0_la-threads_windows.lo `test -f 'os/threads_windows.c' || echo '$(srcdir)/'`os/threads_windows.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-threads_windows.Tpo $(DEPDIR)/libusb_1_0_la-threads_windows.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/threads_windows.c' object='libusb_1_0_la-threads_windows.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-threads_windows.lo `test -f 'os/threads_windows.c' || echo '$(srcdir)/'`os/threads_windows.c + +libusb_1_0_la-threads_posix.lo: os/threads_posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -MT libusb_1_0_la-threads_posix.lo -MD -MP -MF $(DEPDIR)/libusb_1_0_la-threads_posix.Tpo -c -o libusb_1_0_la-threads_posix.lo `test -f 'os/threads_posix.c' || echo '$(srcdir)/'`os/threads_posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libusb_1_0_la-threads_posix.Tpo $(DEPDIR)/libusb_1_0_la-threads_posix.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='os/threads_posix.c' object='libusb_1_0_la-threads_posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libusb_1_0_la_CFLAGS) $(CFLAGS) -c -o libusb_1_0_la-threads_posix.lo `test -f 'os/threads_posix.c' || echo '$(srcdir)/'`os/threads_posix.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-hdrHEADERS: $(hdr_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(hdrdir)" || $(MKDIR_P) "$(DESTDIR)$(hdrdir)" + @list='$(hdr_HEADERS)'; test -n "$(hdrdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(hdrdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(hdrdir)" || exit $$?; \ + done + +uninstall-hdrHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(hdr_HEADERS)'; test -n "$(hdrdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(hdrdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(hdrdir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hdrdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-hdrHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-hdrHEADERS uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-hdrHEADERS \ + install-html install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-hdrHEADERS \ + uninstall-libLTLIBRARIES + + +@OS_WINDOWS_TRUE@.rc.lo: +@OS_WINDOWS_TRUE@ $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@ + +@OS_WINDOWS_TRUE@libusb-1.0.rc: version.h + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libusb/libusb/libusb/core.c b/libusb/libusb/libusb/core.c new file mode 100644 index 0000000..767dcbf --- /dev/null +++ b/libusb/libusb/libusb/core.c @@ -0,0 +1,1875 @@ +/* + * Core functions for libusb + * Copyright (C) 2007-2008 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#include "libusbi.h" + +#if defined(OS_LINUX) +const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; +#elif defined(OS_DARWIN) +const struct usbi_os_backend * const usbi_backend = &darwin_backend; +#elif defined(OS_OPENBSD) +const struct usbi_os_backend * const usbi_backend = &openbsd_backend; +#elif defined(OS_WINDOWS) +const struct usbi_os_backend * const usbi_backend = &windows_backend; +#else +#error "Unsupported OS" +#endif + +const struct libusb_version libusb_version_internal = { + LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO, LIBUSB_RC, + LIBUSB_DESCRIBE +}; + +struct libusb_context *usbi_default_context = NULL; +static int default_context_refcnt = 0; +static usbi_mutex_static_t default_context_lock = USBI_MUTEX_INITIALIZER; + +/** + * \mainpage libusb-1.0 API Reference + * + * \section intro Introduction + * + * libusb is an open source library that allows you to communicate with USB + * devices from userspace. For more info, see the + * libusb homepage. + * + * This documentation is aimed at application developers wishing to + * communicate with USB peripherals from their own software. After reviewing + * this documentation, feedback and questions can be sent to the + * libusb-devel mailing + * list. + * + * This documentation assumes knowledge of how to operate USB devices from + * a software standpoint (descriptors, configurations, interfaces, endpoints, + * control/bulk/interrupt/isochronous transfers, etc). Full information + * can be found in the USB 2.0 + * Specification which is available for free download. You can probably + * find less verbose introductions by searching the web. + * + * \section features Library features + * + * - All transfer types supported (control/bulk/interrupt/isochronous) + * - 2 transfer interfaces: + * -# Synchronous (simple) + * -# Asynchronous (more complicated, but more powerful) + * - Thread safe (although the asynchronous interface means that you + * usually won't need to thread) + * - Lightweight with lean API + * - Compatible with libusb-0.1 through the libusb-compat-0.1 translation layer + * + * \section gettingstarted Getting Started + * + * To begin reading the API documentation, start with the Modules page which + * links to the different categories of libusb's functionality. + * + * One decision you will have to make is whether to use the synchronous + * or the asynchronous data transfer interface. The \ref io documentation + * provides some insight into this topic. + * + * Some example programs can be found in the libusb source distribution under + * the "examples" subdirectory. The libusb homepage includes a list of + * real-life project examples which use libusb. + * + * \section errorhandling Error handling + * + * libusb functions typically return 0 on success or a negative error code + * on failure. These negative error codes relate to LIBUSB_ERROR constants + * which are listed on the \ref misc "miscellaneous" documentation page. + * + * \section msglog Debug message logging + * + * libusb does not log any messages by default. Your application is therefore + * free to close stdout/stderr and those descriptors may be reused without + * worry. + * + * The libusb_set_debug() function can be used to enable stdout/stderr logging + * of certain messages. Under standard configuration, libusb doesn't really + * log much at all, so you are advised to use this function to enable all + * error/warning/informational messages. It will help you debug problems with + * your software. + * + * The logged messages are unstructured. There is no one-to-one correspondence + * between messages being logged and success or failure return codes from + * libusb functions. There is no format to the messages, so you should not + * try to capture or parse them. They are not and will not be localized. + * These messages are not suitable for being passed to your application user; + * instead, you should interpret the error codes returned from libusb functions + * and provide appropriate notification to the user. The messages are simply + * there to aid you as a programmer, and if you're confused because you're + * getting a strange error code from a libusb function, enabling message + * logging may give you a suitable explanation. + * + * The LIBUSB_DEBUG environment variable can be used to enable message logging + * at run-time. This environment variable should be set to a number, which is + * interpreted the same as the libusb_set_debug() parameter. When this + * environment variable is set, the message logging verbosity level is fixed + * and libusb_set_debug() effectively does nothing. + * + * libusb can be compiled without any logging functions, useful for embedded + * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment + * variable have no effects. + * + * libusb can also be compiled with verbose debugging messages. When the + * library is compiled in this way, all messages of all verbosities are always + * logged. libusb_set_debug() and the LIBUSB_DEBUG environment variable have + * no effects. + * + * \section remarks Other remarks + * + * libusb does have imperfections. The \ref caveats "caveats" page attempts + * to document these. + */ + +/** + * \page caveats Caveats + * + * \section devresets Device resets + * + * The libusb_reset_device() function allows you to reset a device. If your + * program has to call such a function, it should obviously be aware that + * the reset will cause device state to change (e.g. register values may be + * reset). + * + * The problem is that any other program could reset the device your program + * is working with, at any time. libusb does not offer a mechanism to inform + * you when this has happened, so if someone else resets your device it will + * not be clear to your own program why the device state has changed. + * + * Ultimately, this is a limitation of writing drivers in userspace. + * Separation from the USB stack in the underlying kernel makes it difficult + * for the operating system to deliver such notifications to your program. + * The Linux kernel USB stack allows such reset notifications to be delivered + * to in-kernel USB drivers, but it is not clear how such notifications could + * be delivered to second-class drivers that live in userspace. + * + * \section blockonly Blocking-only functionality + * + * The functionality listed below is only available through synchronous, + * blocking functions. There are no asynchronous/non-blocking alternatives, + * and no clear ways of implementing these. + * + * - Configuration activation (libusb_set_configuration()) + * - Interface/alternate setting activation (libusb_set_interface_alt_setting()) + * - Releasing of interfaces (libusb_release_interface()) + * - Clearing of halt/stall condition (libusb_clear_halt()) + * - Device resets (libusb_reset_device()) + * + * \section nohotplug No hotplugging + * + * libusb-1.0 lacks functionality for providing notifications of when devices + * are added or removed. This functionality is planned to be implemented + * for libusb-1.1. + * + * That said, there is basic disconnection handling for open device handles: + * - If there are ongoing transfers, libusb's handle_events loop will detect + * disconnections and complete ongoing transfers with the + * LIBUSB_TRANSFER_NO_DEVICE status code. + * - Many functions such as libusb_set_configuration() return the special + * LIBUSB_ERROR_NO_DEVICE error code when the device has been disconnected. + * + * \section configsel Configuration selection and handling + * + * When libusb presents a device handle to an application, there is a chance + * that the corresponding device may be in unconfigured state. For devices + * with multiple configurations, there is also a chance that the configuration + * currently selected is not the one that the application wants to use. + * + * The obvious solution is to add a call to libusb_set_configuration() early + * on during your device initialization routines, but there are caveats to + * be aware of: + * -# If the device is already in the desired configuration, calling + * libusb_set_configuration() using the same configuration value will cause + * a lightweight device reset. This may not be desirable behaviour. + * -# libusb will be unable to change configuration if the device is in + * another configuration and other programs or drivers have claimed + * interfaces under that configuration. + * -# In the case where the desired configuration is already active, libusb + * may not even be able to perform a lightweight device reset. For example, + * take my USB keyboard with fingerprint reader: I'm interested in driving + * the fingerprint reader interface through libusb, but the kernel's + * USB-HID driver will almost always have claimed the keyboard interface. + * Because the kernel has claimed an interface, it is not even possible to + * perform the lightweight device reset, so libusb_set_configuration() will + * fail. (Luckily the device in question only has a single configuration.) + * + * One solution to some of the above problems is to consider the currently + * active configuration. If the configuration we want is already active, then + * we don't have to select any configuration: +\code +cfg = libusb_get_configuration(dev); +if (cfg != desired) + libusb_set_configuration(dev, desired); +\endcode + * + * This is probably suitable for most scenarios, but is inherently racy: + * another application or driver may change the selected configuration + * after the libusb_get_configuration() call. + * + * Even in cases where libusb_set_configuration() succeeds, consider that other + * applications or drivers may change configuration after your application + * calls libusb_set_configuration(). + * + * One possible way to lock your device into a specific configuration is as + * follows: + * -# Set the desired configuration (or use the logic above to realise that + * it is already in the desired configuration) + * -# Claim the interface that you wish to use + * -# Check that the currently active configuration is the one that you want + * to use. + * + * The above method works because once an interface is claimed, no application + * or driver is able to select another configuration. + * + * \section earlycomp Early transfer completion + * + * NOTE: This section is currently Linux-centric. I am not sure if any of these + * considerations apply to Darwin or other platforms. + * + * When a transfer completes early (i.e. when less data is received/sent in + * any one packet than the transfer buffer allows for) then libusb is designed + * to terminate the transfer immediately, not transferring or receiving any + * more data unless other transfers have been queued by the user. + * + * On legacy platforms, libusb is unable to do this in all situations. After + * the incomplete packet occurs, "surplus" data may be transferred. Prior to + * libusb v1.0.2, this information was lost (and for device-to-host transfers, + * the corresponding data was discarded). As of libusb v1.0.3, this information + * is kept (the data length of the transfer is updated) and, for device-to-host + * transfers, any surplus data was added to the buffer. Still, this is not + * a nice solution because it loses the information about the end of the short + * packet, and the user probably wanted that surplus data to arrive in the next + * logical transfer. + * + * A previous workaround was to only ever submit transfers of size 16kb or + * less. + * + * As of libusb v1.0.4 and Linux v2.6.32, this is fixed. A technical + * explanation of this issue follows. + * + * When you ask libusb to submit a bulk transfer larger than 16kb in size, + * libusb breaks it up into a number of smaller subtransfers. This is because + * the usbfs kernel interface only accepts transfers of up to 16kb in size. + * The subtransfers are submitted all at once so that the kernel can queue + * them at the hardware level, therefore maximizing bus throughput. + * + * On legacy platforms, this caused problems when transfers completed early. + * Upon this event, the kernel would terminate all further packets in that + * subtransfer (but not any following ones). libusb would note this event and + * immediately cancel any following subtransfers that had been queued, + * but often libusb was not fast enough, and the following subtransfers had + * started before libusb got around to cancelling them. + * + * Thanks to an API extension to usbfs, this is fixed with recent kernel and + * libusb releases. The solution was to allow libusb to communicate to the + * kernel where boundaries occur between logical libusb-level transfers. When + * a short transfer (or other error) occurs, the kernel will cancel all the + * subtransfers until the boundary without allowing those transfers to start. + * + * \section zlp Zero length packets + * + * - libusb is able to send a packet of zero length to an endpoint simply by + * submitting a transfer of zero length. On Linux, this did not work with + * libusb versions prior to 1.0.3 and kernel versions prior to 2.6.31. + * - The \ref libusb_transfer_flags::LIBUSB_TRANSFER_ADD_ZERO_PACKET + * "LIBUSB_TRANSFER_ADD_ZERO_PACKET" flag is currently only supported on Linux. + */ + +/** + * \page contexts Contexts + * + * It is possible that libusb may be used simultaneously from two independent + * libraries linked into the same executable. For example, if your application + * has a plugin-like system which allows the user to dynamically load a range + * of modules into your program, it is feasible that two independently + * developed modules may both use libusb. + * + * libusb is written to allow for these multiple user scenarios. The two + * "instances" of libusb will not interfere: libusb_set_debug() calls + * from one user will not affect the same settings for other users, other + * users can continue using libusb after one of them calls libusb_exit(), etc. + * + * This is made possible through libusb's context concept. When you + * call libusb_init(), you are (optionally) given a context. You can then pass + * this context pointer back into future libusb functions. + * + * In order to keep things simple for more simplistic applications, it is + * legal to pass NULL to all functions requiring a context pointer (as long as + * you're sure no other code will attempt to use libusb from the same process). + * When you pass NULL, the default context will be used. The default context + * is created the first time a process calls libusb_init() when no other + * context is alive. Contexts are destroyed during libusb_exit(). + * + * The default context is reference-counted and can be shared. That means that + * if libusb_init(NULL) is called twice within the same process, the two + * users end up sharing the same context. The deinitialization and freeing of + * the default context will only happen when the last user calls libusb_exit(). + * In other words, the default context is created and initialized when its + * reference count goes from 0 to 1, and is deinitialized and destroyed when + * its reference count goes from 1 to 0. + * + * You may be wondering why only a subset of libusb functions require a + * context pointer in their function definition. Internally, libusb stores + * context pointers in other objects (e.g. libusb_device instances) and hence + * can infer the context from those objects. + */ + +/** + * @defgroup lib Library initialization/deinitialization + * This page details how to initialize and deinitialize libusb. Initialization + * must be performed before using any libusb functionality, and similarly you + * must not call any libusb functions after deinitialization. + */ + +/** + * @defgroup dev Device handling and enumeration + * The functionality documented below is designed to help with the following + * operations: + * - Enumerating the USB devices currently attached to the system + * - Choosing a device to operate from your software + * - Opening and closing the chosen device + * + * \section nutshell In a nutshell... + * + * The description below really makes things sound more complicated than they + * actually are. The following sequence of function calls will be suitable + * for almost all scenarios and does not require you to have such a deep + * understanding of the resource management issues: + * \code +// discover devices +libusb_device **list; +libusb_device *found = NULL; +ssize_t cnt = libusb_get_device_list(NULL, &list); +ssize_t i = 0; +int err = 0; +if (cnt < 0) + error(); + +for (i = 0; i < cnt; i++) { + libusb_device *device = list[i]; + if (is_interesting(device)) { + found = device; + break; + } +} + +if (found) { + libusb_device_handle *handle; + + err = libusb_open(found, &handle); + if (err) + error(); + // etc +} + +libusb_free_device_list(list, 1); +\endcode + * + * The two important points: + * - You asked libusb_free_device_list() to unreference the devices (2nd + * parameter) + * - You opened the device before freeing the list and unreferencing the + * devices + * + * If you ended up with a handle, you can now proceed to perform I/O on the + * device. + * + * \section devshandles Devices and device handles + * libusb has a concept of a USB device, represented by the + * \ref libusb_device opaque type. A device represents a USB device that + * is currently or was previously connected to the system. Using a reference + * to a device, you can determine certain information about the device (e.g. + * you can read the descriptor data). + * + * The libusb_get_device_list() function can be used to obtain a list of + * devices currently connected to the system. This is known as device + * discovery. + * + * Just because you have a reference to a device does not mean it is + * necessarily usable. The device may have been unplugged, you may not have + * permission to operate such device, or another program or driver may be + * using the device. + * + * When you've found a device that you'd like to operate, you must ask + * libusb to open the device using the libusb_open() function. Assuming + * success, libusb then returns you a device handle + * (a \ref libusb_device_handle pointer). All "real" I/O operations then + * operate on the handle rather than the original device pointer. + * + * \section devref Device discovery and reference counting + * + * Device discovery (i.e. calling libusb_get_device_list()) returns a + * freshly-allocated list of devices. The list itself must be freed when + * you are done with it. libusb also needs to know when it is OK to free + * the contents of the list - the devices themselves. + * + * To handle these issues, libusb provides you with two separate items: + * - A function to free the list itself + * - A reference counting system for the devices inside + * + * New devices presented by the libusb_get_device_list() function all have a + * reference count of 1. You can increase and decrease reference count using + * libusb_ref_device() and libusb_unref_device(). A device is destroyed when + * its reference count reaches 0. + * + * With the above information in mind, the process of opening a device can + * be viewed as follows: + * -# Discover devices using libusb_get_device_list(). + * -# Choose the device that you want to operate, and call libusb_open(). + * -# Unref all devices in the discovered device list. + * -# Free the discovered device list. + * + * The order is important - you must not unreference the device before + * attempting to open it, because unreferencing it may destroy the device. + * + * For convenience, the libusb_free_device_list() function includes a + * parameter to optionally unreference all the devices in the list before + * freeing the list itself. This combines steps 3 and 4 above. + * + * As an implementation detail, libusb_open() actually adds a reference to + * the device in question. This is because the device remains available + * through the handle via libusb_get_device(). The reference is deleted during + * libusb_close(). + */ + +/** @defgroup misc Miscellaneous */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +#define DISCOVERED_DEVICES_SIZE_STEP 8 + +static struct discovered_devs *discovered_devs_alloc(void) +{ + struct discovered_devs *ret = + malloc(sizeof(*ret) + (sizeof(void *) * DISCOVERED_DEVICES_SIZE_STEP)); + + if (ret) { + ret->len = 0; + ret->capacity = DISCOVERED_DEVICES_SIZE_STEP; + } + return ret; +} + +/* append a device to the discovered devices collection. may realloc itself, + * returning new discdevs. returns NULL on realloc failure. */ +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev) +{ + size_t len = discdevs->len; + size_t capacity; + + /* if there is space, just append the device */ + if (len < discdevs->capacity) { + discdevs->devices[len] = libusb_ref_device(dev); + discdevs->len++; + return discdevs; + } + + /* exceeded capacity, need to grow */ + usbi_dbg("need to increase capacity"); + capacity = discdevs->capacity + DISCOVERED_DEVICES_SIZE_STEP; + discdevs = realloc(discdevs, + sizeof(*discdevs) + (sizeof(void *) * capacity)); + if (discdevs) { + discdevs->capacity = capacity; + discdevs->devices[len] = libusb_ref_device(dev); + discdevs->len++; + } + + return discdevs; +} + +static void discovered_devs_free(struct discovered_devs *discdevs) +{ + size_t i; + + for (i = 0; i < discdevs->len; i++) + libusb_unref_device(discdevs->devices[i]); + + free(discdevs); +} + +/* Allocate a new device with a specific session ID. The returned device has + * a reference count of 1. */ +struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, + unsigned long session_id) +{ + size_t priv_size = usbi_backend->device_priv_size; + struct libusb_device *dev = calloc(1, sizeof(*dev) + priv_size); + int r; + + if (!dev) + return NULL; + + r = usbi_mutex_init(&dev->lock, NULL); + if (r) { + free(dev); + return NULL; + } + + dev->ctx = ctx; + dev->refcnt = 1; + dev->session_data = session_id; + dev->speed = LIBUSB_SPEED_UNKNOWN; + memset(&dev->os_priv, 0, priv_size); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_add(&dev->list, &ctx->usb_devs); + usbi_mutex_unlock(&ctx->usb_devs_lock); + return dev; +} + +/* Perform some final sanity checks on a newly discovered device. If this + * function fails (negative return code), the device should not be added + * to the discovered device list. */ +int usbi_sanitize_device(struct libusb_device *dev) +{ + int r; + unsigned char raw_desc[DEVICE_DESC_LENGTH]; + uint8_t num_configurations; + int host_endian; + + r = usbi_backend->get_device_descriptor(dev, raw_desc, &host_endian); + if (r < 0) + return r; + + num_configurations = raw_desc[DEVICE_DESC_LENGTH - 1]; + if (num_configurations > USB_MAXCONFIG) { + usbi_err(DEVICE_CTX(dev), "too many configurations"); + return LIBUSB_ERROR_IO; + } else if (0 == num_configurations) + usbi_dbg("zero configurations, maybe an unauthorized device"); + + dev->num_configurations = num_configurations; + return 0; +} + +/* Examine libusb's internal list of known devices, looking for one with + * a specific session ID. Returns the matching device if it was found, and + * NULL otherwise. */ +struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, + unsigned long session_id) +{ + struct libusb_device *dev; + struct libusb_device *ret = NULL; + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) + if (dev->session_data == session_id) { + ret = dev; + break; + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + return ret; +} + +/** @ingroup dev + * Returns a list of USB devices currently attached to the system. This is + * your entry point into finding a USB device to operate. + * + * You are expected to unreference all the devices when you are done with + * them, and then free the list with libusb_free_device_list(). Note that + * libusb_free_device_list() can unref all the devices for you. Be careful + * not to unreference a device you are about to open until after you have + * opened it. + * + * This return value of this function indicates the number of devices in + * the resultant list. The list is actually one element larger, as it is + * NULL-terminated. + * + * \param ctx the context to operate on, or NULL for the default context + * \param list output location for a list of devices. Must be later freed with + * libusb_free_device_list(). + * \returns The number of devices in the outputted list, or any + * \ref libusb_error according to errors encountered by the backend. + */ +ssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx, + libusb_device ***list) +{ + struct discovered_devs *discdevs = discovered_devs_alloc(); + struct libusb_device **ret; + int r = 0; + ssize_t i, len; + USBI_GET_CONTEXT(ctx); + usbi_dbg(""); + + if (!discdevs) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_backend->get_device_list(ctx, &discdevs); + if (r < 0) { + len = r; + goto out; + } + + /* convert discovered_devs into a list */ + len = discdevs->len; + ret = malloc(sizeof(void *) * (len + 1)); + if (!ret) { + len = LIBUSB_ERROR_NO_MEM; + goto out; + } + + ret[len] = NULL; + for (i = 0; i < len; i++) { + struct libusb_device *dev = discdevs->devices[i]; + ret[i] = libusb_ref_device(dev); + } + *list = ret; + +out: + discovered_devs_free(discdevs); + return len; +} + +/** \ingroup dev + * Frees a list of devices previously discovered using + * libusb_get_device_list(). If the unref_devices parameter is set, the + * reference count of each device in the list is decremented by 1. + * \param list the list to free + * \param unref_devices whether to unref the devices in the list + */ +void API_EXPORTED libusb_free_device_list(libusb_device **list, + int unref_devices) +{ + if (!list) + return; + + if (unref_devices) { + int i = 0; + struct libusb_device *dev; + + while ((dev = list[i++]) != NULL) + libusb_unref_device(dev); + } + free(list); +} + +/** \ingroup dev + * Get the number of the bus that a device is connected to. + * \param dev a device + * \returns the bus number + */ +uint8_t API_EXPORTED libusb_get_bus_number(libusb_device *dev) +{ + return dev->bus_number; +} + +/** \ingroup dev + * Get the address of the device on the bus it is connected to. + * \param dev a device + * \returns the device address + */ +uint8_t API_EXPORTED libusb_get_device_address(libusb_device *dev) +{ + return dev->device_address; +} + +/** \ingroup dev + * Get the negotiated connection speed for a device. + * \param dev a device + * \returns a \ref libusb_speed code, where LIBUSB_SPEED_UNKNOWN means that + * the OS doesn't know or doesn't support returning the negotiated speed. + */ +int API_EXPORTED libusb_get_device_speed(libusb_device *dev) +{ + return dev->speed; +} + +static const struct libusb_endpoint_descriptor *find_endpoint( + struct libusb_config_descriptor *config, unsigned char endpoint) +{ + int iface_idx; + for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { + const struct libusb_interface *iface = &config->interface[iface_idx]; + int altsetting_idx; + + for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; + altsetting_idx++) { + const struct libusb_interface_descriptor *altsetting + = &iface->altsetting[altsetting_idx]; + int ep_idx; + + for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) { + const struct libusb_endpoint_descriptor *ep = + &altsetting->endpoint[ep_idx]; + if (ep->bEndpointAddress == endpoint) + return ep; + } + } + } + return NULL; +} + +/** \ingroup dev + * Convenience function to retrieve the wMaxPacketSize value for a particular + * endpoint in the active device configuration. + * + * This function was originally intended to be of assistance when setting up + * isochronous transfers, but a design mistake resulted in this function + * instead. It simply returns the wMaxPacketSize value without considering + * its contents. If you're dealing with isochronous transfers, you probably + * want libusb_get_max_iso_packet_size() instead. + * + * \param dev a device + * \param endpoint address of the endpoint in question + * \returns the wMaxPacketSize value + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_OTHER on other failure + */ +int API_EXPORTED libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint) +{ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *ep; + int r; + + r = libusb_get_active_config_descriptor(dev, &config); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "could not retrieve active config descriptor"); + return LIBUSB_ERROR_OTHER; + } + + ep = find_endpoint(config, endpoint); + if (!ep) + return LIBUSB_ERROR_NOT_FOUND; + + r = ep->wMaxPacketSize; + libusb_free_config_descriptor(config); + return r; +} + +/** \ingroup dev + * Calculate the maximum packet size which a specific endpoint is capable is + * sending or receiving in the duration of 1 microframe + * + * Only the active configution is examined. The calculation is based on the + * wMaxPacketSize field in the endpoint descriptor as described in section + * 9.6.6 in the USB 2.0 specifications. + * + * If acting on an isochronous or interrupt endpoint, this function will + * multiply the value found in bits 0:10 by the number of transactions per + * microframe (determined by bits 11:12). Otherwise, this function just + * returns the numeric value found in bits 0:10. + * + * This function is useful for setting up isochronous transfers, for example + * you might pass the return value from this function to + * libusb_set_iso_packet_lengths() in order to set the length field of every + * isochronous packet in a transfer. + * + * Since v1.0.3. + * + * \param dev a device + * \param endpoint address of the endpoint in question + * \returns the maximum packet size which can be sent/received on this endpoint + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_OTHER on other failure + */ +int API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint) +{ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *ep; + enum libusb_transfer_type ep_type; + uint16_t val; + int r; + + r = libusb_get_active_config_descriptor(dev, &config); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "could not retrieve active config descriptor"); + return LIBUSB_ERROR_OTHER; + } + + ep = find_endpoint(config, endpoint); + if (!ep) + return LIBUSB_ERROR_NOT_FOUND; + + val = ep->wMaxPacketSize; + ep_type = ep->bmAttributes & 0x3; + libusb_free_config_descriptor(config); + + r = val & 0x07ff; + if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) + r *= (1 + ((val >> 11) & 3)); + return r; +} + +/** \ingroup dev + * Increment the reference count of a device. + * \param dev the device to reference + * \returns the same device + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev) +{ + usbi_mutex_lock(&dev->lock); + dev->refcnt++; + usbi_mutex_unlock(&dev->lock); + return dev; +} + +/** \ingroup dev + * Decrement the reference count of a device. If the decrement operation + * causes the reference count to reach zero, the device shall be destroyed. + * \param dev the device to unreference + */ +void API_EXPORTED libusb_unref_device(libusb_device *dev) +{ + int refcnt; + + if (!dev) + return; + + usbi_mutex_lock(&dev->lock); + refcnt = --dev->refcnt; + usbi_mutex_unlock(&dev->lock); + + if (refcnt == 0) { + usbi_dbg("destroy device %d.%d", dev->bus_number, dev->device_address); + + if (usbi_backend->destroy_device) + usbi_backend->destroy_device(dev); + + usbi_mutex_lock(&dev->ctx->usb_devs_lock); + list_del(&dev->list); + usbi_mutex_unlock(&dev->ctx->usb_devs_lock); + + usbi_mutex_destroy(&dev->lock); + free(dev); + } +} + +/* + * Interrupt the iteration of the event handling thread, so that it picks + * up the new fd. + */ +void usbi_fd_notification(struct libusb_context *ctx) +{ + unsigned char dummy = 1; + ssize_t r; + + if (ctx == NULL) + return; + + /* record that we are messing with poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify++; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* write some data on control pipe to interrupt event handlers */ + r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy)); + if (r <= 0) { + usbi_warn(ctx, "internal signalling write failed"); + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + return; + } + + /* take event handling lock */ + libusb_lock_events(ctx); + + /* read the dummy data */ + r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy)); + if (r <= 0) + usbi_warn(ctx, "internal signalling read failed"); + + /* we're done with modifying poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* Release event handling lock and wake up event waiters */ + libusb_unlock_events(ctx); +} + +/** \ingroup dev + * Open a device and obtain a device handle. A handle allows you to perform + * I/O on the device in question. + * + * Internally, this function adds a reference to the device and makes it + * available to you through libusb_get_device(). This reference is removed + * during libusb_close(). + * + * This is a non-blocking function; no requests are sent over the bus. + * + * \param dev the device to open + * \param handle output location for the returned device handle pointer. Only + * populated when the return code is 0. + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_MEM on memory allocation failure + * \returns LIBUSB_ERROR_ACCESS if the user has insufficient permissions + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_open(libusb_device *dev, + libusb_device_handle **handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device_handle *_handle; + size_t priv_size = usbi_backend->device_handle_priv_size; + int r; + usbi_dbg("open %d.%d", dev->bus_number, dev->device_address); + + _handle = malloc(sizeof(*_handle) + priv_size); + if (!_handle) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_mutex_init(&_handle->lock, NULL); + if (r) { + free(_handle); + return LIBUSB_ERROR_OTHER; + } + + _handle->dev = libusb_ref_device(dev); + _handle->claimed_interfaces = 0; + memset(&_handle->os_priv, 0, priv_size); + + r = usbi_backend->open(_handle); + if (r < 0) { + usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r); + libusb_unref_device(dev); + usbi_mutex_destroy(&_handle->lock); + free(_handle); + return r; + } + + usbi_mutex_lock(&ctx->open_devs_lock); + list_add(&_handle->list, &ctx->open_devs); + usbi_mutex_unlock(&ctx->open_devs_lock); + *handle = _handle; + + /* At this point, we want to interrupt any existing event handlers so + * that they realise the addition of the new device's poll fd. One + * example when this is desirable is if the user is running a separate + * dedicated libusb events handling thread, which is running with a long + * or infinite timeout. We want to interrupt that iteration of the loop, + * so that it picks up the new fd, and then continues. */ + usbi_fd_notification(ctx); + + return 0; +} + +/** \ingroup dev + * Convenience function for finding a device with a particular + * idVendor/idProduct combination. This function is intended + * for those scenarios where you are using libusb to knock up a quick test + * application - it allows you to avoid calling libusb_get_device_list() and + * worrying about traversing/freeing the list. + * + * This function has limitations and is hence not intended for use in real + * applications: if multiple devices have the same IDs it will only + * give you the first one, etc. + * + * \param ctx the context to operate on, or NULL for the default context + * \param vendor_id the idVendor value to search for + * \param product_id the idProduct value to search for + * \returns a handle for the first found device, or NULL on error or if the + * device could not be found. */ +DEFAULT_VISIBILITY +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id) +{ + struct libusb_device **devs; + struct libusb_device *found = NULL; + struct libusb_device *dev; + struct libusb_device_handle *handle = NULL; + size_t i = 0; + int r; + + if (libusb_get_device_list(ctx, &devs) < 0) + return NULL; + + while ((dev = devs[i++]) != NULL) { + struct libusb_device_descriptor desc; + r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) + goto out; + if (desc.idVendor == vendor_id && desc.idProduct == product_id) { + found = dev; + break; + } + } + + if (found) { + r = libusb_open(found, &handle); + if (r < 0) + handle = NULL; + } + +out: + libusb_free_device_list(devs, 1); + return handle; +} + +static void do_close(struct libusb_context *ctx, + struct libusb_device_handle *dev_handle) +{ + struct usbi_transfer *itransfer; + struct usbi_transfer *tmp; + + libusb_lock_events(ctx); + + /* remove any transfers in flight that are for this device */ + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* safe iteration because transfers may be being deleted */ + list_for_each_entry_safe(itransfer, tmp, &ctx->flying_transfers, list, struct usbi_transfer) { + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + if (transfer->dev_handle != dev_handle) + continue; + + if (!(itransfer->flags & USBI_TRANSFER_DEVICE_DISAPPEARED)) { + usbi_err(ctx, "Device handle closed while transfer was still being processed, but the device is still connected as far as we know"); + + if (itransfer->flags & USBI_TRANSFER_CANCELLING) + usbi_warn(ctx, "A cancellation for an in-flight transfer hasn't completed but closing the device handle"); + else + usbi_err(ctx, "A cancellation hasn't even been scheduled on the transfer for which the device is closing"); + } + + /* remove from the list of in-flight transfers and make sure + * we don't accidentally use the device handle in the future + * (or that such accesses will be easily caught and identified as a crash) + */ + usbi_mutex_lock(&itransfer->lock); + list_del(&itransfer->list); + transfer->dev_handle = NULL; + usbi_mutex_unlock(&itransfer->lock); + + /* it is up to the user to free up the actual transfer struct. this is + * just making sure that we don't attempt to process the transfer after + * the device handle is invalid + */ + usbi_dbg("Removed transfer %p from the in-flight list because device handle %p closed", + transfer, dev_handle); + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + libusb_unlock_events(ctx); + + usbi_mutex_lock(&ctx->open_devs_lock); + list_del(&dev_handle->list); + usbi_mutex_unlock(&ctx->open_devs_lock); + + usbi_backend->close(dev_handle); + libusb_unref_device(dev_handle->dev); + usbi_mutex_destroy(&dev_handle->lock); + free(dev_handle); +} + +/** \ingroup dev + * Close a device handle. Should be called on all open handles before your + * application exits. + * + * Internally, this function destroys the reference that was added by + * libusb_open() on the given device. + * + * This is a non-blocking function; no requests are sent over the bus. + * + * \param dev_handle the handle to close + */ +void API_EXPORTED libusb_close(libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx; + unsigned char dummy = 1; + ssize_t r; + + if (!dev_handle) + return; + usbi_dbg(""); + + ctx = HANDLE_CTX(dev_handle); + + /* Similarly to libusb_open(), we want to interrupt all event handlers + * at this point. More importantly, we want to perform the actual close of + * the device while holding the event handling lock (preventing any other + * thread from doing event handling) because we will be removing a file + * descriptor from the polling loop. */ + + /* record that we are messing with poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify++; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* write some data on control pipe to interrupt event handlers */ + r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy)); + if (r <= 0) { + usbi_warn(ctx, "internal signalling write failed, closing anyway"); + do_close(ctx, dev_handle); + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + return; + } + + /* take event handling lock */ + libusb_lock_events(ctx); + + /* read the dummy data */ + r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy)); + if (r <= 0) + usbi_warn(ctx, "internal signalling read failed, closing anyway"); + + /* Close the device */ + do_close(ctx, dev_handle); + + /* we're done with modifying poll fds */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + ctx->pollfd_modify--; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + + /* Release event handling lock and wake up event waiters */ + libusb_unlock_events(ctx); +} + +/** \ingroup dev + * Get the underlying device for a handle. This function does not modify + * the reference count of the returned device, so do not feel compelled to + * unreference it when you are done. + * \param dev_handle a device handle + * \returns the underlying device + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle) +{ + return dev_handle->dev; +} + +/** \ingroup dev + * Determine the bConfigurationValue of the currently active configuration. + * + * You could formulate your own control request to obtain this information, + * but this function has the advantage that it may be able to retrieve the + * information from operating system caches (no I/O involved). + * + * If the OS does not cache this information, then this function will block + * while a control transfer is submitted to retrieve the information. + * + * This function will return a value of 0 in the config output + * parameter if the device is in unconfigured state. + * + * \param dev a device handle + * \param config output location for the bConfigurationValue of the active + * configuration (only valid for return code 0) + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev, + int *config) +{ + int r = LIBUSB_ERROR_NOT_SUPPORTED; + + usbi_dbg(""); + if (usbi_backend->get_configuration) + r = usbi_backend->get_configuration(dev, config); + + if (r == LIBUSB_ERROR_NOT_SUPPORTED) { + uint8_t tmp = 0; + usbi_dbg("falling back to control message"); + r = libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_CONFIGURATION, 0, 0, &tmp, 1, 1000); + if (r == 0) { + usbi_err(HANDLE_CTX(dev), "zero bytes returned in ctrl transfer?"); + r = LIBUSB_ERROR_IO; + } else if (r == 1) { + r = 0; + *config = tmp; + } else { + usbi_dbg("control failed, error %d", r); + } + } + + if (r == 0) + usbi_dbg("active config %d", *config); + + return r; +} + +/** \ingroup dev + * Set the active configuration for a device. + * + * The operating system may or may not have already set an active + * configuration on the device. It is up to your application to ensure the + * correct configuration is selected before you attempt to claim interfaces + * and perform other operations. + * + * If you call this function on a device already configured with the selected + * configuration, then this function will act as a lightweight device reset: + * it will issue a SET_CONFIGURATION request using the current configuration, + * causing most USB-related device state to be reset (altsetting reset to zero, + * endpoint halts cleared, toggles reset). + * + * You cannot change/reset configuration if your application has claimed + * interfaces - you should free them with libusb_release_interface() first. + * You cannot change/reset configuration if other applications or drivers have + * claimed interfaces. + * + * A configuration value of -1 will put the device in unconfigured state. + * The USB specifications state that a configuration value of 0 does this, + * however buggy devices exist which actually have a configuration 0. + * + * You should always use this function rather than formulating your own + * SET_CONFIGURATION control request. This is because the underlying operating + * system needs to know when such changes happen. + * + * This is a blocking function. + * + * \param dev a device handle + * \param configuration the bConfigurationValue of the configuration you + * wish to activate, or -1 if you wish to put the device in unconfigured state + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist + * \returns LIBUSB_ERROR_BUSY if interfaces are currently claimed + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_set_configuration(libusb_device_handle *dev, + int configuration) +{ + usbi_dbg("configuration %d", configuration); + return usbi_backend->set_configuration(dev, configuration); +} + +/** \ingroup dev + * Claim an interface on a given device handle. You must claim the interface + * you wish to use before you can perform I/O on any of its endpoints. + * + * It is legal to attempt to claim an already-claimed interface, in which + * case libusb just returns 0 without doing anything. + * + * Claiming of interfaces is a purely logical operation; it does not cause + * any requests to be sent over the bus. Interface claiming is used to + * instruct the underlying operating system that your application wishes + * to take ownership of the interface. + * + * This is a non-blocking function. + * + * \param dev a device handle + * \param interface_number the bInterfaceNumber of the interface you + * wish to claim + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist + * \returns LIBUSB_ERROR_BUSY if another program or driver has claimed the + * interface + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns a LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_claim_interface(libusb_device_handle *dev, + int interface_number) +{ + int r = 0; + + usbi_dbg("interface %d", interface_number); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev->lock); + if (dev->claimed_interfaces & (1 << interface_number)) + goto out; + + r = usbi_backend->claim_interface(dev, interface_number); + if (r == 0) + dev->claimed_interfaces |= 1 << interface_number; + +out: + usbi_mutex_unlock(&dev->lock); + return r; +} + +/** \ingroup dev + * Release an interface previously claimed with libusb_claim_interface(). You + * should release all claimed interfaces before closing a device handle. + * + * This is a blocking function. A SET_INTERFACE control request will be sent + * to the device, resetting interface state to the first alternate setting. + * + * \param dev a device handle + * \param interface_number the bInterfaceNumber of the + * previously-claimed interface + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_release_interface(libusb_device_handle *dev, + int interface_number) +{ + int r; + + usbi_dbg("interface %d", interface_number); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev->lock); + if (!(dev->claimed_interfaces & (1 << interface_number))) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + r = usbi_backend->release_interface(dev, interface_number); + if (r == 0) + dev->claimed_interfaces &= ~(1 << interface_number); + +out: + usbi_mutex_unlock(&dev->lock); + return r; +} + +/** \ingroup dev + * Activate an alternate setting for an interface. The interface must have + * been previously claimed with libusb_claim_interface(). + * + * You should always use this function rather than formulating your own + * SET_INTERFACE control request. This is because the underlying operating + * system needs to know when such changes happen. + * + * This is a blocking function. + * + * \param dev a device handle + * \param interface_number the bInterfaceNumber of the + * previously-claimed interface + * \param alternate_setting the bAlternateSetting of the alternate + * setting to activate + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed, or the + * requested alternate setting does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_set_interface_alt_setting(libusb_device_handle *dev, + int interface_number, int alternate_setting) +{ + usbi_dbg("interface %d altsetting %d", + interface_number, alternate_setting); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev->lock); + if (!(dev->claimed_interfaces & (1 << interface_number))) { + usbi_mutex_unlock(&dev->lock); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_mutex_unlock(&dev->lock); + + return usbi_backend->set_interface_altsetting(dev, interface_number, + alternate_setting); +} + +/** \ingroup dev + * Clear the halt/stall condition for an endpoint. Endpoints with halt status + * are unable to receive or transmit data until the halt condition is stalled. + * + * You should cancel all pending transfers before attempting to clear the halt + * condition. + * + * This is a blocking function. + * + * \param dev a device handle + * \param endpoint the endpoint to clear halt status + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_clear_halt(libusb_device_handle *dev, + unsigned char endpoint) +{ + usbi_dbg("endpoint %x", endpoint); + return usbi_backend->clear_halt(dev, endpoint); +} + +/** \ingroup dev + * Perform a USB port reset to reinitialize a device. The system will attempt + * to restore the previous configuration and alternate settings after the + * reset has completed. + * + * If the reset fails, the descriptors change, or the previous state cannot be + * restored, the device will appear to be disconnected and reconnected. This + * means that the device handle is no longer valid (you should close it) and + * rediscover the device. A return code of LIBUSB_ERROR_NOT_FOUND indicates + * when this is the case. + * + * This is a blocking function which usually incurs a noticeable delay. + * + * \param dev a handle of the device to reset + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the + * device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_reset_device(libusb_device_handle *dev) +{ + usbi_dbg(""); + return usbi_backend->reset_device(dev); +} + +/** \ingroup dev + * Determine if a kernel driver is active on an interface. If a kernel driver + * is active, you cannot claim the interface, and libusb will be unable to + * perform I/O. + * + * This functionality is not available on Windows. + * + * \param dev a device handle + * \param interface_number the interface to check + * \returns 0 if no kernel driver is active + * \returns 1 if a kernel driver is active + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_detach_kernel_driver() + */ +int API_EXPORTED libusb_kernel_driver_active(libusb_device_handle *dev, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + if (usbi_backend->kernel_driver_active) + return usbi_backend->kernel_driver_active(dev, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup dev + * Detach a kernel driver from an interface. If successful, you will then be + * able to claim the interface and perform I/O. + * + * This functionality is not available on Darwin or Windows. + * + * \param dev a device handle + * \param interface_number the interface to detach the driver from + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_kernel_driver_active() + */ +int API_EXPORTED libusb_detach_kernel_driver(libusb_device_handle *dev, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + if (usbi_backend->detach_kernel_driver) + return usbi_backend->detach_kernel_driver(dev, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup dev + * Re-attach an interface's kernel driver, which was previously detached + * using libusb_detach_kernel_driver(). This call is only effective on + * Linux and returns LIBUSB_ERROR_NOT_SUPPORTED on all other platforms. + * + * This functionality is not available on Darwin or Windows. + * + * \param dev a device handle + * \param interface_number the interface to attach the driver from + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns LIBUSB_ERROR_BUSY if the driver cannot be attached because the + * interface is claimed by a program or driver + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_kernel_driver_active() + */ +int API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + if (usbi_backend->attach_kernel_driver) + return usbi_backend->attach_kernel_driver(dev, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup lib + * Set message verbosity. + * - Level 0: no messages ever printed by the library (default) + * - Level 1: error messages are printed to stderr + * - Level 2: warning and error messages are printed to stderr + * - Level 3: informational messages are printed to stdout, warning and error + * messages are printed to stderr + * + * The default level is 0, which means no messages are ever printed. If you + * choose to increase the message verbosity level, ensure that your + * application does not close the stdout/stderr file descriptors. + * + * You are advised to set level 3. libusb is conservative with its message + * logging and most of the time, will only log messages that explain error + * conditions and other oddities. This will help you debug your software. + * + * If the LIBUSB_DEBUG environment variable was set when libusb was + * initialized, this function does nothing: the message verbosity is fixed + * to the value in the environment variable. + * + * If libusb was compiled without any message logging, this function does + * nothing: you'll never get any messages. + * + * If libusb was compiled with verbose debug message logging, this function + * does nothing: you'll always get messages from all levels. + * + * \param ctx the context to operate on, or NULL for the default context + * \param level debug level to set + */ +void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) +{ + USBI_GET_CONTEXT(ctx); + if (!ctx->debug_fixed) + ctx->debug = level; +} + +/** \ingroup lib + * Initialize libusb. This function must be called before calling any other + * libusb function. + * + * If you do not provide an output location for a context pointer, a default + * context will be created. If there was already a default context, it will + * be reused (and nothing will be initialized/reinitialized). + * + * \param context Optional output location for context pointer. + * Only valid on return code 0. + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see contexts + */ +int API_EXPORTED libusb_init(libusb_context **context) +{ + char *dbg = getenv("LIBUSB_DEBUG"); + struct libusb_context *ctx; + int r = 0; + + usbi_mutex_static_lock(&default_context_lock); + if (!context && usbi_default_context) { + usbi_dbg("reusing default context"); + default_context_refcnt++; + usbi_mutex_static_unlock(&default_context_lock); + return 0; + } + + ctx = malloc(sizeof(*ctx)); + if (!ctx) { + r = LIBUSB_ERROR_NO_MEM; + goto err_unlock; + } + memset(ctx, 0, sizeof(*ctx)); + + if (dbg) { + ctx->debug = atoi(dbg); + if (ctx->debug) + ctx->debug_fixed = 1; + } + + usbi_dbg("libusb-%d.%d.%d%s%s%s", + libusb_version_internal.major, + libusb_version_internal.minor, + libusb_version_internal.micro, + libusb_version_internal.rc, + libusb_version_internal.describe[0] ? " git:" : "", + libusb_version_internal.describe); + + if (usbi_backend->init) { + r = usbi_backend->init(ctx); + if (r) + goto err_free_ctx; + } + + usbi_mutex_init(&ctx->usb_devs_lock, NULL); + usbi_mutex_init(&ctx->open_devs_lock, NULL); + list_init(&ctx->usb_devs); + list_init(&ctx->open_devs); + + r = usbi_io_init(ctx); + if (r < 0) { + if (usbi_backend->exit) + usbi_backend->exit(); + goto err_destroy_mutex; + } + + if (context) { + *context = ctx; + } else if (!usbi_default_context) { + usbi_dbg("created default context"); + usbi_default_context = ctx; + default_context_refcnt++; + } + usbi_mutex_static_unlock(&default_context_lock); + + return 0; + +err_destroy_mutex: + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); +err_free_ctx: + free(ctx); +err_unlock: + usbi_mutex_static_unlock(&default_context_lock); + return r; +} + +/** \ingroup lib + * Deinitialize libusb. Should be called after closing all open devices and + * before your application terminates. + * \param ctx the context to deinitialize, or NULL for the default context + */ +void API_EXPORTED libusb_exit(struct libusb_context *ctx) +{ + usbi_dbg(""); + USBI_GET_CONTEXT(ctx); + + /* if working with default context, only actually do the deinitialization + * if we're the last user */ + if (ctx == usbi_default_context) { + usbi_mutex_static_lock(&default_context_lock); + if (--default_context_refcnt > 0) { + usbi_dbg("not destroying default context"); + usbi_mutex_static_unlock(&default_context_lock); + return; + } + usbi_dbg("destroying default context"); + usbi_default_context = NULL; + usbi_mutex_static_unlock(&default_context_lock); + } + + /* a little sanity check. doesn't bother with open_devs locking because + * unless there is an application bug, nobody will be accessing this. */ + if (!list_empty(&ctx->open_devs)) + usbi_warn(ctx, "application left some devices open"); + + usbi_io_exit(ctx); + if (usbi_backend->exit) + usbi_backend->exit(); + + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); + free(ctx); +} + +/** \ingroup misc + * Check at runtime if the loaded library has a given capability. + * + * \param capability the \ref libusb_capability to check for + * \returns 1 if the running library has the capability, 0 otherwise + */ +int API_EXPORTED libusb_has_capability(uint32_t capability) +{ + enum libusb_capability cap = capability; + switch (cap) { + case LIBUSB_CAP_HAS_CAPABILITY: + return 1; + } + return 0; +} + +/* this is defined in libusbi.h if needed */ +#ifdef LIBUSB_GETTIMEOFDAY_WIN32 +/* + * gettimeofday + * Implementation according to: + * The Open Group Base Specifications Issue 6 + * IEEE Std 1003.1, 2004 Edition + */ + +/* + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Contributed by: + * Danny Smith + */ + +/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */ +#define _W32_FT_OFFSET (116444736000000000) + +int usbi_gettimeofday(struct timeval *tp, void *tzp) + { + union { + unsigned __int64 ns100; /*time since 1 Jan 1601 in 100ns units */ + FILETIME ft; + } _now; + + if(tp) + { + GetSystemTimeAsFileTime (&_now.ft); + tp->tv_usec=(long)((_now.ns100 / 10) % 1000000 ); + tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000); + } + /* Always return 0 as per Open Group Base Specifications Issue 6. + Do not set errno on error. */ + return 0; +} +#endif + +void usbi_log_v(struct libusb_context *ctx, enum usbi_log_level level, + const char *function, const char *format, va_list args) +{ + FILE *stream = stdout; + const char *prefix; + struct timeval now; + static struct timeval first = { 0, 0 }; + +#ifndef ENABLE_DEBUG_LOGGING + USBI_GET_CONTEXT(ctx); + if (!ctx->debug) + return; + if (level == LOG_LEVEL_WARNING && ctx->debug < 2) + return; + if (level == LOG_LEVEL_INFO && ctx->debug < 3) + return; +#endif + + usbi_gettimeofday(&now, NULL); + if (!first.tv_sec) { + first.tv_sec = now.tv_sec; + first.tv_usec = now.tv_usec; + } + if (now.tv_usec < first.tv_usec) { + now.tv_sec--; + now.tv_usec += 1000000; + } + now.tv_sec -= first.tv_sec; + now.tv_usec -= first.tv_usec; + + switch (level) { + case LOG_LEVEL_INFO: + prefix = "info"; + break; + case LOG_LEVEL_WARNING: + stream = stderr; + prefix = "warning"; + break; + case LOG_LEVEL_ERROR: + stream = stderr; + prefix = "error"; + break; + case LOG_LEVEL_DEBUG: + stream = stderr; + prefix = "debug"; + break; + default: + stream = stderr; + prefix = "unknown"; + break; + } + + fprintf(stream, "libusb: %d.%06d %s [%s] ", + (int)now.tv_sec, (int)now.tv_usec, prefix, function); + + vfprintf(stream, format, args); + + fprintf(stream, "\n"); +} + +void usbi_log(struct libusb_context *ctx, enum usbi_log_level level, + const char *function, const char *format, ...) +{ + va_list args; + + va_start (args, format); + usbi_log_v(ctx, level, function, format, args); + va_end (args); +} + +/** \ingroup misc + * Returns a constant NULL-terminated string with the ASCII name of a libusb + * error code. The caller must not free() the returned string. + * + * \param error_code The \ref libusb_error code to return the name of. + * \returns The error name, or the string **UNKNOWN** if the value of + * error_code is not a known error code. + */ +DEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_error_name(int error_code) +{ + enum libusb_error error = error_code; + switch (error) { + case LIBUSB_SUCCESS: + return "LIBUSB_SUCCESS"; + case LIBUSB_ERROR_IO: + return "LIBUSB_ERROR_IO"; + case LIBUSB_ERROR_INVALID_PARAM: + return "LIBUSB_ERROR_INVALID_PARAM"; + case LIBUSB_ERROR_ACCESS: + return "LIBUSB_ERROR_ACCESS"; + case LIBUSB_ERROR_NO_DEVICE: + return "LIBUSB_ERROR_NO_DEVICE"; + case LIBUSB_ERROR_NOT_FOUND: + return "LIBUSB_ERROR_NOT_FOUND"; + case LIBUSB_ERROR_BUSY: + return "LIBUSB_ERROR_BUSY"; + case LIBUSB_ERROR_TIMEOUT: + return "LIBUSB_ERROR_TIMEOUT"; + case LIBUSB_ERROR_OVERFLOW: + return "LIBUSB_ERROR_OVERFLOW"; + case LIBUSB_ERROR_PIPE: + return "LIBUSB_ERROR_PIPE"; + case LIBUSB_ERROR_INTERRUPTED: + return "LIBUSB_ERROR_INTERRUPTED"; + case LIBUSB_ERROR_NO_MEM: + return "LIBUSB_ERROR_NO_MEM"; + case LIBUSB_ERROR_NOT_SUPPORTED: + return "LIBUSB_ERROR_NOT_SUPPORTED"; + case LIBUSB_ERROR_OTHER: + return "LIBUSB_ERROR_OTHER"; + } + return "**UNKNOWN**"; +} + +/** \ingroup misc + * Returns a pointer to const struct libusb_version with the version + * (major, minor, micro, rc, and nano) of the running library. + */ +DEFAULT_VISIBILITY +const struct libusb_version * LIBUSB_CALL libusb_get_version(void) +{ + return &libusb_version_internal; +} diff --git a/libusb/libusb/libusb/descriptor.c b/libusb/libusb/libusb/descriptor.c new file mode 100644 index 0000000..e358e9e --- /dev/null +++ b/libusb/libusb/libusb/descriptor.c @@ -0,0 +1,730 @@ +/* + * USB descriptor handling functions for libusb + * Copyright (C) 2007 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#include "libusbi.h" + +#define DESC_HEADER_LENGTH 2 +#define DEVICE_DESC_LENGTH 18 +#define CONFIG_DESC_LENGTH 9 +#define INTERFACE_DESC_LENGTH 9 +#define ENDPOINT_DESC_LENGTH 7 +#define ENDPOINT_AUDIO_DESC_LENGTH 9 + +/** @defgroup desc USB descriptors + * This page details how to examine the various standard USB descriptors + * for detected devices + */ + +/* set host_endian if the w values are already in host endian format, + * as opposed to bus endian. */ +int usbi_parse_descriptor(unsigned char *source, const char *descriptor, + void *dest, int host_endian) +{ + unsigned char *sp = source, *dp = dest; + uint16_t w; + const char *cp; + + for (cp = descriptor; *cp; cp++) { + switch (*cp) { + case 'b': /* 8-bit byte */ + *dp++ = *sp++; + break; + case 'w': /* 16-bit word, convert from little endian to CPU */ + dp += ((uintptr_t)dp & 1); /* Align to word boundary */ + + if (host_endian) { + memcpy(dp, sp, 2); + } else { + w = (sp[1] << 8) | sp[0]; + *((uint16_t *)dp) = w; + } + sp += 2; + dp += 2; + break; + } + } + + return (int) (sp - source); +} + +static void clear_endpoint(struct libusb_endpoint_descriptor *endpoint) +{ + if (endpoint->extra) + free((unsigned char *) endpoint->extra); +} + +static int parse_endpoint(struct libusb_context *ctx, + struct libusb_endpoint_descriptor *endpoint, unsigned char *buffer, + int size, int host_endian) +{ + struct usb_descriptor_header header; + unsigned char *extra; + unsigned char *begin; + int parsed = 0; + int len; + + usbi_parse_descriptor(buffer, "bb", &header, 0); + + /* Everything should be fine being passed into here, but we sanity */ + /* check JIC */ + if (header.bLength > size) { + usbi_err(ctx, "ran out of descriptors parsing"); + return -1; + } + + if (header.bDescriptorType != LIBUSB_DT_ENDPOINT) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + header.bDescriptorType, LIBUSB_DT_ENDPOINT); + return parsed; + } + + if (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH) + usbi_parse_descriptor(buffer, "bbbbwbbb", endpoint, host_endian); + else if (header.bLength >= ENDPOINT_DESC_LENGTH) + usbi_parse_descriptor(buffer, "bbbbwb", endpoint, host_endian); + + buffer += header.bLength; + size -= header.bLength; + parsed += header.bLength; + + /* Skip over the rest of the Class Specific or Vendor Specific */ + /* descriptors */ + begin = buffer; + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + + if (header.bLength < 2) { + usbi_err(ctx, "invalid descriptor length %d", header.bLength); + return -1; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + usbi_dbg("skipping descriptor %x", header.bDescriptorType); + buffer += header.bLength; + size -= header.bLength; + parsed += header.bLength; + } + + /* Copy any unknown descriptors into a storage area for drivers */ + /* to later parse */ + len = (int)(buffer - begin); + if (!len) { + endpoint->extra = NULL; + endpoint->extra_length = 0; + return parsed; + } + + extra = malloc(len); + endpoint->extra = extra; + if (!extra) { + endpoint->extra_length = 0; + return LIBUSB_ERROR_NO_MEM; + } + + memcpy(extra, begin, len); + endpoint->extra_length = len; + + return parsed; +} + +static void clear_interface(struct libusb_interface *usb_interface) +{ + int i; + int j; + + if (usb_interface->altsetting) { + for (i = 0; i < usb_interface->num_altsetting; i++) { + struct libusb_interface_descriptor *ifp = + (struct libusb_interface_descriptor *) + usb_interface->altsetting + i; + if (ifp->extra) + free((void *) ifp->extra); + if (ifp->endpoint) { + for (j = 0; j < ifp->bNumEndpoints; j++) + clear_endpoint((struct libusb_endpoint_descriptor *) + ifp->endpoint + j); + free((void *) ifp->endpoint); + } + } + free((void *) usb_interface->altsetting); + usb_interface->altsetting = NULL; + } + +} + +static int parse_interface(libusb_context *ctx, + struct libusb_interface *usb_interface, unsigned char *buffer, int size, + int host_endian) +{ + int i; + int len; + int r; + int parsed = 0; + size_t tmp; + struct usb_descriptor_header header; + struct libusb_interface_descriptor *ifp; + unsigned char *begin; + + usb_interface->num_altsetting = 0; + + while (size >= INTERFACE_DESC_LENGTH) { + struct libusb_interface_descriptor *altsetting = + (struct libusb_interface_descriptor *) usb_interface->altsetting; + altsetting = realloc(altsetting, + sizeof(struct libusb_interface_descriptor) * + (usb_interface->num_altsetting + 1)); + if (!altsetting) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + usb_interface->altsetting = altsetting; + + ifp = altsetting + usb_interface->num_altsetting; + usb_interface->num_altsetting++; + usbi_parse_descriptor(buffer, "bbbbbbbbb", ifp, 0); + ifp->extra = NULL; + ifp->extra_length = 0; + ifp->endpoint = NULL; + + /* Skip over the interface */ + buffer += ifp->bLength; + parsed += ifp->bLength; + size -= ifp->bLength; + + begin = buffer; + + /* Skip over any interface, class or vendor descriptors */ + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < 2) { + usbi_err(ctx, "invalid descriptor of length %d", + header.bLength); + r = LIBUSB_ERROR_IO; + goto err; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + buffer += header.bLength; + parsed += header.bLength; + size -= header.bLength; + } + + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = (int)(buffer - begin); + if (len) { + ifp->extra = malloc(len); + if (!ifp->extra) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + memcpy((unsigned char *) ifp->extra, begin, len); + ifp->extra_length = len; + } + + /* Did we hit an unexpected descriptor? */ + if (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if ((header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) { + return parsed; + } + } + + if (ifp->bNumEndpoints > USB_MAXENDPOINTS) { + usbi_err(ctx, "too many endpoints (%d)", ifp->bNumEndpoints); + r = LIBUSB_ERROR_IO; + goto err; + } + + if (ifp->bNumEndpoints > 0) { + struct libusb_endpoint_descriptor *endpoint; + tmp = ifp->bNumEndpoints * sizeof(struct libusb_endpoint_descriptor); + endpoint = malloc(tmp); + ifp->endpoint = endpoint; + if (!endpoint) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + memset(endpoint, 0, tmp); + for (i = 0; i < ifp->bNumEndpoints; i++) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + + if (header.bLength > size) { + usbi_err(ctx, "ran out of descriptors parsing"); + r = LIBUSB_ERROR_IO; + goto err; + } + + r = parse_endpoint(ctx, endpoint + i, buffer, size, + host_endian); + if (r < 0) + goto err; + + buffer += r; + parsed += r; + size -= r; + } + } + + /* We check to see if it's an alternate to this one */ + ifp = (struct libusb_interface_descriptor *) buffer; + if (size < LIBUSB_DT_INTERFACE_SIZE || + ifp->bDescriptorType != LIBUSB_DT_INTERFACE || + !ifp->bAlternateSetting) + return parsed; + } + + return parsed; +err: + clear_interface(usb_interface); + return r; +} + +static void clear_configuration(struct libusb_config_descriptor *config) +{ + if (config->interface) { + int i; + for (i = 0; i < config->bNumInterfaces; i++) + clear_interface((struct libusb_interface *) + config->interface + i); + free((void *) config->interface); + } + if (config->extra) + free((void *) config->extra); +} + +static int parse_configuration(struct libusb_context *ctx, + struct libusb_config_descriptor *config, unsigned char *buffer, + int host_endian) +{ + int i; + int r; + int size; + size_t tmp; + struct usb_descriptor_header header; + struct libusb_interface *usb_interface; + + usbi_parse_descriptor(buffer, "bbwbbbbb", config, host_endian); + size = config->wTotalLength; + + if (config->bNumInterfaces > USB_MAXINTERFACES) { + usbi_err(ctx, "too many interfaces (%d)", config->bNumInterfaces); + return LIBUSB_ERROR_IO; + } + + tmp = config->bNumInterfaces * sizeof(struct libusb_interface); + usb_interface = malloc(tmp); + config->interface = usb_interface; + if (!config->interface) + return LIBUSB_ERROR_NO_MEM; + + memset(usb_interface, 0, tmp); + buffer += config->bLength; + size -= config->bLength; + + config->extra = NULL; + config->extra_length = 0; + + for (i = 0; i < config->bNumInterfaces; i++) { + int len; + unsigned char *begin; + + /* Skip over the rest of the Class Specific or Vendor */ + /* Specific descriptors */ + begin = buffer; + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + + if ((header.bLength > size) || + (header.bLength < DESC_HEADER_LENGTH)) { + usbi_err(ctx, "invalid descriptor length of %d", + header.bLength); + r = LIBUSB_ERROR_IO; + goto err; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + usbi_dbg("skipping descriptor 0x%x\n", header.bDescriptorType); + buffer += header.bLength; + size -= header.bLength; + } + + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = (int)(buffer - begin); + if (len) { + /* FIXME: We should realloc and append here */ + if (!config->extra_length) { + config->extra = malloc(len); + if (!config->extra) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + memcpy((unsigned char *) config->extra, begin, len); + config->extra_length = len; + } + } + + r = parse_interface(ctx, usb_interface + i, buffer, size, host_endian); + if (r < 0) + goto err; + + buffer += r; + size -= r; + } + + return size; + +err: + clear_configuration(config); + return r; +} + +/** \ingroup desc + * Get the USB device descriptor for a given device. + * + * This is a non-blocking function; the device descriptor is cached in memory. + * + * \param dev the device + * \param desc output location for the descriptor data + * \returns 0 on success or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc) +{ + unsigned char raw_desc[DEVICE_DESC_LENGTH]; + int host_endian = 0; + int r; + + usbi_dbg(""); + r = usbi_backend->get_device_descriptor(dev, raw_desc, &host_endian); + if (r < 0) + return r; + + memcpy((unsigned char *) desc, raw_desc, sizeof(raw_desc)); + if (!host_endian) { + desc->bcdUSB = libusb_le16_to_cpu(desc->bcdUSB); + desc->idVendor = libusb_le16_to_cpu(desc->idVendor); + desc->idProduct = libusb_le16_to_cpu(desc->idProduct); + desc->bcdDevice = libusb_le16_to_cpu(desc->bcdDevice); + } + return 0; +} + +/** \ingroup desc + * Get the USB configuration descriptor for the currently active configuration. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_config_descriptor + */ +int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor *_config = malloc(sizeof(*_config)); + unsigned char tmp[8]; + unsigned char *buf = NULL; + int host_endian = 0; + int r; + + usbi_dbg(""); + if (!_config) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_backend->get_active_config_descriptor(dev, tmp, sizeof(tmp), + &host_endian); + if (r < 0) + goto err; + + usbi_parse_descriptor(tmp, "bbw", _config, host_endian); + buf = malloc(_config->wTotalLength); + if (!buf) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + r = usbi_backend->get_active_config_descriptor(dev, buf, + _config->wTotalLength, &host_endian); + if (r < 0) + goto err; + + r = parse_configuration(dev->ctx, _config, buf, host_endian); + if (r < 0) { + usbi_err(dev->ctx, "parse_configuration failed with error %d", r); + goto err; + } else if (r > 0) { + usbi_warn(dev->ctx, "descriptor data still left"); + } + + free(buf); + *config = _config; + return 0; + +err: + free(_config); + if (buf) + free(buf); + return r; +} + +/** \ingroup desc + * Get a USB configuration descriptor based on its index. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param config_index the index of the configuration you wish to retrieve + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_active_config_descriptor() + * \see libusb_get_config_descriptor_by_value() + */ +int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor *_config; + unsigned char tmp[8]; + unsigned char *buf = NULL; + int host_endian = 0; + int r; + + usbi_dbg("index %d", config_index); + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_NOT_FOUND; + + _config = malloc(sizeof(*_config)); + if (!_config) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_backend->get_config_descriptor(dev, config_index, tmp, + sizeof(tmp), &host_endian); + if (r < 0) + goto err; + + usbi_parse_descriptor(tmp, "bbw", _config, host_endian); + buf = malloc(_config->wTotalLength); + if (!buf) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + host_endian = 0; + r = usbi_backend->get_config_descriptor(dev, config_index, buf, + _config->wTotalLength, &host_endian); + if (r < 0) + goto err; + + r = parse_configuration(dev->ctx, _config, buf, host_endian); + if (r < 0) { + usbi_err(dev->ctx, "parse_configuration failed with error %d", r); + goto err; + } else if (r > 0) { + usbi_warn(dev->ctx, "descriptor data still left"); + } + + free(buf); + *config = _config; + return 0; + +err: + free(_config); + if (buf) + free(buf); + return r; +} + +/* iterate through all configurations, returning the index of the configuration + * matching a specific bConfigurationValue in the idx output parameter, or -1 + * if the config was not found. + * returns 0 or a LIBUSB_ERROR code + */ +int usbi_get_config_index_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, int *idx) +{ + uint8_t i; + + usbi_dbg("value %d", bConfigurationValue); + for (i = 0; i < dev->num_configurations; i++) { + unsigned char tmp[6]; + int host_endian; + int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp), + &host_endian); + if (r < 0) + return r; + if (tmp[5] == bConfigurationValue) { + *idx = i; + return 0; + } + } + + *idx = -1; + return 0; +} + +/** \ingroup desc + * Get a USB configuration descriptor with a specific bConfigurationValue. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param bConfigurationValue the bConfigurationValue of the configuration you + * wish to retrieve + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_active_config_descriptor() + * \see libusb_get_config_descriptor() + */ +int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config) +{ + int idx; + int r = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx); + if (r < 0) + return r; + else if (idx == -1) + return LIBUSB_ERROR_NOT_FOUND; + else + return libusb_get_config_descriptor(dev, (uint8_t) idx, config); +} + +/** \ingroup desc + * Free a configuration descriptor obtained from + * libusb_get_active_config_descriptor() or libusb_get_config_descriptor(). + * It is safe to call this function with a NULL config parameter, in which + * case the function simply returns. + * + * \param config the configuration descriptor to free + */ +void API_EXPORTED libusb_free_config_descriptor( + struct libusb_config_descriptor *config) +{ + if (!config) + return; + + clear_configuration(config); + free(config); +} + +/** \ingroup desc + * Retrieve a string descriptor in C style ASCII. + * + * Wrapper around libusb_get_string_descriptor(). Uses the first language + * supported by the device. + * + * \param dev a device handle + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for ASCII string descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + uint8_t desc_index, unsigned char *data, int length) +{ + unsigned char tbuf[255]; /* Some devices choke on size > 255 */ + int r, si, di; + uint16_t langid; + + /* Asking for the zero'th index is special - it returns a string + * descriptor that contains all the language IDs supported by the + * device. Typically there aren't many - often only one. Language + * IDs are 16 bit numbers, and they start at the third byte in the + * descriptor. There's also no point in trying to read descriptor 0 + * with this function. See USB 2.0 specification section 9.6.7 for + * more information. + */ + + if (desc_index == 0) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_get_string_descriptor(dev, 0, 0, tbuf, sizeof(tbuf)); + if (r < 0) + return r; + + if (r < 4) + return LIBUSB_ERROR_IO; + + langid = tbuf[2] | (tbuf[3] << 8); + + r = libusb_get_string_descriptor(dev, desc_index, langid, tbuf, + sizeof(tbuf)); + if (r < 0) + return r; + + if (tbuf[1] != LIBUSB_DT_STRING) + return LIBUSB_ERROR_IO; + + if (tbuf[0] > r) + return LIBUSB_ERROR_IO; + + for (di = 0, si = 2; si < tbuf[0]; si += 2) { + if (di >= (length - 1)) + break; + + if (tbuf[si + 1]) /* high byte */ + data[di++] = '?'; + else + data[di++] = tbuf[si]; + } + + data[di] = 0; + return di; +} + diff --git a/libusb/libusb/libusb/io.c b/libusb/libusb/libusb/io.c new file mode 100644 index 0000000..e9bd312 --- /dev/null +++ b/libusb/libusb/libusb/io.c @@ -0,0 +1,2454 @@ +/* + * I/O functions for libusb + * Copyright (C) 2007-2009 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#ifdef USBI_TIMERFD_AVAILABLE +#include +#endif + +#include "libusbi.h" + +/** + * \page io Synchronous and asynchronous device I/O + * + * \section intro Introduction + * + * If you're using libusb in your application, you're probably wanting to + * perform I/O with devices - you want to perform USB data transfers. + * + * libusb offers two separate interfaces for device I/O. This page aims to + * introduce the two in order to help you decide which one is more suitable + * for your application. You can also choose to use both interfaces in your + * application by considering each transfer on a case-by-case basis. + * + * Once you have read through the following discussion, you should consult the + * detailed API documentation pages for the details: + * - \ref syncio + * - \ref asyncio + * + * \section theory Transfers at a logical level + * + * At a logical level, USB transfers typically happen in two parts. For + * example, when reading data from a endpoint: + * -# A request for data is sent to the device + * -# Some time later, the incoming data is received by the host + * + * or when writing data to an endpoint: + * + * -# The data is sent to the device + * -# Some time later, the host receives acknowledgement from the device that + * the data has been transferred. + * + * There may be an indefinite delay between the two steps. Consider a + * fictional USB input device with a button that the user can press. In order + * to determine when the button is pressed, you would likely submit a request + * to read data on a bulk or interrupt endpoint and wait for data to arrive. + * Data will arrive when the button is pressed by the user, which is + * potentially hours later. + * + * libusb offers both a synchronous and an asynchronous interface to performing + * USB transfers. The main difference is that the synchronous interface + * combines both steps indicated above into a single function call, whereas + * the asynchronous interface separates them. + * + * \section sync The synchronous interface + * + * The synchronous I/O interface allows you to perform a USB transfer with + * a single function call. When the function call returns, the transfer has + * completed and you can parse the results. + * + * If you have used the libusb-0.1 before, this I/O style will seem familar to + * you. libusb-0.1 only offered a synchronous interface. + * + * In our input device example, to read button presses you might write code + * in the following style: +\code +unsigned char data[4]; +int actual_length; +int r = libusb_bulk_transfer(handle, LIBUSB_ENDPOINT_IN, data, sizeof(data), &actual_length, 0); +if (r == 0 && actual_length == sizeof(data)) { + // results of the transaction can now be found in the data buffer + // parse them here and report button press +} else { + error(); +} +\endcode + * + * The main advantage of this model is simplicity: you did everything with + * a single simple function call. + * + * However, this interface has its limitations. Your application will sleep + * inside libusb_bulk_transfer() until the transaction has completed. If it + * takes the user 3 hours to press the button, your application will be + * sleeping for that long. Execution will be tied up inside the library - + * the entire thread will be useless for that duration. + * + * Another issue is that by tieing up the thread with that single transaction + * there is no possibility of performing I/O with multiple endpoints and/or + * multiple devices simultaneously, unless you resort to creating one thread + * per transaction. + * + * Additionally, there is no opportunity to cancel the transfer after the + * request has been submitted. + * + * For details on how to use the synchronous API, see the + * \ref syncio "synchronous I/O API documentation" pages. + * + * \section async The asynchronous interface + * + * Asynchronous I/O is the most significant new feature in libusb-1.0. + * Although it is a more complex interface, it solves all the issues detailed + * above. + * + * Instead of providing which functions that block until the I/O has complete, + * libusb's asynchronous interface presents non-blocking functions which + * begin a transfer and then return immediately. Your application passes a + * callback function pointer to this non-blocking function, which libusb will + * call with the results of the transaction when it has completed. + * + * Transfers which have been submitted through the non-blocking functions + * can be cancelled with a separate function call. + * + * The non-blocking nature of this interface allows you to be simultaneously + * performing I/O to multiple endpoints on multiple devices, without having + * to use threads. + * + * This added flexibility does come with some complications though: + * - In the interest of being a lightweight library, libusb does not create + * threads and can only operate when your application is calling into it. Your + * application must call into libusb from it's main loop when events are ready + * to be handled, or you must use some other scheme to allow libusb to + * undertake whatever work needs to be done. + * - libusb also needs to be called into at certain fixed points in time in + * order to accurately handle transfer timeouts. + * - Memory handling becomes more complex. You cannot use stack memory unless + * the function with that stack is guaranteed not to return until the transfer + * callback has finished executing. + * - You generally lose some linearity from your code flow because submitting + * the transfer request is done in a separate function from where the transfer + * results are handled. This becomes particularly obvious when you want to + * submit a second transfer based on the results of an earlier transfer. + * + * Internally, libusb's synchronous interface is expressed in terms of function + * calls to the asynchronous interface. + * + * For details on how to use the asynchronous API, see the + * \ref asyncio "asynchronous I/O API" documentation pages. + */ + + +/** + * \page packetoverflow Packets and overflows + * + * \section packets Packet abstraction + * + * The USB specifications describe how data is transmitted in packets, with + * constraints on packet size defined by endpoint descriptors. The host must + * not send data payloads larger than the endpoint's maximum packet size. + * + * libusb and the underlying OS abstract out the packet concept, allowing you + * to request transfers of any size. Internally, the request will be divided + * up into correctly-sized packets. You do not have to be concerned with + * packet sizes, but there is one exception when considering overflows. + * + * \section overflow Bulk/interrupt transfer overflows + * + * When requesting data on a bulk endpoint, libusb requires you to supply a + * buffer and the maximum number of bytes of data that libusb can put in that + * buffer. However, the size of the buffer is not communicated to the device - + * the device is just asked to send any amount of data. + * + * There is no problem if the device sends an amount of data that is less than + * or equal to the buffer size. libusb reports this condition to you through + * the \ref libusb_transfer::actual_length "libusb_transfer.actual_length" + * field. + * + * Problems may occur if the device attempts to send more data than can fit in + * the buffer. libusb reports LIBUSB_TRANSFER_OVERFLOW for this condition but + * other behaviour is largely undefined: actual_length may or may not be + * accurate, the chunk of data that can fit in the buffer (before overflow) + * may or may not have been transferred. + * + * Overflows are nasty, but can be avoided. Even though you were told to + * ignore packets above, think about the lower level details: each transfer is + * split into packets (typically small, with a maximum size of 512 bytes). + * Overflows can only happen if the final packet in an incoming data transfer + * is smaller than the actual packet that the device wants to transfer. + * Therefore, you will never see an overflow if your transfer buffer size is a + * multiple of the endpoint's packet size: the final packet will either + * fill up completely or will be only partially filled. + */ + +/** + * @defgroup asyncio Asynchronous device I/O + * + * This page details libusb's asynchronous (non-blocking) API for USB device + * I/O. This interface is very powerful but is also quite complex - you will + * need to read this page carefully to understand the necessary considerations + * and issues surrounding use of this interface. Simplistic applications + * may wish to consider the \ref syncio "synchronous I/O API" instead. + * + * The asynchronous interface is built around the idea of separating transfer + * submission and handling of transfer completion (the synchronous model + * combines both of these into one). There may be a long delay between + * submission and completion, however the asynchronous submission function + * is non-blocking so will return control to your application during that + * potentially long delay. + * + * \section asyncabstraction Transfer abstraction + * + * For the asynchronous I/O, libusb implements the concept of a generic + * transfer entity for all types of I/O (control, bulk, interrupt, + * isochronous). The generic transfer object must be treated slightly + * differently depending on which type of I/O you are performing with it. + * + * This is represented by the public libusb_transfer structure type. + * + * \section asynctrf Asynchronous transfers + * + * We can view asynchronous I/O as a 5 step process: + * -# Allocation: allocate a libusb_transfer + * -# Filling: populate the libusb_transfer instance with information + * about the transfer you wish to perform + * -# Submission: ask libusb to submit the transfer + * -# Completion handling: examine transfer results in the + * libusb_transfer structure + * -# Deallocation: clean up resources + * + * + * \subsection asyncalloc Allocation + * + * This step involves allocating memory for a USB transfer. This is the + * generic transfer object mentioned above. At this stage, the transfer + * is "blank" with no details about what type of I/O it will be used for. + * + * Allocation is done with the libusb_alloc_transfer() function. You must use + * this function rather than allocating your own transfers. + * + * \subsection asyncfill Filling + * + * This step is where you take a previously allocated transfer and fill it + * with information to determine the message type and direction, data buffer, + * callback function, etc. + * + * You can either fill the required fields yourself or you can use the + * helper functions: libusb_fill_control_transfer(), libusb_fill_bulk_transfer() + * and libusb_fill_interrupt_transfer(). + * + * \subsection asyncsubmit Submission + * + * When you have allocated a transfer and filled it, you can submit it using + * libusb_submit_transfer(). This function returns immediately but can be + * regarded as firing off the I/O request in the background. + * + * \subsection asynccomplete Completion handling + * + * After a transfer has been submitted, one of four things can happen to it: + * + * - The transfer completes (i.e. some data was transferred) + * - The transfer has a timeout and the timeout expires before all data is + * transferred + * - The transfer fails due to an error + * - The transfer is cancelled + * + * Each of these will cause the user-specified transfer callback function to + * be invoked. It is up to the callback function to determine which of the + * above actually happened and to act accordingly. + * + * The user-specified callback is passed a pointer to the libusb_transfer + * structure which was used to setup and submit the transfer. At completion + * time, libusb has populated this structure with results of the transfer: + * success or failure reason, number of bytes of data transferred, etc. See + * the libusb_transfer structure documentation for more information. + * + * \subsection Deallocation + * + * When a transfer has completed (i.e. the callback function has been invoked), + * you are advised to free the transfer (unless you wish to resubmit it, see + * below). Transfers are deallocated with libusb_free_transfer(). + * + * It is undefined behaviour to free a transfer which has not completed. + * + * \section asyncresubmit Resubmission + * + * You may be wondering why allocation, filling, and submission are all + * separated above where they could reasonably be combined into a single + * operation. + * + * The reason for separation is to allow you to resubmit transfers without + * having to allocate new ones every time. This is especially useful for + * common situations dealing with interrupt endpoints - you allocate one + * transfer, fill and submit it, and when it returns with results you just + * resubmit it for the next interrupt. + * + * \section asynccancel Cancellation + * + * Another advantage of using the asynchronous interface is that you have + * the ability to cancel transfers which have not yet completed. This is + * done by calling the libusb_cancel_transfer() function. + * + * libusb_cancel_transfer() is asynchronous/non-blocking in itself. When the + * cancellation actually completes, the transfer's callback function will + * be invoked, and the callback function should check the transfer status to + * determine that it was cancelled. + * + * Freeing the transfer after it has been cancelled but before cancellation + * has completed will result in undefined behaviour. + * + * When a transfer is cancelled, some of the data may have been transferred. + * libusb will communicate this to you in the transfer callback. Do not assume + * that no data was transferred. + * + * \section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints + * + * If your device does not have predictable transfer sizes (or it misbehaves), + * your application may submit a request for data on an IN endpoint which is + * smaller than the data that the device wishes to send. In some circumstances + * this will cause an overflow, which is a nasty condition to deal with. See + * the \ref packetoverflow page for discussion. + * + * \section asyncctrl Considerations for control transfers + * + * The libusb_transfer structure is generic and hence does not + * include specific fields for the control-specific setup packet structure. + * + * In order to perform a control transfer, you must place the 8-byte setup + * packet at the start of the data buffer. To simplify this, you could + * cast the buffer pointer to type struct libusb_control_setup, or you can + * use the helper function libusb_fill_control_setup(). + * + * The wLength field placed in the setup packet must be the length you would + * expect to be sent in the setup packet: the length of the payload that + * follows (or the expected maximum number of bytes to receive). However, + * the length field of the libusb_transfer object must be the length of + * the data buffer - i.e. it should be wLength plus the size of + * the setup packet (LIBUSB_CONTROL_SETUP_SIZE). + * + * If you use the helper functions, this is simplified for you: + * -# Allocate a buffer of size LIBUSB_CONTROL_SETUP_SIZE plus the size of the + * data you are sending/requesting. + * -# Call libusb_fill_control_setup() on the data buffer, using the transfer + * request size as the wLength value (i.e. do not include the extra space you + * allocated for the control setup). + * -# If this is a host-to-device transfer, place the data to be transferred + * in the data buffer, starting at offset LIBUSB_CONTROL_SETUP_SIZE. + * -# Call libusb_fill_control_transfer() to associate the data buffer with + * the transfer (and to set the remaining details such as callback and timeout). + * - Note that there is no parameter to set the length field of the transfer. + * The length is automatically inferred from the wLength field of the setup + * packet. + * -# Submit the transfer. + * + * The multi-byte control setup fields (wValue, wIndex and wLength) must + * be given in little-endian byte order (the endianness of the USB bus). + * Endianness conversion is transparently handled by + * libusb_fill_control_setup() which is documented to accept host-endian + * values. + * + * Further considerations are needed when handling transfer completion in + * your callback function: + * - As you might expect, the setup packet will still be sitting at the start + * of the data buffer. + * - If this was a device-to-host transfer, the received data will be sitting + * at offset LIBUSB_CONTROL_SETUP_SIZE into the buffer. + * - The actual_length field of the transfer structure is relative to the + * wLength of the setup packet, rather than the size of the data buffer. So, + * if your wLength was 4, your transfer's length was 12, then you + * should expect an actual_length of 4 to indicate that the data was + * transferred in entirity. + * + * To simplify parsing of setup packets and obtaining the data from the + * correct offset, you may wish to use the libusb_control_transfer_get_data() + * and libusb_control_transfer_get_setup() functions within your transfer + * callback. + * + * Even though control endpoints do not halt, a completed control transfer + * may have a LIBUSB_TRANSFER_STALL status code. This indicates the control + * request was not supported. + * + * \section asyncintr Considerations for interrupt transfers + * + * All interrupt transfers are performed using the polling interval presented + * by the bInterval value of the endpoint descriptor. + * + * \section asynciso Considerations for isochronous transfers + * + * Isochronous transfers are more complicated than transfers to + * non-isochronous endpoints. + * + * To perform I/O to an isochronous endpoint, allocate the transfer by calling + * libusb_alloc_transfer() with an appropriate number of isochronous packets. + * + * During filling, set \ref libusb_transfer::type "type" to + * \ref libusb_transfer_type::LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + * "LIBUSB_TRANSFER_TYPE_ISOCHRONOUS", and set + * \ref libusb_transfer::num_iso_packets "num_iso_packets" to a value less than + * or equal to the number of packets you requested during allocation. + * libusb_alloc_transfer() does not set either of these fields for you, given + * that you might not even use the transfer on an isochronous endpoint. + * + * Next, populate the length field for the first num_iso_packets entries in + * the \ref libusb_transfer::iso_packet_desc "iso_packet_desc" array. Section + * 5.6.3 of the USB2 specifications describe how the maximum isochronous + * packet length is determined by the wMaxPacketSize field in the endpoint + * descriptor. + * Two functions can help you here: + * + * - libusb_get_max_iso_packet_size() is an easy way to determine the max + * packet size for an isochronous endpoint. Note that the maximum packet + * size is actually the maximum number of bytes that can be transmitted in + * a single microframe, therefore this function multiplies the maximum number + * of bytes per transaction by the number of transaction opportunities per + * microframe. + * - libusb_set_iso_packet_lengths() assigns the same length to all packets + * within a transfer, which is usually what you want. + * + * For outgoing transfers, you'll obviously fill the buffer and populate the + * packet descriptors in hope that all the data gets transferred. For incoming + * transfers, you must ensure the buffer has sufficient capacity for + * the situation where all packets transfer the full amount of requested data. + * + * Completion handling requires some extra consideration. The + * \ref libusb_transfer::actual_length "actual_length" field of the transfer + * is meaningless and should not be examined; instead you must refer to the + * \ref libusb_iso_packet_descriptor::actual_length "actual_length" field of + * each individual packet. + * + * The \ref libusb_transfer::status "status" field of the transfer is also a + * little misleading: + * - If the packets were submitted and the isochronous data microframes + * completed normally, status will have value + * \ref libusb_transfer_status::LIBUSB_TRANSFER_COMPLETED + * "LIBUSB_TRANSFER_COMPLETED". Note that bus errors and software-incurred + * delays are not counted as transfer errors; the transfer.status field may + * indicate COMPLETED even if some or all of the packets failed. Refer to + * the \ref libusb_iso_packet_descriptor::status "status" field of each + * individual packet to determine packet failures. + * - The status field will have value + * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR + * "LIBUSB_TRANSFER_ERROR" only when serious errors were encountered. + * - Other transfer status codes occur with normal behaviour. + * + * The data for each packet will be found at an offset into the buffer that + * can be calculated as if each prior packet completed in full. The + * libusb_get_iso_packet_buffer() and libusb_get_iso_packet_buffer_simple() + * functions may help you here. + * + * \section asyncmem Memory caveats + * + * In most circumstances, it is not safe to use stack memory for transfer + * buffers. This is because the function that fired off the asynchronous + * transfer may return before libusb has finished using the buffer, and when + * the function returns it's stack gets destroyed. This is true for both + * host-to-device and device-to-host transfers. + * + * The only case in which it is safe to use stack memory is where you can + * guarantee that the function owning the stack space for the buffer does not + * return until after the transfer's callback function has completed. In every + * other case, you need to use heap memory instead. + * + * \section asyncflags Fine control + * + * Through using this asynchronous interface, you may find yourself repeating + * a few simple operations many times. You can apply a bitwise OR of certain + * flags to a transfer to simplify certain things: + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_SHORT_NOT_OK + * "LIBUSB_TRANSFER_SHORT_NOT_OK" results in transfers which transferred + * less than the requested amount of data being marked with status + * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR "LIBUSB_TRANSFER_ERROR" + * (they would normally be regarded as COMPLETED) + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER + * "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask libusb to free the transfer + * buffer when freeing the transfer. + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER + * "LIBUSB_TRANSFER_FREE_TRANSFER" causes libusb to automatically free the + * transfer after the transfer callback returns. + * + * \section asyncevent Event handling + * + * In accordance of the aim of being a lightweight library, libusb does not + * create threads internally. This means that libusb code does not execute + * at any time other than when your application is calling a libusb function. + * However, an asynchronous model requires that libusb perform work at various + * points in time - namely processing the results of previously-submitted + * transfers and invoking the user-supplied callback function. + * + * This gives rise to the libusb_handle_events() function which your + * application must call into when libusb has work do to. This gives libusb + * the opportunity to reap pending transfers, invoke callbacks, etc. + * + * The first issue to discuss here is how your application can figure out + * when libusb has work to do. In fact, there are two naive options which + * do not actually require your application to know this: + * -# Periodically call libusb_handle_events() in non-blocking mode at fixed + * short intervals from your main loop + * -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated + * thread. + * + * The first option is plainly not very nice, and will cause unnecessary + * CPU wakeups leading to increased power usage and decreased battery life. + * The second option is not very nice either, but may be the nicest option + * available to you if the "proper" approach can not be applied to your + * application (read on...). + * + * The recommended option is to integrate libusb with your application main + * event loop. libusb exposes a set of file descriptors which allow you to do + * this. Your main loop is probably already calling poll() or select() or a + * variant on a set of file descriptors for other event sources (e.g. keyboard + * button presses, mouse movements, network sockets, etc). You then add + * libusb's file descriptors to your poll()/select() calls, and when activity + * is detected on such descriptors you know it is time to call + * libusb_handle_events(). + * + * There is one final event handling complication. libusb supports + * asynchronous transfers which time out after a specified time period, and + * this requires that libusb is called into at or after the timeout so that + * the timeout can be handled. So, in addition to considering libusb's file + * descriptors in your main event loop, you must also consider that libusb + * sometimes needs to be called into at fixed points in time even when there + * is no file descriptor activity. + * + * For the details on retrieving the set of file descriptors and determining + * the next timeout, see the \ref poll "polling and timing" API documentation. + */ + +/** + * @defgroup poll Polling and timing + * + * This page documents libusb's functions for polling events and timing. + * These functions are only necessary for users of the + * \ref asyncio "asynchronous API". If you are only using the simpler + * \ref syncio "synchronous API" then you do not need to ever call these + * functions. + * + * The justification for the functionality described here has already been + * discussed in the \ref asyncevent "event handling" section of the + * asynchronous API documentation. In summary, libusb does not create internal + * threads for event processing and hence relies on your application calling + * into libusb at certain points in time so that pending events can be handled. + * In order to know precisely when libusb needs to be called into, libusb + * offers you a set of pollable file descriptors and information about when + * the next timeout expires. + * + * If you are using the asynchronous I/O API, you must take one of the two + * following options, otherwise your I/O will not complete. + * + * \section pollsimple The simple option + * + * If your application revolves solely around libusb and does not need to + * handle other event sources, you can have a program structure as follows: +\code +// initialize libusb +// find and open device +// maybe fire off some initial async I/O + +while (user_has_not_requested_exit) + libusb_handle_events(ctx); + +// clean up and exit +\endcode + * + * With such a simple main loop, you do not have to worry about managing + * sets of file descriptors or handling timeouts. libusb_handle_events() will + * handle those details internally. + * + * \section pollmain The more advanced option + * + * \note This functionality is currently only available on Unix-like platforms. + * On Windows, libusb_get_pollfds() simply returns NULL. Exposing event sources + * on Windows will require some further thought and design. + * + * In more advanced applications, you will already have a main loop which + * is monitoring other event sources: network sockets, X11 events, mouse + * movements, etc. Through exposing a set of file descriptors, libusb is + * designed to cleanly integrate into such main loops. + * + * In addition to polling file descriptors for the other event sources, you + * take a set of file descriptors from libusb and monitor those too. When you + * detect activity on libusb's file descriptors, you call + * libusb_handle_events_timeout() in non-blocking mode. + * + * What's more, libusb may also need to handle events at specific moments in + * time. No file descriptor activity is generated at these times, so your + * own application needs to be continually aware of when the next one of these + * moments occurs (through calling libusb_get_next_timeout()), and then it + * needs to call libusb_handle_events_timeout() in non-blocking mode when + * these moments occur. This means that you need to adjust your + * poll()/select() timeout accordingly. + * + * libusb provides you with a set of file descriptors to poll and expects you + * to poll all of them, treating them as a single entity. The meaning of each + * file descriptor in the set is an internal implementation detail, + * platform-dependent and may vary from release to release. Don't try and + * interpret the meaning of the file descriptors, just do as libusb indicates, + * polling all of them at once. + * + * In pseudo-code, you want something that looks like: +\code +// initialise libusb + +libusb_get_pollfds(ctx) +while (user has not requested application exit) { + libusb_get_next_timeout(ctx); + poll(on libusb file descriptors plus any other event sources of interest, + using a timeout no larger than the value libusb just suggested) + if (poll() indicated activity on libusb file descriptors) + libusb_handle_events_timeout(ctx, &zero_tv); + if (time has elapsed to or beyond the libusb timeout) + libusb_handle_events_timeout(ctx, &zero_tv); + // handle events from other sources here +} + +// clean up and exit +\endcode + * + * \subsection polltime Notes on time-based events + * + * The above complication with having to track time and call into libusb at + * specific moments is a bit of a headache. For maximum compatibility, you do + * need to write your main loop as above, but you may decide that you can + * restrict the supported platforms of your application and get away with + * a more simplistic scheme. + * + * These time-based event complications are \b not required on the following + * platforms: + * - Darwin + * - Linux, provided that the following version requirements are satisfied: + * - Linux v2.6.27 or newer, compiled with timerfd support + * - glibc v2.9 or newer + * - libusb v1.0.5 or newer + * + * Under these configurations, libusb_get_next_timeout() will \em always return + * 0, so your main loop can be simplified to: +\code +// initialise libusb + +libusb_get_pollfds(ctx) +while (user has not requested application exit) { + poll(on libusb file descriptors plus any other event sources of interest, + using any timeout that you like) + if (poll() indicated activity on libusb file descriptors) + libusb_handle_events_timeout(ctx, &zero_tv); + // handle events from other sources here +} + +// clean up and exit +\endcode + * + * Do remember that if you simplify your main loop to the above, you will + * lose compatibility with some platforms (including legacy Linux platforms, + * and any future platforms supported by libusb which may have time-based + * event requirements). The resultant problems will likely appear as + * strange bugs in your application. + * + * You can use the libusb_pollfds_handle_timeouts() function to do a runtime + * check to see if it is safe to ignore the time-based event complications. + * If your application has taken the shortcut of ignoring libusb's next timeout + * in your main loop, then you are advised to check the return value of + * libusb_pollfds_handle_timeouts() during application startup, and to abort + * if the platform does suffer from these timing complications. + * + * \subsection fdsetchange Changes in the file descriptor set + * + * The set of file descriptors that libusb uses as event sources may change + * during the life of your application. Rather than having to repeatedly + * call libusb_get_pollfds(), you can set up notification functions for when + * the file descriptor set changes using libusb_set_pollfd_notifiers(). + * + * \subsection mtissues Multi-threaded considerations + * + * Unfortunately, the situation is complicated further when multiple threads + * come into play. If two threads are monitoring the same file descriptors, + * the fact that only one thread will be woken up when an event occurs causes + * some headaches. + * + * The events lock, event waiters lock, and libusb_handle_events_locked() + * entities are added to solve these problems. You do not need to be concerned + * with these entities otherwise. + * + * See the extra documentation: \ref mtasync + */ + +/** \page mtasync Multi-threaded applications and asynchronous I/O + * + * libusb is a thread-safe library, but extra considerations must be applied + * to applications which interact with libusb from multiple threads. + * + * The underlying issue that must be addressed is that all libusb I/O + * revolves around monitoring file descriptors through the poll()/select() + * system calls. This is directly exposed at the + * \ref asyncio "asynchronous interface" but it is important to note that the + * \ref syncio "synchronous interface" is implemented on top of the + * asynchonrous interface, therefore the same considerations apply. + * + * The issue is that if two or more threads are concurrently calling poll() + * or select() on libusb's file descriptors then only one of those threads + * will be woken up when an event arrives. The others will be completely + * oblivious that anything has happened. + * + * Consider the following pseudo-code, which submits an asynchronous transfer + * then waits for its completion. This style is one way you could implement a + * synchronous interface on top of the asynchronous interface (and libusb + * does something similar, albeit more advanced due to the complications + * explained on this page). + * +\code +void cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; +} + +void myfunc() { + struct libusb_transfer *transfer; + unsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE]; + int completed = 0; + + transfer = libusb_alloc_transfer(0); + libusb_fill_control_setup(buffer, + LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0); + libusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000); + libusb_submit_transfer(transfer); + + while (!completed) { + poll(libusb file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_timeout(ctx, &zero_tv); + } + printf("completed!"); + // other code here +} +\endcode + * + * Here we are serializing completion of an asynchronous event + * against a condition - the condition being completion of a specific transfer. + * The poll() loop has a long timeout to minimize CPU usage during situations + * when nothing is happening (it could reasonably be unlimited). + * + * If this is the only thread that is polling libusb's file descriptors, there + * is no problem: there is no danger that another thread will swallow up the + * event that we are interested in. On the other hand, if there is another + * thread polling the same descriptors, there is a chance that it will receive + * the event that we were interested in. In this situation, myfunc() + * will only realise that the transfer has completed on the next iteration of + * the loop, up to 120 seconds later. Clearly a two-minute delay is + * undesirable, and don't even think about using short timeouts to circumvent + * this issue! + * + * The solution here is to ensure that no two threads are ever polling the + * file descriptors at the same time. A naive implementation of this would + * impact the capabilities of the library, so libusb offers the scheme + * documented below to ensure no loss of functionality. + * + * Before we go any further, it is worth mentioning that all libusb-wrapped + * event handling procedures fully adhere to the scheme documented below. + * This includes libusb_handle_events() and its variants, and all the + * synchronous I/O functions - libusb hides this headache from you. + * + * \section Using libusb_handle_events() from multiple threads + * + * Even when only using libusb_handle_events() and synchronous I/O functions, + * you can still have a race condition. You might be tempted to solve the + * above with libusb_handle_events() like so: + * +\code + libusb_submit_transfer(transfer); + + while (!completed) { + libusb_handle_events(ctx); + } + printf("completed!"); +\endcode + * + * This however has a race between the checking of completed and + * libusb_handle_events() acquiring the events lock, so another thread + * could have completed the transfer, resulting in this thread hanging + * until either a timeout or another event occurs. See also commit + * 6696512aade99bb15d6792af90ae329af270eba6 which fixes this in the + * synchronous API implementation of libusb. + * + * Fixing this race requires checking the variable completed only after + * taking the event lock, which defeats the concept of just calling + * libusb_handle_events() without worrying about locking. This is why + * libusb-1.0.9 introduces the new libusb_handle_events_timeout_completed() + * and libusb_handle_events_completed() functions, which handles doing the + * completion check for you after they have acquired the lock: + * +\code + libusb_submit_transfer(transfer); + + while (!completed) { + libusb_handle_events_completed(ctx, &completed); + } + printf("completed!"); +\endcode + * + * This nicely fixes the race in our example. Note that if all you want to + * do is submit a single transfer and wait for its completion, then using + * one of the synchronous I/O functions is much easier. + * + * \section eventlock The events lock + * + * The problem is when we consider the fact that libusb exposes file + * descriptors to allow for you to integrate asynchronous USB I/O into + * existing main loops, effectively allowing you to do some work behind + * libusb's back. If you do take libusb's file descriptors and pass them to + * poll()/select() yourself, you need to be aware of the associated issues. + * + * The first concept to be introduced is the events lock. The events lock + * is used to serialize threads that want to handle events, such that only + * one thread is handling events at any one time. + * + * You must take the events lock before polling libusb file descriptors, + * using libusb_lock_events(). You must release the lock as soon as you have + * aborted your poll()/select() loop, using libusb_unlock_events(). + * + * \section threadwait Letting other threads do the work for you + * + * Although the events lock is a critical part of the solution, it is not + * enough on it's own. You might wonder if the following is sufficient... +\code + libusb_lock_events(ctx); + while (!completed) { + poll(libusb file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_timeout(ctx, &zero_tv); + } + libusb_unlock_events(ctx); +\endcode + * ...and the answer is that it is not. This is because the transfer in the + * code shown above may take a long time (say 30 seconds) to complete, and + * the lock is not released until the transfer is completed. + * + * Another thread with similar code that wants to do event handling may be + * working with a transfer that completes after a few milliseconds. Despite + * having such a quick completion time, the other thread cannot check that + * status of its transfer until the code above has finished (30 seconds later) + * due to contention on the lock. + * + * To solve this, libusb offers you a mechanism to determine when another + * thread is handling events. It also offers a mechanism to block your thread + * until the event handling thread has completed an event (and this mechanism + * does not involve polling of file descriptors). + * + * After determining that another thread is currently handling events, you + * obtain the event waiters lock using libusb_lock_event_waiters(). + * You then re-check that some other thread is still handling events, and if + * so, you call libusb_wait_for_event(). + * + * libusb_wait_for_event() puts your application to sleep until an event + * occurs, or until a thread releases the events lock. When either of these + * things happen, your thread is woken up, and should re-check the condition + * it was waiting on. It should also re-check that another thread is handling + * events, and if not, it should start handling events itself. + * + * This looks like the following, as pseudo-code: +\code +retry: +if (libusb_try_lock_events(ctx) == 0) { + // we obtained the event lock: do our own event handling + while (!completed) { + if (!libusb_event_handling_ok(ctx)) { + libusb_unlock_events(ctx); + goto retry; + } + poll(libusb file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_locked(ctx, 0); + } + libusb_unlock_events(ctx); +} else { + // another thread is doing event handling. wait for it to signal us that + // an event has completed + libusb_lock_event_waiters(ctx); + + while (!completed) { + // now that we have the event waiters lock, double check that another + // thread is still handling events for us. (it may have ceased handling + // events in the time it took us to reach this point) + if (!libusb_event_handler_active(ctx)) { + // whoever was handling events is no longer doing so, try again + libusb_unlock_event_waiters(ctx); + goto retry; + } + + libusb_wait_for_event(ctx, NULL); + } + libusb_unlock_event_waiters(ctx); +} +printf("completed!\n"); +\endcode + * + * A naive look at the above code may suggest that this can only support + * one event waiter (hence a total of 2 competing threads, the other doing + * event handling), because the event waiter seems to have taken the event + * waiters lock while waiting for an event. However, the system does support + * multiple event waiters, because libusb_wait_for_event() actually drops + * the lock while waiting, and reaquires it before continuing. + * + * We have now implemented code which can dynamically handle situations where + * nobody is handling events (so we should do it ourselves), and it can also + * handle situations where another thread is doing event handling (so we can + * piggyback onto them). It is also equipped to handle a combination of + * the two, for example, another thread is doing event handling, but for + * whatever reason it stops doing so before our condition is met, so we take + * over the event handling. + * + * Four functions were introduced in the above pseudo-code. Their importance + * should be apparent from the code shown above. + * -# libusb_try_lock_events() is a non-blocking function which attempts + * to acquire the events lock but returns a failure code if it is contended. + * -# libusb_event_handling_ok() checks that libusb is still happy for your + * thread to be performing event handling. Sometimes, libusb needs to + * interrupt the event handler, and this is how you can check if you have + * been interrupted. If this function returns 0, the correct behaviour is + * for you to give up the event handling lock, and then to repeat the cycle. + * The following libusb_try_lock_events() will fail, so you will become an + * events waiter. For more information on this, read \ref fullstory below. + * -# libusb_handle_events_locked() is a variant of + * libusb_handle_events_timeout() that you can call while holding the + * events lock. libusb_handle_events_timeout() itself implements similar + * logic to the above, so be sure not to call it when you are + * "working behind libusb's back", as is the case here. + * -# libusb_event_handler_active() determines if someone is currently + * holding the events lock + * + * You might be wondering why there is no function to wake up all threads + * blocked on libusb_wait_for_event(). This is because libusb can do this + * internally: it will wake up all such threads when someone calls + * libusb_unlock_events() or when a transfer completes (at the point after its + * callback has returned). + * + * \subsection fullstory The full story + * + * The above explanation should be enough to get you going, but if you're + * really thinking through the issues then you may be left with some more + * questions regarding libusb's internals. If you're curious, read on, and if + * not, skip to the next section to avoid confusing yourself! + * + * The immediate question that may spring to mind is: what if one thread + * modifies the set of file descriptors that need to be polled while another + * thread is doing event handling? + * + * There are 2 situations in which this may happen. + * -# libusb_open() will add another file descriptor to the poll set, + * therefore it is desirable to interrupt the event handler so that it + * restarts, picking up the new descriptor. + * -# libusb_close() will remove a file descriptor from the poll set. There + * are all kinds of race conditions that could arise here, so it is + * important that nobody is doing event handling at this time. + * + * libusb handles these issues internally, so application developers do not + * have to stop their event handlers while opening/closing devices. Here's how + * it works, focusing on the libusb_close() situation first: + * + * -# During initialization, libusb opens an internal pipe, and it adds the read + * end of this pipe to the set of file descriptors to be polled. + * -# During libusb_close(), libusb writes some dummy data on this control pipe. + * This immediately interrupts the event handler. libusb also records + * internally that it is trying to interrupt event handlers for this + * high-priority event. + * -# At this point, some of the functions described above start behaving + * differently: + * - libusb_event_handling_ok() starts returning 1, indicating that it is NOT + * OK for event handling to continue. + * - libusb_try_lock_events() starts returning 1, indicating that another + * thread holds the event handling lock, even if the lock is uncontended. + * - libusb_event_handler_active() starts returning 1, indicating that + * another thread is doing event handling, even if that is not true. + * -# The above changes in behaviour result in the event handler stopping and + * giving up the events lock very quickly, giving the high-priority + * libusb_close() operation a "free ride" to acquire the events lock. All + * threads that are competing to do event handling become event waiters. + * -# With the events lock held inside libusb_close(), libusb can safely remove + * a file descriptor from the poll set, in the safety of knowledge that + * nobody is polling those descriptors or trying to access the poll set. + * -# After obtaining the events lock, the close operation completes very + * quickly (usually a matter of milliseconds) and then immediately releases + * the events lock. + * -# At the same time, the behaviour of libusb_event_handling_ok() and friends + * reverts to the original, documented behaviour. + * -# The release of the events lock causes the threads that are waiting for + * events to be woken up and to start competing to become event handlers + * again. One of them will succeed; it will then re-obtain the list of poll + * descriptors, and USB I/O will then continue as normal. + * + * libusb_open() is similar, and is actually a more simplistic case. Upon a + * call to libusb_open(): + * + * -# The device is opened and a file descriptor is added to the poll set. + * -# libusb sends some dummy data on the control pipe, and records that it + * is trying to modify the poll descriptor set. + * -# The event handler is interrupted, and the same behaviour change as for + * libusb_close() takes effect, causing all event handling threads to become + * event waiters. + * -# The libusb_open() implementation takes its free ride to the events lock. + * -# Happy that it has successfully paused the events handler, libusb_open() + * releases the events lock. + * -# The event waiter threads are all woken up and compete to become event + * handlers again. The one that succeeds will obtain the list of poll + * descriptors again, which will include the addition of the new device. + * + * \subsection concl Closing remarks + * + * The above may seem a little complicated, but hopefully I have made it clear + * why such complications are necessary. Also, do not forget that this only + * applies to applications that take libusb's file descriptors and integrate + * them into their own polling loops. + * + * You may decide that it is OK for your multi-threaded application to ignore + * some of the rules and locks detailed above, because you don't think that + * two threads can ever be polling the descriptors at the same time. If that + * is the case, then that's good news for you because you don't have to worry. + * But be careful here; remember that the synchronous I/O functions do event + * handling internally. If you have one thread doing event handling in a loop + * (without implementing the rules and locking semantics documented above) + * and another trying to send a synchronous USB transfer, you will end up with + * two threads monitoring the same descriptors, and the above-described + * undesirable behaviour occuring. The solution is for your polling thread to + * play by the rules; the synchronous I/O functions do so, and this will result + * in them getting along in perfect harmony. + * + * If you do have a dedicated thread doing event handling, it is perfectly + * legal for it to take the event handling lock for long periods of time. Any + * synchronous I/O functions you call from other threads will transparently + * fall back to the "event waiters" mechanism detailed above. The only + * consideration that your event handling thread must apply is the one related + * to libusb_event_handling_ok(): you must call this before every poll(), and + * give up the events lock if instructed. + */ + +int usbi_io_init(struct libusb_context *ctx) +{ + int r; + + usbi_mutex_init(&ctx->flying_transfers_lock, NULL); + usbi_mutex_init(&ctx->pollfds_lock, NULL); + usbi_mutex_init(&ctx->pollfd_modify_lock, NULL); + usbi_mutex_init_recursive(&ctx->events_lock, NULL); + usbi_mutex_init(&ctx->event_waiters_lock, NULL); + usbi_cond_init(&ctx->event_waiters_cond, NULL); + list_init(&ctx->flying_transfers); + list_init(&ctx->pollfds); + + /* FIXME should use an eventfd on kernels that support it */ + r = usbi_pipe(ctx->ctrl_pipe); + if (r < 0) { + r = LIBUSB_ERROR_OTHER; + goto err; + } + + r = usbi_add_pollfd(ctx, ctx->ctrl_pipe[0], POLLIN); + if (r < 0) + goto err_close_pipe; + +#ifdef USBI_TIMERFD_AVAILABLE + ctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(), + TFD_NONBLOCK); + if (ctx->timerfd >= 0) { + usbi_dbg("using timerfd for timeouts"); + r = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN); + if (r < 0) { + usbi_remove_pollfd(ctx, ctx->ctrl_pipe[0]); + close(ctx->timerfd); + goto err_close_pipe; + } + } else { + usbi_dbg("timerfd not available (code %d error %d)", ctx->timerfd, errno); + ctx->timerfd = -1; + } +#endif + + return 0; + +err_close_pipe: + usbi_close(ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[1]); +err: + usbi_mutex_destroy(&ctx->flying_transfers_lock); + usbi_mutex_destroy(&ctx->pollfds_lock); + usbi_mutex_destroy(&ctx->pollfd_modify_lock); + usbi_mutex_destroy(&ctx->events_lock); + usbi_mutex_destroy(&ctx->event_waiters_lock); + usbi_cond_destroy(&ctx->event_waiters_cond); + return r; +} + +void usbi_io_exit(struct libusb_context *ctx) +{ + usbi_remove_pollfd(ctx, ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[1]); +#ifdef USBI_TIMERFD_AVAILABLE + if (usbi_using_timerfd(ctx)) { + usbi_remove_pollfd(ctx, ctx->timerfd); + close(ctx->timerfd); + } +#endif + usbi_mutex_destroy(&ctx->flying_transfers_lock); + usbi_mutex_destroy(&ctx->pollfds_lock); + usbi_mutex_destroy(&ctx->pollfd_modify_lock); + usbi_mutex_destroy(&ctx->events_lock); + usbi_mutex_destroy(&ctx->event_waiters_lock); + usbi_cond_destroy(&ctx->event_waiters_cond); +} + +static int calculate_timeout(struct usbi_transfer *transfer) +{ + int r; + struct timespec current_time; + unsigned int timeout = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout; + + if (!timeout) + return 0; + + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, ¤t_time); + if (r < 0) { + usbi_err(ITRANSFER_CTX(transfer), + "failed to read monotonic clock, errno=%d", errno); + return r; + } + + current_time.tv_sec += timeout / 1000; + current_time.tv_nsec += (timeout % 1000) * 1000000; + + if (current_time.tv_nsec > 1000000000) { + current_time.tv_nsec -= 1000000000; + current_time.tv_sec++; + } + + TIMESPEC_TO_TIMEVAL(&transfer->timeout, ¤t_time); + return 0; +} + +/* add a transfer to the (timeout-sorted) active transfers list. + * returns 1 if the transfer has a timeout and it is the timeout next to + * expire */ +static int add_to_flying_list(struct usbi_transfer *transfer) +{ + struct usbi_transfer *cur; + struct timeval *timeout = &transfer->timeout; + struct libusb_context *ctx = ITRANSFER_CTX(transfer); + int r = 0; + int first = 1; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* if we have no other flying transfers, start the list with this one */ + if (list_empty(&ctx->flying_transfers)) { + list_add(&transfer->list, &ctx->flying_transfers); + if (timerisset(timeout)) + r = 1; + goto out; + } + + /* if we have infinite timeout, append to end of list */ + if (!timerisset(timeout)) { + list_add_tail(&transfer->list, &ctx->flying_transfers); + goto out; + } + + /* otherwise, find appropriate place in list */ + list_for_each_entry(cur, &ctx->flying_transfers, list, struct usbi_transfer) { + /* find first timeout that occurs after the transfer in question */ + struct timeval *cur_tv = &cur->timeout; + + if (!timerisset(cur_tv) || (cur_tv->tv_sec > timeout->tv_sec) || + (cur_tv->tv_sec == timeout->tv_sec && + cur_tv->tv_usec > timeout->tv_usec)) { + list_add_tail(&transfer->list, &cur->list); + r = first; + goto out; + } + first = 0; + } + + /* otherwise we need to be inserted at the end */ + list_add_tail(&transfer->list, &ctx->flying_transfers); +out: + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} + +/** \ingroup asyncio + * Allocate a libusb transfer with a specified number of isochronous packet + * descriptors. The returned transfer is pre-initialized for you. When the new + * transfer is no longer needed, it should be freed with + * libusb_free_transfer(). + * + * Transfers intended for non-isochronous endpoints (e.g. control, bulk, + * interrupt) should specify an iso_packets count of zero. + * + * For transfers intended for isochronous endpoints, specify an appropriate + * number of packet descriptors to be allocated as part of the transfer. + * The returned transfer is not specially initialized for isochronous I/O; + * you are still required to set the + * \ref libusb_transfer::num_iso_packets "num_iso_packets" and + * \ref libusb_transfer::type "type" fields accordingly. + * + * It is safe to allocate a transfer with some isochronous packets and then + * use it on a non-isochronous endpoint. If you do this, ensure that at time + * of submission, num_iso_packets is 0 and that type is set appropriately. + * + * \param iso_packets number of isochronous packet descriptors to allocate + * \returns a newly allocated transfer, or NULL on error + */ +DEFAULT_VISIBILITY +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer( + int iso_packets) +{ + size_t os_alloc_size = usbi_backend->transfer_priv_size + + (usbi_backend->add_iso_packet_size * iso_packets); + size_t alloc_size = sizeof(struct usbi_transfer) + + sizeof(struct libusb_transfer) + + (sizeof(struct libusb_iso_packet_descriptor) * iso_packets) + + os_alloc_size; + struct usbi_transfer *itransfer = malloc(alloc_size); + if (!itransfer) + return NULL; + + memset(itransfer, 0, alloc_size); + itransfer->num_iso_packets = iso_packets; + usbi_mutex_init(&itransfer->lock, NULL); + return USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); +} + +/** \ingroup asyncio + * Free a transfer structure. This should be called for all transfers + * allocated with libusb_alloc_transfer(). + * + * If the \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER + * "LIBUSB_TRANSFER_FREE_BUFFER" flag is set and the transfer buffer is + * non-NULL, this function will also free the transfer buffer using the + * standard system memory allocator (e.g. free()). + * + * It is legal to call this function with a NULL transfer. In this case, + * the function will simply return safely. + * + * It is not legal to free an active transfer (one which has been submitted + * and has not yet completed). + * + * \param transfer the transfer to free + */ +void API_EXPORTED libusb_free_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer; + if (!transfer) + return; + + if (transfer->flags & LIBUSB_TRANSFER_FREE_BUFFER && transfer->buffer) + free(transfer->buffer); + + itransfer = LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + usbi_mutex_destroy(&itransfer->lock); + free(itransfer); +} + +/** \ingroup asyncio + * Submit a transfer. This function will fire off the USB transfer and then + * return immediately. + * + * \param transfer the transfer to submit + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_BUSY if the transfer has already been submitted. + * \returns LIBUSB_ERROR_NOT_SUPPORTED if the transfer flags are not supported + * by the operating system. + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer) +{ + struct libusb_context *ctx = TRANSFER_CTX(transfer); + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + int r; + int first; + + usbi_mutex_lock(&itransfer->lock); + itransfer->transferred = 0; + itransfer->flags = 0; + r = calculate_timeout(itransfer); + if (r < 0) { + r = LIBUSB_ERROR_OTHER; + goto out; + } + + first = add_to_flying_list(itransfer); + r = usbi_backend->submit_transfer(itransfer); + if (r) { + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_del(&itransfer->list); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + } +#ifdef USBI_TIMERFD_AVAILABLE + else if (first && usbi_using_timerfd(ctx)) { + /* if this transfer has the lowest timeout of all active transfers, + * rearm the timerfd with this transfer's timeout */ + const struct itimerspec it = { {0, 0}, + { itransfer->timeout.tv_sec, itransfer->timeout.tv_usec * 1000 } }; + usbi_dbg("arm timerfd for timeout in %dms (first in line)", transfer->timeout); + r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); + if (r < 0) + r = LIBUSB_ERROR_OTHER; + } +#else + (void)first; +#endif + +out: + usbi_mutex_unlock(&itransfer->lock); + return r; +} + +/** \ingroup asyncio + * Asynchronously cancel a previously submitted transfer. + * This function returns immediately, but this does not indicate cancellation + * is complete. Your callback function will be invoked at some later time + * with a transfer status of + * \ref libusb_transfer_status::LIBUSB_TRANSFER_CANCELLED + * "LIBUSB_TRANSFER_CANCELLED." + * + * \param transfer the transfer to cancel + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the transfer is already complete or + * cancelled. + * \returns a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + int r; + + usbi_dbg(""); + usbi_mutex_lock(&itransfer->lock); + r = usbi_backend->cancel_transfer(itransfer); + if (r < 0) { + if (r != LIBUSB_ERROR_NOT_FOUND) + usbi_err(TRANSFER_CTX(transfer), + "cancel transfer failed error %d", r); + else + usbi_dbg("cancel transfer failed error %d", r); + + if (r == LIBUSB_ERROR_NO_DEVICE) + itransfer->flags |= USBI_TRANSFER_DEVICE_DISAPPEARED; + } + + itransfer->flags |= USBI_TRANSFER_CANCELLING; + + usbi_mutex_unlock(&itransfer->lock); + return r; +} + +#ifdef USBI_TIMERFD_AVAILABLE +static int disarm_timerfd(struct libusb_context *ctx) +{ + const struct itimerspec disarm_timer = { { 0, 0 }, { 0, 0 } }; + int r; + + usbi_dbg(""); + r = timerfd_settime(ctx->timerfd, 0, &disarm_timer, NULL); + if (r < 0) + return LIBUSB_ERROR_OTHER; + else + return 0; +} + +/* iterates through the flying transfers, and rearms the timerfd based on the + * next upcoming timeout. + * must be called with flying_list locked. + * returns 0 if there was no timeout to arm, 1 if the next timeout was armed, + * or a LIBUSB_ERROR code on failure. + */ +static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) +{ + struct usbi_transfer *transfer; + + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + struct timeval *cur_tv = &transfer->timeout; + + /* if we've reached transfers of infinite timeout, then we have no + * arming to do */ + if (!timerisset(cur_tv)) + return 0; + + /* act on first transfer that is not already cancelled */ + if (!(transfer->flags & USBI_TRANSFER_TIMED_OUT)) { + int r; + const struct itimerspec it = { {0, 0}, + { cur_tv->tv_sec, cur_tv->tv_usec * 1000 } }; + usbi_dbg("next timeout originally %dms", USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); + r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); + if (r < 0) + return LIBUSB_ERROR_OTHER; + return 1; + } + } + + return 0; +} +#else +static int disarm_timerfd(struct libusb_context *ctx) +{ + (void)ctx; + return 0; +} +static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) +{ + (void)ctx; + return 0; +} +#endif + +/* Handle completion of a transfer (completion might be an error condition). + * This will invoke the user-supplied callback function, which may end up + * freeing the transfer. Therefore you cannot use the transfer structure + * after calling this function, and you should free all backend-specific + * data before calling it. + * Do not call this function with the usbi_transfer lock held. User-specified + * callback functions may attempt to directly resubmit the transfer, which + * will attempt to take the lock. */ +int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + uint8_t flags; + int r = 0; + + /* FIXME: could be more intelligent with the timerfd here. we don't need + * to disarm the timerfd if there was no timer running, and we only need + * to rearm the timerfd if the transfer that expired was the one with + * the shortest timeout. */ + + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_del(&itransfer->list); + if (usbi_using_timerfd(ctx)) + r = arm_timerfd_for_next_timeout(ctx); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (usbi_using_timerfd(ctx)) { + if (r < 0) + return r; + r = disarm_timerfd(ctx); + if (r < 0) + return r; + } + + if (status == LIBUSB_TRANSFER_COMPLETED + && transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) { + int rqlen = transfer->length; + if (transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL) + rqlen -= LIBUSB_CONTROL_SETUP_SIZE; + if (rqlen != itransfer->transferred) { + usbi_dbg("interpreting short transfer as error"); + status = LIBUSB_TRANSFER_ERROR; + } + } + + flags = transfer->flags; + transfer->status = status; + transfer->actual_length = itransfer->transferred; + usbi_dbg("transfer %p has callback %p", transfer, transfer->callback); + if (transfer->callback) + transfer->callback(transfer); + /* transfer might have been freed by the above call, do not use from + * this point. */ + if (flags & LIBUSB_TRANSFER_FREE_TRANSFER) + libusb_free_transfer(transfer); + usbi_mutex_lock(&ctx->event_waiters_lock); + usbi_cond_broadcast(&ctx->event_waiters_cond); + usbi_mutex_unlock(&ctx->event_waiters_lock); + return 0; +} + +/* Similar to usbi_handle_transfer_completion() but exclusively for transfers + * that were asynchronously cancelled. The same concerns w.r.t. freeing of + * transfers exist here. + * Do not call this function with the usbi_transfer lock held. User-specified + * callback functions may attempt to directly resubmit the transfer, which + * will attempt to take the lock. */ +int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer) +{ + /* if the URB was cancelled due to timeout, report timeout to the user */ + if (transfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout cancellation"); + return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_TIMED_OUT); + } + + /* otherwise its a normal async cancel */ + return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_CANCELLED); +} + +/** \ingroup poll + * Attempt to acquire the event handling lock. This lock is used to ensure that + * only one thread is monitoring libusb event sources at any one time. + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusb's file descriptors directly. + * If you stick to libusb's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * While holding this lock, you are trusted to actually be handling events. + * If you are no longer handling events, you must call libusb_unlock_events() + * as soon as possible. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 if the lock was obtained successfully + * \returns 1 if the lock was not obtained (i.e. another thread holds the lock) + * \see \ref mtasync + */ +int API_EXPORTED libusb_try_lock_events(libusb_context *ctx) +{ + int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to modify poll fds? if so, don't let this thread + * start event handling */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + r = ctx->pollfd_modify; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + if (r) { + usbi_dbg("someone else is modifying poll fds"); + return 1; + } + + r = usbi_mutex_trylock(&ctx->events_lock); + if (r) + return 1; + + ctx->event_handler_active = 1; + return 0; +} + +/** \ingroup poll + * Acquire the event handling lock, blocking until successful acquisition if + * it is contended. This lock is used to ensure that only one thread is + * monitoring libusb event sources at any one time. + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusb's file descriptors directly. + * If you stick to libusb's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * While holding this lock, you are trusted to actually be handling events. + * If you are no longer handling events, you must call libusb_unlock_events() + * as soon as possible. + * + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_lock_events(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->events_lock); + ctx->event_handler_active = 1; +} + +/** \ingroup poll + * Release the lock previously acquired with libusb_try_lock_events() or + * libusb_lock_events(). Releasing this lock will wake up any threads blocked + * on libusb_wait_for_event(). + * + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_unlock_events(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + ctx->event_handler_active = 0; + usbi_mutex_unlock(&ctx->events_lock); + + /* FIXME: perhaps we should be a bit more efficient by not broadcasting + * the availability of the events lock when we are modifying pollfds + * (check ctx->pollfd_modify)? */ + usbi_mutex_lock(&ctx->event_waiters_lock); + usbi_cond_broadcast(&ctx->event_waiters_cond); + usbi_mutex_unlock(&ctx->event_waiters_lock); +} + +/** \ingroup poll + * Determine if it is still OK for this thread to be doing event handling. + * + * Sometimes, libusb needs to temporarily pause all event handlers, and this + * is the function you should use before polling file descriptors to see if + * this is the case. + * + * If this function instructs your thread to give up the events lock, you + * should just continue the usual logic that is documented in \ref mtasync. + * On the next iteration, your thread will fail to obtain the events lock, + * and will hence become an event waiter. + * + * This function should be called while the events lock is held: you don't + * need to worry about the results of this function if your thread is not + * the current event handler. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 1 if event handling can start or continue + * \returns 0 if this thread must give up the events lock + * \see \ref fullstory "Multi-threaded I/O: the full story" + */ +int API_EXPORTED libusb_event_handling_ok(libusb_context *ctx) +{ + int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to modify poll fds? if so, don't let this thread + * continue event handling */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + r = ctx->pollfd_modify; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + if (r) { + usbi_dbg("someone else is modifying poll fds"); + return 0; + } + + return 1; +} + + +/** \ingroup poll + * Determine if an active thread is handling events (i.e. if anyone is holding + * the event handling lock). + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 1 if a thread is handling events + * \returns 0 if there are no threads currently handling events + * \see \ref mtasync + */ +int API_EXPORTED libusb_event_handler_active(libusb_context *ctx) +{ + int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to modify poll fds? if so, don't let this thread + * start event handling -- indicate that event handling is happening */ + usbi_mutex_lock(&ctx->pollfd_modify_lock); + r = ctx->pollfd_modify; + usbi_mutex_unlock(&ctx->pollfd_modify_lock); + if (r) { + usbi_dbg("someone else is modifying poll fds"); + return 1; + } + + return ctx->event_handler_active; +} + +/** \ingroup poll + * Acquire the event waiters lock. This lock is designed to be obtained under + * the situation where you want to be aware when events are completed, but + * some other thread is event handling so calling libusb_handle_events() is not + * allowed. + * + * You then obtain this lock, re-check that another thread is still handling + * events, then call libusb_wait_for_event(). + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusb's file descriptors directly, + * and may potentially be handling events from 2 threads simultaenously. + * If you stick to libusb's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->event_waiters_lock); +} + +/** \ingroup poll + * Release the event waiters lock. + * \param ctx the context to operate on, or NULL for the default context + * \see \ref mtasync + */ +void API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_unlock(&ctx->event_waiters_lock); +} + +/** \ingroup poll + * Wait for another thread to signal completion of an event. Must be called + * with the event waiters lock held, see libusb_lock_event_waiters(). + * + * This function will block until any of the following conditions are met: + * -# The timeout expires + * -# A transfer completes + * -# A thread releases the event handling lock through libusb_unlock_events() + * + * Condition 1 is obvious. Condition 2 unblocks your thread after + * the callback for the transfer has completed. Condition 3 is important + * because it means that the thread that was previously handling events is no + * longer doing so, so if any events are to complete, another thread needs to + * step up and start event handling. + * + * This function releases the event waiters lock before putting your thread + * to sleep, and reacquires the lock as it is being woken up. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv maximum timeout for this blocking function. A NULL value + * indicates unlimited timeout. + * \returns 0 after a transfer completes or another thread stops event handling + * \returns 1 if the timeout expired + * \see \ref mtasync + */ +int API_EXPORTED libusb_wait_for_event(libusb_context *ctx, struct timeval *tv) +{ + struct timespec timeout; + int r; + + USBI_GET_CONTEXT(ctx); + if (tv == NULL) { + usbi_cond_wait(&ctx->event_waiters_cond, &ctx->event_waiters_lock); + return 0; + } + + r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout); + if (r < 0) { + usbi_err(ctx, "failed to read realtime clock, error %d", errno); + return LIBUSB_ERROR_OTHER; + } + + timeout.tv_sec += tv->tv_sec; + timeout.tv_nsec += tv->tv_usec * 1000; + if (timeout.tv_nsec > 1000000000) { + timeout.tv_nsec -= 1000000000; + timeout.tv_sec++; + } + + r = usbi_cond_timedwait(&ctx->event_waiters_cond, + &ctx->event_waiters_lock, &timeout); + return (r == ETIMEDOUT); +} + +static void handle_timeout(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int r; + + itransfer->flags |= USBI_TRANSFER_TIMED_OUT; + r = libusb_cancel_transfer(transfer); + if (r < 0) + usbi_warn(TRANSFER_CTX(transfer), + "async cancel failed %d errno=%d", r, errno); +} + +static int handle_timeouts_locked(struct libusb_context *ctx) +{ + int r; + struct timespec systime_ts; + struct timeval systime; + struct usbi_transfer *transfer; + + if (list_empty(&ctx->flying_transfers)) + return 0; + + /* get current time */ + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts); + if (r < 0) + return r; + + TIMESPEC_TO_TIMEVAL(&systime, &systime_ts); + + /* iterate through flying transfers list, finding all transfers that + * have expired timeouts */ + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + struct timeval *cur_tv = &transfer->timeout; + + /* if we've reached transfers of infinite timeout, we're all done */ + if (!timerisset(cur_tv)) + return 0; + + /* ignore timeouts we've already handled */ + if (transfer->flags & (USBI_TRANSFER_TIMED_OUT | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) + continue; + + /* if transfer has non-expired timeout, nothing more to do */ + if ((cur_tv->tv_sec > systime.tv_sec) || + (cur_tv->tv_sec == systime.tv_sec && + cur_tv->tv_usec > systime.tv_usec)) + return 0; + + /* otherwise, we've got an expired timeout to handle */ + handle_timeout(transfer); + } + return 0; +} + +static int handle_timeouts(struct libusb_context *ctx) +{ + int r; + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->flying_transfers_lock); + r = handle_timeouts_locked(ctx); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} + +#ifdef USBI_TIMERFD_AVAILABLE +static int handle_timerfd_trigger(struct libusb_context *ctx) +{ + int r; + + r = disarm_timerfd(ctx); + if (r < 0) + return r; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* process the timeout that just happened */ + r = handle_timeouts_locked(ctx); + if (r < 0) + goto out; + + /* arm for next timeout*/ + r = arm_timerfd_for_next_timeout(ctx); + +out: + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} +#endif + +/* do the actual event handling. assumes that no other thread is concurrently + * doing the same thing. */ +static int handle_events(struct libusb_context *ctx, struct timeval *tv) +{ + int r; + struct usbi_pollfd *ipollfd; + POLL_NFDS_TYPE nfds = 0; + struct pollfd *fds; + int i = -1; + int timeout_ms; + + usbi_mutex_lock(&ctx->pollfds_lock); + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + nfds++; + + /* TODO: malloc when number of fd's changes, not on every poll */ + fds = malloc(sizeof(*fds) * nfds); + if (!fds) { + usbi_mutex_unlock(&ctx->pollfds_lock); + return LIBUSB_ERROR_NO_MEM; + } + + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) { + struct libusb_pollfd *pollfd = &ipollfd->pollfd; + int fd = pollfd->fd; + i++; + fds[i].fd = fd; + fds[i].events = pollfd->events; + fds[i].revents = 0; + } + usbi_mutex_unlock(&ctx->pollfds_lock); + + timeout_ms = (tv->tv_sec * 1000) + (tv->tv_usec / 1000); + + /* round up to next millisecond */ + if (tv->tv_usec % 1000) + timeout_ms++; + + usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms); + r = usbi_poll(fds, nfds, timeout_ms); + usbi_dbg("poll() returned %d", r); + if (r == 0) { + free(fds); + return handle_timeouts(ctx); + } else if (r == -1 && errno == EINTR) { + free(fds); + return LIBUSB_ERROR_INTERRUPTED; + } else if (r < 0) { + free(fds); + usbi_err(ctx, "poll failed %d err=%d\n", r, errno); + return LIBUSB_ERROR_IO; + } + + /* fd[0] is always the ctrl pipe */ + if (fds[0].revents) { + /* another thread wanted to interrupt event handling, and it succeeded! + * handle any other events that cropped up at the same time, and + * simply return */ + usbi_dbg("caught a fish on the control pipe"); + + if (r == 1) { + r = 0; + goto handled; + } else { + /* prevent OS backend from trying to handle events on ctrl pipe */ + fds[0].revents = 0; + r--; + } + } + +#ifdef USBI_TIMERFD_AVAILABLE + /* on timerfd configurations, fds[1] is the timerfd */ + if (usbi_using_timerfd(ctx) && fds[1].revents) { + /* timerfd indicates that a timeout has expired */ + int ret; + usbi_dbg("timerfd triggered"); + + ret = handle_timerfd_trigger(ctx); + if (ret < 0) { + /* return error code */ + r = ret; + goto handled; + } else if (r == 1) { + /* no more active file descriptors, nothing more to do */ + r = 0; + goto handled; + } else { + /* more events pending... + * prevent OS backend from trying to handle events on timerfd */ + fds[1].revents = 0; + r--; + } + } +#endif + + r = usbi_backend->handle_events(ctx, fds, nfds, r); + if (r) + usbi_err(ctx, "backend handle_events failed with error %d", r); + +handled: + free(fds); + return r; +} + +/* returns the smallest of: + * 1. timeout of next URB + * 2. user-supplied timeout + * returns 1 if there is an already-expired timeout, otherwise returns 0 + * and populates out + */ +static int get_next_timeout(libusb_context *ctx, struct timeval *tv, + struct timeval *out) +{ + struct timeval timeout; + int r = libusb_get_next_timeout(ctx, &timeout); + if (r) { + /* timeout already expired? */ + if (!timerisset(&timeout)) + return 1; + + /* choose the smallest of next URB timeout or user specified timeout */ + if (timercmp(&timeout, tv, <)) + *out = timeout; + else + *out = *tv; + } else { + *out = *tv; + } + return 0; +} + +/** \ingroup poll + * Handle any pending events. + * + * libusb determines "pending events" by checking if any timeouts have expired + * and by checking the set of file descriptors for activity. + * + * If a zero timeval is passed, this function will handle any already-pending + * events and then immediately return in non-blocking style. + * + * If a non-zero timeval is passed and no events are currently pending, this + * function will block waiting for events to handle up until the specified + * timeout. If an event arrives or a signal is raised, this function will + * return early. + * + * If the parameter completed is not NULL then after obtaining the event + * handling lock this function will return immediately if the integer + * pointed to is not 0. This allows for race free waiting for the completion + * of a specific transfer. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or an all zero + * timeval struct for non-blocking mode + * \param completed pointer to completion integer to check, or NULL + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see \ref mtasync + */ +int API_EXPORTED libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed) +{ + int r; + struct timeval poll_timeout; + + USBI_GET_CONTEXT(ctx); + r = get_next_timeout(ctx, tv, &poll_timeout); + if (r) { + /* timeout already expired */ + return handle_timeouts(ctx); + } + +retry: + if (libusb_try_lock_events(ctx) == 0) { + if (completed == NULL || !*completed) { + /* we obtained the event lock: do our own event handling */ + usbi_dbg("doing our own event handling"); + r = handle_events(ctx, &poll_timeout); + } + libusb_unlock_events(ctx); + return r; + } + + /* another thread is doing event handling. wait for thread events that + * notify event completion. */ + libusb_lock_event_waiters(ctx); + + if (completed && *completed) + goto already_done; + + if (!libusb_event_handler_active(ctx)) { + /* we hit a race: whoever was event handling earlier finished in the + * time it took us to reach this point. try the cycle again. */ + libusb_unlock_event_waiters(ctx); + usbi_dbg("event handler was active but went away, retrying"); + goto retry; + } + + usbi_dbg("another thread is doing event handling"); + r = libusb_wait_for_event(ctx, &poll_timeout); + +already_done: + libusb_unlock_event_waiters(ctx); + + if (r < 0) + return r; + else if (r == 1) + return handle_timeouts(ctx); + else + return 0; +} + +/** \ingroup poll + * Handle any pending events + * + * Like libusb_handle_events_timeout_completed(), but without the completed + * parameter, calling this function is equivalent to calling + * libusb_handle_events_timeout_completed() with a NULL completed parameter. + * + * This function is kept primarily for backwards compatibility. + * All new code should call libusb_handle_events_completed() or + * libusb_handle_events_timeout_completed() to avoid race conditions. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or an all zero + * timeval struct for non-blocking mode + * \returns 0 on success, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv) +{ + return libusb_handle_events_timeout_completed(ctx, tv, NULL); +} + +/** \ingroup poll + * Handle any pending events in blocking mode. There is currently a timeout + * hardcoded at 60 seconds but we plan to make it unlimited in future. For + * finer control over whether this function is blocking or non-blocking, or + * for control over the timeout, use libusb_handle_events_timeout_completed() + * instead. + * + * This function is kept primarily for backwards compatibility. + * All new code should call libusb_handle_events_completed() or + * libusb_handle_events_timeout_completed() to avoid race conditions. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 on success, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_handle_events(libusb_context *ctx) +{ + struct timeval tv; + tv.tv_sec = 60; + tv.tv_usec = 0; + return libusb_handle_events_timeout_completed(ctx, &tv, NULL); +} + +/** \ingroup poll + * Handle any pending events in blocking mode. + * + * Like libusb_handle_events(), with the addition of a completed parameter + * to allow for race free waiting for the completion of a specific transfer. + * + * See libusb_handle_events_timeout_completed() for details on the completed + * parameter. + * + * \param ctx the context to operate on, or NULL for the default context + * \param completed pointer to completion integer to check, or NULL + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see \ref mtasync + */ +int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx, + int *completed) +{ + struct timeval tv; + tv.tv_sec = 60; + tv.tv_usec = 0; + return libusb_handle_events_timeout_completed(ctx, &tv, completed); +} + +/** \ingroup poll + * Handle any pending events by polling file descriptors, without checking if + * any other threads are already doing so. Must be called with the event lock + * held, see libusb_lock_events(). + * + * This function is designed to be called under the situation where you have + * taken the event lock and are calling poll()/select() directly on libusb's + * file descriptors (as opposed to using libusb_handle_events() or similar). + * You detect events on libusb's descriptors, so you then call this function + * with a zero timeout value (while still holding the event lock). + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or zero for + * non-blocking mode + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see \ref mtasync + */ +int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv) +{ + int r; + struct timeval poll_timeout; + + USBI_GET_CONTEXT(ctx); + r = get_next_timeout(ctx, tv, &poll_timeout); + if (r) { + /* timeout already expired */ + return handle_timeouts(ctx); + } + + return handle_events(ctx, &poll_timeout); +} + +/** \ingroup poll + * Determines whether your application must apply special timing considerations + * when monitoring libusb's file descriptors. + * + * This function is only useful for applications which retrieve and poll + * libusb's file descriptors in their own main loop (\ref pollmain). + * + * Ordinarily, libusb's event handler needs to be called into at specific + * moments in time (in addition to times when there is activity on the file + * descriptor set). The usual approach is to use libusb_get_next_timeout() + * to learn about when the next timeout occurs, and to adjust your + * poll()/select() timeout accordingly so that you can make a call into the + * library at that time. + * + * Some platforms supported by libusb do not come with this baggage - any + * events relevant to timing will be represented by activity on the file + * descriptor set, and libusb_get_next_timeout() will always return 0. + * This function allows you to detect whether you are running on such a + * platform. + * + * Since v1.0.5. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 if you must call into libusb at times determined by + * libusb_get_next_timeout(), or 1 if all timeout events are handled internally + * or through regular activity on the file descriptors. + * \see \ref pollmain "Polling libusb file descriptors for event handling" + */ +int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx) +{ +#if defined(USBI_TIMERFD_AVAILABLE) + USBI_GET_CONTEXT(ctx); + return usbi_using_timerfd(ctx); +#else + (void)ctx; + return 0; +#endif +} + +/** \ingroup poll + * Determine the next internal timeout that libusb needs to handle. You only + * need to use this function if you are calling poll() or select() or similar + * on libusb's file descriptors yourself - you do not need to use it if you + * are calling libusb_handle_events() or a variant directly. + * + * You should call this function in your main loop in order to determine how + * long to wait for select() or poll() to return results. libusb needs to be + * called into at this timeout, so you should use it as an upper bound on + * your select() or poll() call. + * + * When the timeout has expired, call into libusb_handle_events_timeout() + * (perhaps in non-blocking mode) so that libusb can handle the timeout. + * + * This function may return 1 (success) and an all-zero timeval. If this is + * the case, it indicates that libusb has a timeout that has already expired + * so you should call libusb_handle_events_timeout() or similar immediately. + * A return code of 0 indicates that there are no pending timeouts. + * + * On some platforms, this function will always returns 0 (no pending + * timeouts). See \ref polltime. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv output location for a relative time against the current + * clock in which libusb must be called into in order to process timeout events + * \returns 0 if there are no pending timeouts, 1 if a timeout was returned, + * or LIBUSB_ERROR_OTHER on failure + */ +int API_EXPORTED libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv) +{ + struct usbi_transfer *transfer; + struct timespec cur_ts; + struct timeval cur_tv; + struct timeval *next_timeout; + int r; + int found = 0; + + USBI_GET_CONTEXT(ctx); + if (usbi_using_timerfd(ctx)) + return 0; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + if (list_empty(&ctx->flying_transfers)) { + usbi_mutex_unlock(&ctx->flying_transfers_lock); + usbi_dbg("no URBs, no timeout!"); + return 0; + } + + /* find next transfer which hasn't already been processed as timed out */ + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + if (transfer->flags & (USBI_TRANSFER_TIMED_OUT | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) + continue; + + /* no timeout for this transfer? */ + if (!timerisset(&transfer->timeout)) + continue; + + found = 1; + break; + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (!found) { + usbi_dbg("no URB with timeout or all handled by OS; no timeout!"); + return 0; + } + + next_timeout = &transfer->timeout; + + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts); + if (r < 0) { + usbi_err(ctx, "failed to read monotonic clock, errno=%d", errno); + return LIBUSB_ERROR_OTHER; + } + TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts); + + if (!timercmp(&cur_tv, next_timeout, <)) { + usbi_dbg("first timeout already expired"); + timerclear(tv); + } else { + timersub(next_timeout, &cur_tv, tv); + usbi_dbg("next timeout in %d.%06ds", tv->tv_sec, tv->tv_usec); + } + + return 1; +} + +/** \ingroup poll + * Register notification functions for file descriptor additions/removals. + * These functions will be invoked for every new or removed file descriptor + * that libusb uses as an event source. + * + * To remove notifiers, pass NULL values for the function pointers. + * + * Note that file descriptors may have been added even before you register + * these notifiers (e.g. at libusb_init() time). + * + * Additionally, note that the removal notifier may be called during + * libusb_exit() (e.g. when it is closing file descriptors that were opened + * and added to the poll set at libusb_init() time). If you don't want this, + * remove the notifiers immediately before calling libusb_exit(). + * + * \param ctx the context to operate on, or NULL for the default context + * \param added_cb pointer to function for addition notifications + * \param removed_cb pointer to function for removal notifications + * \param user_data User data to be passed back to callbacks (useful for + * passing context information) + */ +void API_EXPORTED libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data) +{ + USBI_GET_CONTEXT(ctx); + ctx->fd_added_cb = added_cb; + ctx->fd_removed_cb = removed_cb; + ctx->fd_cb_user_data = user_data; +} + +/* Add a file descriptor to the list of file descriptors to be monitored. + * events should be specified as a bitmask of events passed to poll(), e.g. + * POLLIN and/or POLLOUT. */ +int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events) +{ + struct usbi_pollfd *ipollfd = malloc(sizeof(*ipollfd)); + if (!ipollfd) + return LIBUSB_ERROR_NO_MEM; + + usbi_dbg("add fd %d events %d", fd, events); + ipollfd->pollfd.fd = fd; + ipollfd->pollfd.events = events; + usbi_mutex_lock(&ctx->pollfds_lock); + list_add_tail(&ipollfd->list, &ctx->pollfds); + usbi_mutex_unlock(&ctx->pollfds_lock); + + if (ctx->fd_added_cb) + ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data); + return 0; +} + +/* Remove a file descriptor from the list of file descriptors to be polled. */ +void usbi_remove_pollfd(struct libusb_context *ctx, int fd) +{ + struct usbi_pollfd *ipollfd; + int found = 0; + + usbi_dbg("remove fd %d", fd); + usbi_mutex_lock(&ctx->pollfds_lock); + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + if (ipollfd->pollfd.fd == fd) { + found = 1; + break; + } + + if (!found) { + usbi_dbg("couldn't find fd %d to remove", fd); + usbi_mutex_unlock(&ctx->pollfds_lock); + return; + } + + list_del(&ipollfd->list); + usbi_mutex_unlock(&ctx->pollfds_lock); + free(ipollfd); + if (ctx->fd_removed_cb) + ctx->fd_removed_cb(fd, ctx->fd_cb_user_data); +} + +/** \ingroup poll + * Retrieve a list of file descriptors that should be polled by your main loop + * as libusb event sources. + * + * The returned list is NULL-terminated and should be freed with free() when + * done. The actual list contents must not be touched. + * + * As file descriptors are a Unix-specific concept, this function is not + * available on Windows and will always return NULL. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns a NULL-terminated list of libusb_pollfd structures + * \returns NULL on error + * \returns NULL on platforms where the functionality is not available + */ +DEFAULT_VISIBILITY +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx) +{ +#ifndef OS_WINDOWS + struct libusb_pollfd **ret = NULL; + struct usbi_pollfd *ipollfd; + size_t i = 0; + size_t cnt = 0; + USBI_GET_CONTEXT(ctx); + + usbi_mutex_lock(&ctx->pollfds_lock); + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + cnt++; + + ret = calloc(cnt + 1, sizeof(struct libusb_pollfd *)); + if (!ret) + goto out; + + list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd) + ret[i++] = (struct libusb_pollfd *) ipollfd; + ret[cnt] = NULL; + +out: + usbi_mutex_unlock(&ctx->pollfds_lock); + return (const struct libusb_pollfd **) ret; +#else + usbi_err(ctx, "external polling of libusb's internal descriptors "\ + "is not yet supported on Windows platforms"); + return NULL; +#endif +} + +/* Backends call this from handle_events to report disconnection of a device. + * The transfers get cancelled appropriately. + */ +void usbi_handle_disconnect(struct libusb_device_handle *handle) +{ + struct usbi_transfer *cur; + struct usbi_transfer *to_cancel; + + usbi_dbg("device %d.%d", + handle->dev->bus_number, handle->dev->device_address); + + /* terminate all pending transfers with the LIBUSB_TRANSFER_NO_DEVICE + * status code. + * + * this is a bit tricky because: + * 1. we can't do transfer completion while holding flying_transfers_lock + * 2. the transfers list can change underneath us - if we were to build a + * list of transfers to complete (while holding look), the situation + * might be different by the time we come to free them + * + * so we resort to a loop-based approach as below + * FIXME: is this still potentially racy? + */ + + while (1) { + usbi_mutex_lock(&HANDLE_CTX(handle)->flying_transfers_lock); + to_cancel = NULL; + list_for_each_entry(cur, &HANDLE_CTX(handle)->flying_transfers, list, struct usbi_transfer) + if (USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == handle) { + to_cancel = cur; + break; + } + usbi_mutex_unlock(&HANDLE_CTX(handle)->flying_transfers_lock); + + if (!to_cancel) + break; + + usbi_backend->clear_transfer_priv(to_cancel); + usbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE); + } + +} diff --git a/libusb/libusb/libusb/libusb-1.0.def b/libusb/libusb/libusb/libusb-1.0.def new file mode 100644 index 0000000..1d6a5d2 --- /dev/null +++ b/libusb/libusb/libusb/libusb-1.0.def @@ -0,0 +1,120 @@ +LIBRARY +EXPORTS + libusb_alloc_transfer + libusb_alloc_transfer@4 = libusb_alloc_transfer + libusb_attach_kernel_driver + libusb_attach_kernel_driver@8 = libusb_attach_kernel_driver + libusb_bulk_transfer + libusb_bulk_transfer@24 = libusb_bulk_transfer + libusb_cancel_transfer + libusb_cancel_transfer@4 = libusb_cancel_transfer + libusb_claim_interface + libusb_claim_interface@8 = libusb_claim_interface + libusb_clear_halt + libusb_clear_halt@8 = libusb_clear_halt + libusb_close + libusb_close@4 = libusb_close + libusb_control_transfer + libusb_control_transfer@32 = libusb_control_transfer + libusb_detach_kernel_driver + libusb_detach_kernel_driver@8 = libusb_detach_kernel_driver + libusb_error_name + libusb_error_name@4 = libusb_error_name + libusb_event_handler_active + libusb_event_handler_active@4 = libusb_event_handler_active + libusb_event_handling_ok + libusb_event_handling_ok@4 = libusb_event_handling_ok + libusb_exit + libusb_exit@4 = libusb_exit + libusb_free_config_descriptor + libusb_free_config_descriptor@4 = libusb_free_config_descriptor + libusb_free_device_list + libusb_free_device_list@8 = libusb_free_device_list + libusb_free_transfer + libusb_free_transfer@4 = libusb_free_transfer + libusb_get_active_config_descriptor + libusb_get_active_config_descriptor@8 = libusb_get_active_config_descriptor + libusb_get_bus_number + libusb_get_bus_number@4 = libusb_get_bus_number + libusb_get_config_descriptor + libusb_get_config_descriptor@12 = libusb_get_config_descriptor + libusb_get_config_descriptor_by_value + libusb_get_config_descriptor_by_value@12 = libusb_get_config_descriptor_by_value + libusb_get_configuration + libusb_get_configuration@8 = libusb_get_configuration + libusb_get_device + libusb_get_device@4 = libusb_get_device + libusb_get_device_address + libusb_get_device_address@4 = libusb_get_device_address + libusb_get_device_descriptor + libusb_get_device_descriptor@8 = libusb_get_device_descriptor + libusb_get_device_list + libusb_get_device_list@8 = libusb_get_device_list + libusb_get_device_speed + libusb_get_device_speed@4 = libusb_get_device_speed + libusb_get_max_iso_packet_size + libusb_get_max_iso_packet_size@8 = libusb_get_max_iso_packet_size + libusb_get_max_packet_size + libusb_get_max_packet_size@8 = libusb_get_max_packet_size + libusb_get_next_timeout + libusb_get_next_timeout@8 = libusb_get_next_timeout + libusb_get_pollfds + libusb_get_pollfds@4 = libusb_get_pollfds + libusb_get_string_descriptor_ascii + libusb_get_string_descriptor_ascii@16 = libusb_get_string_descriptor_ascii + libusb_get_version + libusb_get_version@0 = libusb_get_version + libusb_handle_events + libusb_handle_events@4 = libusb_handle_events + libusb_handle_events_completed + libusb_handle_events_completed@8 = libusb_handle_events_completed + libusb_handle_events_locked + libusb_handle_events_locked@8 = libusb_handle_events_locked + libusb_handle_events_timeout + libusb_handle_events_timeout@8 = libusb_handle_events_timeout + libusb_handle_events_timeout_completed + libusb_handle_events_timeout_completed@12 = libusb_handle_events_timeout_completed + libusb_has_capability + libusb_has_capability@4 = libusb_has_capability + libusb_init + libusb_init@4 = libusb_init + libusb_interrupt_transfer + libusb_interrupt_transfer@24 = libusb_interrupt_transfer + libusb_kernel_driver_active + libusb_kernel_driver_active@8 = libusb_kernel_driver_active + libusb_lock_event_waiters + libusb_lock_event_waiters@4 = libusb_lock_event_waiters + libusb_lock_events + libusb_lock_events@4 = libusb_lock_events + libusb_open + libusb_open@8 = libusb_open + libusb_open_device_with_vid_pid + libusb_open_device_with_vid_pid@12 = libusb_open_device_with_vid_pid + libusb_pollfds_handle_timeouts + libusb_pollfds_handle_timeouts@4 = libusb_pollfds_handle_timeouts + libusb_ref_device + libusb_ref_device@4 = libusb_ref_device + libusb_release_interface + libusb_release_interface@8 = libusb_release_interface + libusb_reset_device + libusb_reset_device@4 = libusb_reset_device + libusb_set_configuration + libusb_set_configuration@8 = libusb_set_configuration + libusb_set_debug + libusb_set_debug@8 = libusb_set_debug + libusb_set_interface_alt_setting + libusb_set_interface_alt_setting@12 = libusb_set_interface_alt_setting + libusb_set_pollfd_notifiers + libusb_set_pollfd_notifiers@16 = libusb_set_pollfd_notifiers + libusb_submit_transfer + libusb_submit_transfer@4 = libusb_submit_transfer + libusb_try_lock_events + libusb_try_lock_events@4 = libusb_try_lock_events + libusb_unlock_event_waiters + libusb_unlock_event_waiters@4 = libusb_unlock_event_waiters + libusb_unlock_events + libusb_unlock_events@4 = libusb_unlock_events + libusb_unref_device + libusb_unref_device@4 = libusb_unref_device + libusb_wait_for_event + libusb_wait_for_event@8 = libusb_wait_for_event diff --git a/libusb/libusb/libusb/libusb-1.0.rc b/libusb/libusb/libusb/libusb-1.0.rc new file mode 100644 index 0000000..a59a430 --- /dev/null +++ b/libusb/libusb/libusb/libusb-1.0.rc @@ -0,0 +1,56 @@ +/* + * For Windows: input this file to the Resoure Compiler to produce a binary + * .res file. This is then embedded in the resultant library (like any other + * compilation object). + * The information can then be queried using standard APIs and can also be + * viewed with utilities such as Windows Explorer. + */ +#include "winresrc.h" + +#include "version.h" +#ifndef LIBUSB_VERSIONSTRING +#define LU_STR(s) #s +#define LU_XSTR(s) LU_STR(s) +#if LIBUSB_NANO > 0 +#define LIBUSB_VERSIONSTRING LU_XSTR(LIBUSB_MAJOR) "." LU_XSTR(LIBUSB_MINOR) "." LU_XSTR(LIBUSB_MICRO) "." LU_XSTR(LIBUSB_NANO) LIBUSB_RC "\0" +#else +#define LIBUSB_VERSIONSTRING LU_XSTR(LIBUSB_MAJOR) "." LU_XSTR(LIBUSB_MINOR) "." LU_XSTR(LIBUSB_MICRO) LIBUSB_RC "\0" +#endif +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION LIBUSB_MAJOR,LIBUSB_MINOR,LIBUSB_MICRO,LIBUSB_NANO + PRODUCTVERSION LIBUSB_MAJOR,LIBUSB_MINOR,LIBUSB_MICRO,LIBUSB_NANO + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "libusb.org\0" + VALUE "FileDescription", "C library for writing portable USB drivers in userspace\0" + VALUE "FileVersion", LIBUSB_VERSIONSTRING + VALUE "InternalName", "libusb\0" + VALUE "LegalCopyright", "See individual source files, GNU LGPL v2.1 or later.\0" + VALUE "LegalTrademarks", "http://www.gnu.org/licenses/lgpl-2.1.html\0" + VALUE "OriginalFilename", "libusb-1.0.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "libusb-1.0\0" + VALUE "ProductVersion", LIBUSB_VERSIONSTRING + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/libusb/libusb/libusb/libusb.h b/libusb/libusb/libusb/libusb.h new file mode 100644 index 0000000..58b406f --- /dev/null +++ b/libusb/libusb/libusb/libusb.h @@ -0,0 +1,1443 @@ +/* + * Public libusb header file + * Copyright (C) 2007-2008 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_H +#define LIBUSB_H + +#ifdef _MSC_VER +/* on MS environments, the inline keyword is available in C++ only */ +#define inline __inline +/* ssize_t is also not available (copy/paste from MinGW) */ +#ifndef _SSIZE_T_DEFINED +#define _SSIZE_T_DEFINED +#undef ssize_t +#ifdef _WIN64 + typedef __int64 ssize_t; +#else + typedef int ssize_t; +#endif /* _WIN64 */ +#endif /* _SSIZE_T_DEFINED */ +#endif /* _MSC_VER */ + +/* stdint.h is also not usually available on MS */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#else +#include +#endif + +#include +#include +#include + +#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) +#include +#endif + +/* 'interface' might be defined as a macro on Windows, so we need to + * undefine it so as not to break the current libusb API, because + * libusb_config_descriptor has an 'interface' member + * As this can be problematic if you include windows.h after libusb.h + * in your sources, we force windows.h to be included first. */ +#if defined(_WIN32) || defined(__CYGWIN__) +#include +#if defined(interface) +#undef interface +#endif +#endif + +/** \def LIBUSB_CALL + * \ingroup misc + * libusb's Windows calling convention. + * + * Under Windows, the selection of available compilers and configurations + * means that, unlike other platforms, there is not one true calling + * convention (calling convention: the manner in which parameters are + * passed to funcions in the generated assembly code). + * + * Matching the Windows API itself, libusb uses the WINAPI convention (which + * translates to the stdcall convention) and guarantees that the + * library is compiled in this way. The public header file also includes + * appropriate annotations so that your own software will use the right + * convention, even if another convention is being used by default within + * your codebase. + * + * The one consideration that you must apply in your software is to mark + * all functions which you use as libusb callbacks with this LIBUSB_CALL + * annotation, so that they too get compiled for the correct calling + * convention. + * + * On non-Windows operating systems, this macro is defined as nothing. This + * means that you can apply it to your code without worrying about + * cross-platform compatibility. + */ +/* LIBUSB_CALL must be defined on both definition and declaration of libusb + * functions. You'd think that declaration would be enough, but cygwin will + * complain about conflicting types unless both are marked this way. + * The placement of this macro is important too; it must appear after the + * return type, before the function name. See internal documentation for + * API_EXPORTED. + */ +#if defined(_WIN32) || defined(__CYGWIN__) +#define LIBUSB_CALL WINAPI +#else +#define LIBUSB_CALL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** \def libusb_cpu_to_le16 + * \ingroup misc + * Convert a 16-bit value from host-endian to little-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the host-endian value to convert + * \returns the value in little-endian byte order + */ +static inline uint16_t libusb_cpu_to_le16(const uint16_t x) +{ + union { + uint8_t b8[2]; + uint16_t b16; + } _tmp; + _tmp.b8[1] = x >> 8; + _tmp.b8[0] = x & 0xff; + return _tmp.b16; +} + +/** \def libusb_le16_to_cpu + * \ingroup misc + * Convert a 16-bit value from little-endian to host-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the little-endian value to convert + * \returns the value in host-endian byte order + */ +#define libusb_le16_to_cpu libusb_cpu_to_le16 + +/* standard USB stuff */ + +/** \ingroup desc + * Device and/or Interface Class codes */ +enum libusb_class_code { + /** In the context of a \ref libusb_device_descriptor "device descriptor", + * this bDeviceClass value indicates that each interface specifies its + * own class information and all interfaces operate independently. + */ + LIBUSB_CLASS_PER_INTERFACE = 0, + + /** Audio class */ + LIBUSB_CLASS_AUDIO = 1, + + /** Communications class */ + LIBUSB_CLASS_COMM = 2, + + /** Human Interface Device class */ + LIBUSB_CLASS_HID = 3, + + /** Physical */ + LIBUSB_CLASS_PHYSICAL = 5, + + /** Printer class */ + LIBUSB_CLASS_PRINTER = 7, + + /** Image class */ + LIBUSB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */ + LIBUSB_CLASS_IMAGE = 6, + + /** Mass storage class */ + LIBUSB_CLASS_MASS_STORAGE = 8, + + /** Hub class */ + LIBUSB_CLASS_HUB = 9, + + /** Data class */ + LIBUSB_CLASS_DATA = 10, + + /** Smart Card */ + LIBUSB_CLASS_SMART_CARD = 0x0b, + + /** Content Security */ + LIBUSB_CLASS_CONTENT_SECURITY = 0x0d, + + /** Video */ + LIBUSB_CLASS_VIDEO = 0x0e, + + /** Personal Healthcare */ + LIBUSB_CLASS_PERSONAL_HEALTHCARE = 0x0f, + + /** Diagnostic Device */ + LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, + + /** Wireless class */ + LIBUSB_CLASS_WIRELESS = 0xe0, + + /** Application class */ + LIBUSB_CLASS_APPLICATION = 0xfe, + + /** Class is vendor-specific */ + LIBUSB_CLASS_VENDOR_SPEC = 0xff +}; + +/** \ingroup desc + * Descriptor types as defined by the USB specification. */ +enum libusb_descriptor_type { + /** Device descriptor. See libusb_device_descriptor. */ + LIBUSB_DT_DEVICE = 0x01, + + /** Configuration descriptor. See libusb_config_descriptor. */ + LIBUSB_DT_CONFIG = 0x02, + + /** String descriptor */ + LIBUSB_DT_STRING = 0x03, + + /** Interface descriptor. See libusb_interface_descriptor. */ + LIBUSB_DT_INTERFACE = 0x04, + + /** Endpoint descriptor. See libusb_endpoint_descriptor. */ + LIBUSB_DT_ENDPOINT = 0x05, + + /** HID descriptor */ + LIBUSB_DT_HID = 0x21, + + /** HID report descriptor */ + LIBUSB_DT_REPORT = 0x22, + + /** Physical descriptor */ + LIBUSB_DT_PHYSICAL = 0x23, + + /** Hub descriptor */ + LIBUSB_DT_HUB = 0x29, +}; + +/* Descriptor sizes per descriptor type */ +#define LIBUSB_DT_DEVICE_SIZE 18 +#define LIBUSB_DT_CONFIG_SIZE 9 +#define LIBUSB_DT_INTERFACE_SIZE 9 +#define LIBUSB_DT_ENDPOINT_SIZE 7 +#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define LIBUSB_DT_HUB_NONVAR_SIZE 7 + +#define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define LIBUSB_ENDPOINT_DIR_MASK 0x80 + +/** \ingroup desc + * Endpoint direction. Values for bit 7 of the + * \ref libusb_endpoint_descriptor::bEndpointAddress "endpoint address" scheme. + */ +enum libusb_endpoint_direction { + /** In: device-to-host */ + LIBUSB_ENDPOINT_IN = 0x80, + + /** Out: host-to-device */ + LIBUSB_ENDPOINT_OUT = 0x00 +}; + +#define LIBUSB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ + +/** \ingroup desc + * Endpoint transfer type. Values for bits 0:1 of the + * \ref libusb_endpoint_descriptor::bmAttributes "endpoint attributes" field. + */ +enum libusb_transfer_type { + /** Control endpoint */ + LIBUSB_TRANSFER_TYPE_CONTROL = 0, + + /** Isochronous endpoint */ + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, + + /** Bulk endpoint */ + LIBUSB_TRANSFER_TYPE_BULK = 2, + + /** Interrupt endpoint */ + LIBUSB_TRANSFER_TYPE_INTERRUPT = 3 +}; + +/** \ingroup misc + * Standard requests, as defined in table 9-3 of the USB2 specifications */ +enum libusb_standard_request { + /** Request status of the specific recipient */ + LIBUSB_REQUEST_GET_STATUS = 0x00, + + /** Clear or disable a specific feature */ + LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, + + /* 0x02 is reserved */ + + /** Set or enable a specific feature */ + LIBUSB_REQUEST_SET_FEATURE = 0x03, + + /* 0x04 is reserved */ + + /** Set device address for all future accesses */ + LIBUSB_REQUEST_SET_ADDRESS = 0x05, + + /** Get the specified descriptor */ + LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, + + /** Used to update existing descriptors or add new descriptors */ + LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, + + /** Get the current device configuration value */ + LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, + + /** Set device configuration */ + LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, + + /** Return the selected alternate setting for the specified interface */ + LIBUSB_REQUEST_GET_INTERFACE = 0x0A, + + /** Select an alternate interface for the specified interface */ + LIBUSB_REQUEST_SET_INTERFACE = 0x0B, + + /** Set then report an endpoint's synchronization frame */ + LIBUSB_REQUEST_SYNCH_FRAME = 0x0C, +}; + +/** \ingroup misc + * Request type bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. */ +enum libusb_request_type { + /** Standard */ + LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), + + /** Class */ + LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), + + /** Vendor */ + LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), + + /** Reserved */ + LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5) +}; + +/** \ingroup misc + * Recipient bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. Values 4 through 31 are reserved. */ +enum libusb_request_recipient { + /** Device */ + LIBUSB_RECIPIENT_DEVICE = 0x00, + + /** Interface */ + LIBUSB_RECIPIENT_INTERFACE = 0x01, + + /** Endpoint */ + LIBUSB_RECIPIENT_ENDPOINT = 0x02, + + /** Other */ + LIBUSB_RECIPIENT_OTHER = 0x03, +}; + +#define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C + +/** \ingroup desc + * Synchronization type for isochronous endpoints. Values for bits 2:3 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_sync_type { + /** No synchronization */ + LIBUSB_ISO_SYNC_TYPE_NONE = 0, + + /** Asynchronous */ + LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, + + /** Adaptive */ + LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, + + /** Synchronous */ + LIBUSB_ISO_SYNC_TYPE_SYNC = 3 +}; + +#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 + +/** \ingroup desc + * Usage type for isochronous endpoints. Values for bits 4:5 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_usage_type { + /** Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_DATA = 0, + + /** Feedback endpoint */ + LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, + + /** Implicit feedback Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2, +}; + +/** \ingroup desc + * A structure representing the standard USB device descriptor. This + * descriptor is documented in section 9.6.1 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_device_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this + * context. */ + uint8_t bDescriptorType; + + /** USB specification release number in binary-coded decimal. A value of + * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */ + uint16_t bcdUSB; + + /** USB-IF class code for the device. See \ref libusb_class_code. */ + uint8_t bDeviceClass; + + /** USB-IF subclass code for the device, qualified by the bDeviceClass + * value */ + uint8_t bDeviceSubClass; + + /** USB-IF protocol code for the device, qualified by the bDeviceClass and + * bDeviceSubClass values */ + uint8_t bDeviceProtocol; + + /** Maximum packet size for endpoint 0 */ + uint8_t bMaxPacketSize0; + + /** USB-IF vendor ID */ + uint16_t idVendor; + + /** USB-IF product ID */ + uint16_t idProduct; + + /** Device release number in binary-coded decimal */ + uint16_t bcdDevice; + + /** Index of string descriptor describing manufacturer */ + uint8_t iManufacturer; + + /** Index of string descriptor describing product */ + uint8_t iProduct; + + /** Index of string descriptor containing device serial number */ + uint8_t iSerialNumber; + + /** Number of possible configurations */ + uint8_t bNumConfigurations; +}; + +/** \ingroup desc + * A structure representing the standard USB endpoint descriptor. This + * descriptor is documented in section 9.6.3 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_endpoint_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in + * this context. */ + uint8_t bDescriptorType; + + /** The address of the endpoint described by this descriptor. Bits 0:3 are + * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction, + * see \ref libusb_endpoint_direction. + */ + uint8_t bEndpointAddress; + + /** Attributes which apply to the endpoint when it is configured using + * the bConfigurationValue. Bits 0:1 determine the transfer type and + * correspond to \ref libusb_transfer_type. Bits 2:3 are only used for + * isochronous endpoints and correspond to \ref libusb_iso_sync_type. + * Bits 4:5 are also only used for isochronous endpoints and correspond to + * \ref libusb_iso_usage_type. Bits 6:7 are reserved. + */ + uint8_t bmAttributes; + + /** Maximum packet size this endpoint is capable of sending/receiving. */ + uint16_t wMaxPacketSize; + + /** Interval for polling endpoint for data transfers. */ + uint8_t bInterval; + + /** For audio devices only: the rate at which synchronization feedback + * is provided. */ + uint8_t bRefresh; + + /** For audio devices only: the address if the synch endpoint */ + uint8_t bSynchAddress; + + /** Extra descriptors. If libusb encounters unknown endpoint descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A structure representing the standard USB interface descriptor. This + * descriptor is documented in section 9.6.5 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_interface_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE + * in this context. */ + uint8_t bDescriptorType; + + /** Number of this interface */ + uint8_t bInterfaceNumber; + + /** Value used to select this alternate setting for this interface */ + uint8_t bAlternateSetting; + + /** Number of endpoints used by this interface (excluding the control + * endpoint). */ + uint8_t bNumEndpoints; + + /** USB-IF class code for this interface. See \ref libusb_class_code. */ + uint8_t bInterfaceClass; + + /** USB-IF subclass code for this interface, qualified by the + * bInterfaceClass value */ + uint8_t bInterfaceSubClass; + + /** USB-IF protocol code for this interface, qualified by the + * bInterfaceClass and bInterfaceSubClass values */ + uint8_t bInterfaceProtocol; + + /** Index of string descriptor describing this interface */ + uint8_t iInterface; + + /** Array of endpoint descriptors. This length of this array is determined + * by the bNumEndpoints field. */ + const struct libusb_endpoint_descriptor *endpoint; + + /** Extra descriptors. If libusb encounters unknown interface descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup desc + * A collection of alternate settings for a particular USB interface. + */ +struct libusb_interface { + /** Array of interface descriptors. The length of this array is determined + * by the num_altsetting field. */ + const struct libusb_interface_descriptor *altsetting; + + /** The number of alternate settings that belong to this interface */ + int num_altsetting; +}; + +/** \ingroup desc + * A structure representing the standard USB configuration descriptor. This + * descriptor is documented in section 9.6.3 of the USB 2.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_config_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG + * in this context. */ + uint8_t bDescriptorType; + + /** Total length of data returned for this configuration */ + uint16_t wTotalLength; + + /** Number of interfaces supported by this configuration */ + uint8_t bNumInterfaces; + + /** Identifier value for this configuration */ + uint8_t bConfigurationValue; + + /** Index of string descriptor describing this configuration */ + uint8_t iConfiguration; + + /** Configuration characteristics */ + uint8_t bmAttributes; + + /** Maximum power consumption of the USB device from this bus in this + * configuration when the device is fully opreation. Expressed in units + * of 2 mA. */ + uint8_t MaxPower; + + /** Array of interfaces supported by this configuration. The length of + * this array is determined by the bNumInterfaces field. */ + const struct libusb_interface *interface; + + /** Extra descriptors. If libusb encounters unknown configuration + * descriptors, it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup asyncio + * Setup packet for control transfers. */ +struct libusb_control_setup { + /** Request type. Bits 0:4 determine recipient, see + * \ref libusb_request_recipient. Bits 5:6 determine type, see + * \ref libusb_request_type. Bit 7 determines data transfer direction, see + * \ref libusb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "LIBUSB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref libusb_standard_request. For other cases, use of this field is + * application-specific. */ + uint8_t bRequest; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ + uint16_t wLength; +}; + +#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup)) + +/* libusb */ + +struct libusb_context; +struct libusb_device; +struct libusb_device_handle; + +/** \ingroup lib + * Structure representing the libusb version. + */ +struct libusb_version { + /** Library major version. */ + const uint16_t major; + + /** Library minor version. */ + const uint16_t minor; + + /** Library micro version. */ + const uint16_t micro; + + /** Library nano version. This field is only nonzero on Windows. */ + const uint16_t nano; + + /** Library release candidate suffix string, e.g. "-rc4". */ + const char *rc; + + /** Output of `git describe --tags` at library build time. */ + const char *describe; +}; + +/** \ingroup lib + * Structure representing a libusb session. The concept of individual libusb + * sessions allows for your program to use two libraries (or dynamically + * load two modules) which both independently use libusb. This will prevent + * interference between the individual libusb users - for example + * libusb_set_debug() will not affect the other user of the library, and + * libusb_exit() will not destroy resources that the other user is still + * using. + * + * Sessions are created by libusb_init() and destroyed through libusb_exit(). + * If your application is guaranteed to only ever include a single libusb + * user (i.e. you), you do not have to worry about contexts: pass NULL in + * every function call where a context is required. The default context + * will be used. + * + * For more information, see \ref contexts. + */ +typedef struct libusb_context libusb_context; + +/** \ingroup dev + * Structure representing a USB device detected on the system. This is an + * opaque type for which you are only ever provided with a pointer, usually + * originating from libusb_get_device_list(). + * + * Certain operations can be performed on a device, but in order to do any + * I/O you will have to first obtain a device handle using libusb_open(). + * + * Devices are reference counted with libusb_device_ref() and + * libusb_device_unref(), and are freed when the reference count reaches 0. + * New devices presented by libusb_get_device_list() have a reference count of + * 1, and libusb_free_device_list() can optionally decrease the reference count + * on all devices in the list. libusb_open() adds another reference which is + * later destroyed by libusb_close(). + */ +typedef struct libusb_device libusb_device; + + +/** \ingroup dev + * Structure representing a handle on a USB device. This is an opaque type for + * which you are only ever provided with a pointer, usually originating from + * libusb_open(). + * + * A device handle is used to perform I/O and other operations. When finished + * with a device handle, you should call libusb_close(). + */ +typedef struct libusb_device_handle libusb_device_handle; + +/** \ingroup dev + * Speed codes. Indicates the speed at which the device is operating. + */ +enum libusb_speed { + /** The OS doesn't report or know the device speed. */ + LIBUSB_SPEED_UNKNOWN = 0, + + /** The device is operating at low speed (1.5MBit/s). */ + LIBUSB_SPEED_LOW = 1, + + /** The device is operating at full speed (12MBit/s). */ + LIBUSB_SPEED_FULL = 2, + + /** The device is operating at high speed (480MBit/s). */ + LIBUSB_SPEED_HIGH = 3, + + /** The device is operating at super speed (5000MBit/s). */ + LIBUSB_SPEED_SUPER = 4, +}; + +/** \ingroup misc + * Error codes. Most libusb functions return 0 on success or one of these + * codes on failure. + * You can call \ref libusb_error_name() to retrieve a string representation + * of an error code. + */ +enum libusb_error { + /** Success (no error) */ + LIBUSB_SUCCESS = 0, + + /** Input/output error */ + LIBUSB_ERROR_IO = -1, + + /** Invalid parameter */ + LIBUSB_ERROR_INVALID_PARAM = -2, + + /** Access denied (insufficient permissions) */ + LIBUSB_ERROR_ACCESS = -3, + + /** No such device (it may have been disconnected) */ + LIBUSB_ERROR_NO_DEVICE = -4, + + /** Entity not found */ + LIBUSB_ERROR_NOT_FOUND = -5, + + /** Resource busy */ + LIBUSB_ERROR_BUSY = -6, + + /** Operation timed out */ + LIBUSB_ERROR_TIMEOUT = -7, + + /** Overflow */ + LIBUSB_ERROR_OVERFLOW = -8, + + /** Pipe error */ + LIBUSB_ERROR_PIPE = -9, + + /** System call interrupted (perhaps due to signal) */ + LIBUSB_ERROR_INTERRUPTED = -10, + + /** Insufficient memory */ + LIBUSB_ERROR_NO_MEM = -11, + + /** Operation not supported or unimplemented on this platform */ + LIBUSB_ERROR_NOT_SUPPORTED = -12, + + /* NB! Remember to update libusb_error_name() + when adding new error codes here. */ + + /** Other error */ + LIBUSB_ERROR_OTHER = -99, +}; + +/** \ingroup asyncio + * Transfer status codes */ +enum libusb_transfer_status { + /** Transfer completed without error. Note that this does not indicate + * that the entire amount of requested data was transferred. */ + LIBUSB_TRANSFER_COMPLETED, + + /** Transfer failed */ + LIBUSB_TRANSFER_ERROR, + + /** Transfer timed out */ + LIBUSB_TRANSFER_TIMED_OUT, + + /** Transfer was cancelled */ + LIBUSB_TRANSFER_CANCELLED, + + /** For bulk/interrupt endpoints: halt condition detected (endpoint + * stalled). For control endpoints: control request not supported. */ + LIBUSB_TRANSFER_STALL, + + /** Device was disconnected */ + LIBUSB_TRANSFER_NO_DEVICE, + + /** Device sent more data than requested */ + LIBUSB_TRANSFER_OVERFLOW, +}; + +/** \ingroup asyncio + * libusb_transfer.flags values */ +enum libusb_transfer_flags { + /** Report short frames as errors */ + LIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0, + + /** Automatically free() transfer buffer during libusb_free_transfer() */ + LIBUSB_TRANSFER_FREE_BUFFER = 1<<1, + + /** Automatically call libusb_free_transfer() after callback returns. + * If this flag is set, it is illegal to call libusb_free_transfer() + * from your transfer callback, as this will result in a double-free + * when this flag is acted upon. */ + LIBUSB_TRANSFER_FREE_TRANSFER = 1<<2, + + /** Terminate transfers that are a multiple of the endpoint's + * wMaxPacketSize with an extra zero length packet. This is useful + * when a device protocol mandates that each logical request is + * terminated by an incomplete packet (i.e. the logical requests are + * not separated by other means). + * + * This flag only affects host-to-device transfers to bulk and interrupt + * endpoints. In other situations, it is ignored. + * + * This flag only affects transfers with a length that is a multiple of + * the endpoint's wMaxPacketSize. On transfers of other lengths, this + * flag has no effect. Therefore, if you are working with a device that + * needs a ZLP whenever the end of the logical request falls on a packet + * boundary, then it is sensible to set this flag on every + * transfer (you do not have to worry about only setting it on transfers + * that end on the boundary). + * + * This flag is currently only supported on Linux. + * On other systems, libusb_submit_transfer() will return + * LIBUSB_ERROR_NOT_SUPPORTED for every transfer where this flag is set. + * + * Available since libusb-1.0.9. + */ + LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3, +}; + +/** \ingroup asyncio + * Isochronous packet descriptor. */ +struct libusb_iso_packet_descriptor { + /** Length of data to request in this packet */ + unsigned int length; + + /** Amount of data that was actually transferred */ + unsigned int actual_length; + + /** Status code for this packet */ + enum libusb_transfer_status status; +}; + +struct libusb_transfer; + +/** \ingroup asyncio + * Asynchronous transfer callback function type. When submitting asynchronous + * transfers, you pass a pointer to a callback function of this type via the + * \ref libusb_transfer::callback "callback" member of the libusb_transfer + * structure. libusb will call this function later, when the transfer has + * completed or failed. See \ref asyncio for more information. + * \param transfer The libusb_transfer struct the callback function is being + * notified about. + */ +typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer); + +/** \ingroup asyncio + * The generic USB transfer structure. The user populates this structure and + * then submits it in order to request a transfer. After the transfer has + * completed, the library populates the transfer with the results and passes + * it back to the user. + */ +struct libusb_transfer { + /** Handle of the device that this transfer will be submitted to */ + libusb_device_handle *dev_handle; + + /** A bitwise OR combination of \ref libusb_transfer_flags. */ + uint8_t flags; + + /** Address of the endpoint where this transfer will be sent. */ + unsigned char endpoint; + + /** Type of the endpoint from \ref libusb_transfer_type */ + unsigned char type; + + /** Timeout for this transfer in millseconds. A value of 0 indicates no + * timeout. */ + unsigned int timeout; + + /** The status of the transfer. Read-only, and only for use within + * transfer callback function. + * + * If this is an isochronous transfer, this field may read COMPLETED even + * if there were errors in the frames. Use the + * \ref libusb_iso_packet_descriptor::status "status" field in each packet + * to determine if errors occurred. */ + enum libusb_transfer_status status; + + /** Length of the data buffer */ + int length; + + /** Actual length of data that was transferred. Read-only, and only for + * use within transfer callback function. Not valid for isochronous + * endpoint transfers. */ + int actual_length; + + /** Callback function. This will be invoked when the transfer completes, + * fails, or is cancelled. */ + libusb_transfer_cb_fn callback; + + /** User context data to pass to the callback function. */ + void *user_data; + + /** Data buffer */ + unsigned char *buffer; + + /** Number of isochronous packets. Only used for I/O with isochronous + * endpoints. */ + int num_iso_packets; + + /** Isochronous packet descriptors, for isochronous transfers only. */ + struct libusb_iso_packet_descriptor iso_packet_desc +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup misc + * Capabilities supported by this instance of libusb. Test if the loaded + * library supports a given capability by calling + * \ref libusb_has_capability(). + */ +enum libusb_capability { + /** The libusb_has_capability() API is available. */ + LIBUSB_CAP_HAS_CAPABILITY = 0, +}; + +int LIBUSB_CALL libusb_init(libusb_context **ctx); +void LIBUSB_CALL libusb_exit(libusb_context *ctx); +void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); +const struct libusb_version * LIBUSB_CALL libusb_get_version(void); +int LIBUSB_CALL libusb_has_capability(uint32_t capability); +const char * LIBUSB_CALL libusb_error_name(int errcode); + +ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx, + libusb_device ***list); +void LIBUSB_CALL libusb_free_device_list(libusb_device **list, + int unref_devices); +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev); +void LIBUSB_CALL libusb_unref_device(libusb_device *dev); + +int LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev, + int *config); +int LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc); +int LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config); +void LIBUSB_CALL libusb_free_config_descriptor( + struct libusb_config_descriptor *config); +uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev); +int LIBUSB_CALL libusb_get_device_speed(libusb_device *dev); +int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint); + +int LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **handle); +void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle); +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev, + int configuration); +int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev, + int interface_number); + +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id); + +int LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev, + int interface_number, int alternate_setting); +int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev); + +int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev, + int interface_number); +int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev, + int interface_number); + +/* async I/O */ + +/** \ingroup asyncio + * Get the data section of a control transfer. This convenience function is here + * to remind you that the data does not start until 8 bytes into the actual + * buffer, as the setup packet comes first. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns pointer to the first byte of the data section + */ +static inline unsigned char *libusb_control_transfer_get_data( + struct libusb_transfer *transfer) +{ + return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; +} + +/** \ingroup asyncio + * Get the control setup packet of a control transfer. This convenience + * function is here to remind you that the control setup occupies the first + * 8 bytes of the transfer data buffer. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns a casted pointer to the start of the transfer data buffer + */ +static inline struct libusb_control_setup *libusb_control_transfer_get_setup( + struct libusb_transfer *transfer) +{ + return (struct libusb_control_setup *) transfer->buffer; +} + +/** \ingroup asyncio + * Helper function to populate the setup packet (first 8 bytes of the data + * buffer) for a control transfer. The wIndex, wValue and wLength values should + * be given in host-endian byte order. + * + * \param buffer buffer to output the setup packet into + * \param bmRequestType see the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field of + * \ref libusb_control_setup + * \param bRequest see the + * \ref libusb_control_setup::bRequest "bRequest" field of + * \ref libusb_control_setup + * \param wValue see the + * \ref libusb_control_setup::wValue "wValue" field of + * \ref libusb_control_setup + * \param wIndex see the + * \ref libusb_control_setup::wIndex "wIndex" field of + * \ref libusb_control_setup + * \param wLength see the + * \ref libusb_control_setup::wLength "wLength" field of + * \ref libusb_control_setup + */ +static inline void libusb_fill_control_setup(unsigned char *buffer, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + uint16_t wLength) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer; + setup->bmRequestType = bmRequestType; + setup->bRequest = bRequest; + setup->wValue = libusb_cpu_to_le16(wValue); + setup->wIndex = libusb_cpu_to_le16(wIndex); + setup->wLength = libusb_cpu_to_le16(wLength); +} + +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets); +int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer); +int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer); + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a control transfer. + * + * If you pass a transfer buffer to this function, the first 8 bytes will + * be interpreted as a control setup packet, and the wLength field will be + * used to automatically populate the \ref libusb_transfer::length "length" + * field of the transfer. Therefore the recommended approach is: + * -# Allocate a suitably sized data buffer (including space for control setup) + * -# Call libusb_fill_control_setup() + * -# If this is a host-to-device transfer with a data stage, put the data + * in place after the setup packet + * -# Call this function + * -# Call libusb_submit_transfer() + * + * It is also legal to pass a NULL buffer to this function, in which case this + * function will not attempt to populate the length field. Remember that you + * must then populate the buffer and length fields later. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param buffer data buffer. If provided, this function will interpret the + * first 8 bytes as a setup packet and infer the transfer length from that. + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_control_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, + unsigned int timeout) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *) buffer; + transfer->dev_handle = dev_handle; + transfer->endpoint = 0; + transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL; + transfer->timeout = timeout; + transfer->buffer = buffer; + if (setup) + transfer->length = LIBUSB_CONTROL_SETUP_SIZE + + libusb_le16_to_cpu(setup->wLength); + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_BULK; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an interrupt transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_interrupt_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an isochronous transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param num_iso_packets the number of isochronous packets + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, int num_iso_packets, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->num_iso_packets = num_iso_packets; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup asyncio + * Convenience function to set the length of all packets in an isochronous + * transfer, based on the num_iso_packets field in the transfer structure. + * + * \param transfer a transfer + * \param length the length to set in each isochronous packet descriptor + * \see libusb_get_max_packet_size() + */ +static inline void libusb_set_iso_packet_lengths( + struct libusb_transfer *transfer, unsigned int length) +{ + int i; + for (i = 0; i < transfer->num_iso_packets; i++) + transfer->iso_packet_desc[i].length = length; +} + +/** \ingroup asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer. + * + * This is a thorough function which loops through all preceding packets, + * accumulating their lengths to find the position of the specified packet. + * Typically you will assign equal lengths to each packet in the transfer, + * and hence the above method is sub-optimal. You may wish to use + * libusb_get_iso_packet_buffer_simple() instead. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer_simple() + */ +static inline unsigned char *libusb_get_iso_packet_buffer( + struct libusb_transfer *transfer, unsigned int packet) +{ + int i; + size_t offset = 0; + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + for (i = 0; i < _packet; i++) + offset += transfer->iso_packet_desc[i].length; + + return transfer->buffer + offset; +} + +/** \ingroup asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer, for transfers where each + * packet is of identical size. + * + * This function relies on the assumption that every packet within the transfer + * is of identical size to the first packet. Calculating the location of + * the packet buffer is then just a simple calculation: + * buffer + (packet_size * packet) + * + * Do not use this function on transfers other than those that have identical + * packet lengths for each packet. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer() + */ +static inline unsigned char *libusb_get_iso_packet_buffer_simple( + struct libusb_transfer *transfer, unsigned int packet) +{ + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + return transfer->buffer + (transfer->iso_packet_desc[0].length * _packet); +} + +/* sync I/O */ + +int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout); + +int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +int LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +/** \ingroup desc + * Retrieve a descriptor from the default control pipe. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. + * + * \param dev a device handle + * \param desc_type the descriptor type, see \ref libusb_descriptor_type + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +static inline int libusb_get_descriptor(libusb_device_handle *dev, + uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) +{ + return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data, + (uint16_t) length, 1000); +} + +/** \ingroup desc + * Retrieve a descriptor from a device. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. The string returned is Unicode, as + * detailed in the USB specifications. + * + * \param dev a device handle + * \param desc_index the index of the descriptor to retrieve + * \param langid the language ID for the string descriptor + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + * \see libusb_get_string_descriptor_ascii() + */ +static inline int libusb_get_string_descriptor(libusb_device_handle *dev, + uint8_t desc_index, uint16_t langid, unsigned char *data, int length) +{ + return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t)((LIBUSB_DT_STRING << 8) | desc_index), + langid, data, (uint16_t) length, 1000); +} + +int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + uint8_t desc_index, unsigned char *data, int length); + +/* polling and timeouts */ + +int LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_events(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx); +int LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); + +int LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed); +int LIBUSB_CALL libusb_handle_events(libusb_context *ctx); +int LIBUSB_CALL libusb_handle_events_completed(libusb_context *ctx, int *completed); +int LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx); +int LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv); + +/** \ingroup poll + * File descriptor for polling + */ +struct libusb_pollfd { + /** Numeric file descriptor */ + int fd; + + /** Event flags to poll for from . POLLIN indicates that you + * should monitor this file descriptor for becoming ready to read from, + * and POLLOUT indicates that you should monitor this file descriptor for + * nonblocking write readiness. */ + short events; +}; + +/** \ingroup poll + * Callback function, invoked when a new file descriptor should be added + * to the set of file descriptors monitored for events. + * \param fd the new file descriptor + * \param events events to monitor for, see \ref libusb_pollfd for a + * description + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events, + void *user_data); + +/** \ingroup poll + * Callback function, invoked when a file descriptor should be removed from + * the set of file descriptors being monitored for events. After returning + * from this callback, do not use that file descriptor again. + * \param fd the file descriptor to stop monitoring + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data); + +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx); +void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libusb/libusb/libusb/libusbi.h b/libusb/libusb/libusb/libusbi.h new file mode 100644 index 0000000..976be0d --- /dev/null +++ b/libusb/libusb/libusb/libusbi.h @@ -0,0 +1,935 @@ +/* + * Internal header for libusb + * Copyright (C) 2007-2009 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSBI_H +#define LIBUSBI_H + +#include + +#include +#include +#include +#include +#ifdef HAVE_POLL_H +#include +#endif + +#include +#include + +/* Inside the libusb code, mark all public functions as follows: + * return_type API_EXPORTED function_name(params) { ... } + * But if the function returns a pointer, mark it as follows: + * DEFAULT_VISIBILITY return_type * LIBUSB_CALL function_name(params) { ... } + * In the libusb public header, mark all declarations as: + * return_type LIBUSB_CALL function_name(params); + */ +#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY + +#define DEVICE_DESC_LENGTH 18 + +#define USB_MAXENDPOINTS 32 +#define USB_MAXINTERFACES 32 +#define USB_MAXCONFIG 8 + +struct list_head { + struct list_head *prev, *next; +}; + +/* Get an entry from the list + * ptr - the address of this list_head element in "type" + * type - the data type that contains "member" + * member - the list_head element in "type" + */ +#define list_entry(ptr, type, member) \ + ((type *)((uintptr_t)(ptr) - (uintptr_t)(&((type *)0L)->member))) + +/* Get each entry from a list + * pos - A structure pointer has a "member" element + * head - list head + * member - the list_head element in "pos" + * type - the type of the first parameter + */ +#define list_for_each_entry(pos, head, member, type) \ + for (pos = list_entry((head)->next, type, member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, type, member)) + +#define list_for_each_entry_safe(pos, n, head, member, type) \ + for (pos = list_entry((head)->next, type, member), \ + n = list_entry(pos->member.next, type, member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, type, member)) + +#define list_empty(entry) ((entry)->next == (entry)) + +static inline void list_init(struct list_head *entry) +{ + entry->prev = entry->next = entry; +} + +static inline void list_add(struct list_head *entry, struct list_head *head) +{ + entry->next = head->next; + entry->prev = head; + + head->next->prev = entry; + head->next = entry; +} + +static inline void list_add_tail(struct list_head *entry, + struct list_head *head) +{ + entry->next = head; + entry->prev = head->prev; + + head->prev->next = entry; + head->prev = entry; +} + +static inline void list_del(struct list_head *entry) +{ + entry->next->prev = entry->prev; + entry->prev->next = entry->next; +} + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *mptr = (ptr); \ + (type *)( (char *)mptr - offsetof(type,member) );}) + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) + +enum usbi_log_level { + LOG_LEVEL_DEBUG, + LOG_LEVEL_INFO, + LOG_LEVEL_WARNING, + LOG_LEVEL_ERROR, +}; + +void usbi_log(struct libusb_context *ctx, enum usbi_log_level level, + const char *function, const char *format, ...); + +void usbi_log_v(struct libusb_context *ctx, enum usbi_log_level level, + const char *function, const char *format, va_list args); + +#if !defined(_MSC_VER) || _MSC_VER >= 1400 + +#ifdef ENABLE_LOGGING +#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__) +#else +#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0) +#endif + +#ifdef ENABLE_DEBUG_LOGGING +#define usbi_dbg(...) _usbi_log(NULL, LOG_LEVEL_DEBUG, __VA_ARGS__) +#else +#define usbi_dbg(...) do {} while(0) +#endif + +#define usbi_info(ctx, ...) _usbi_log(ctx, LOG_LEVEL_INFO, __VA_ARGS__) +#define usbi_warn(ctx, ...) _usbi_log(ctx, LOG_LEVEL_WARNING, __VA_ARGS__) +#define usbi_err(ctx, ...) _usbi_log(ctx, LOG_LEVEL_ERROR, __VA_ARGS__) + +#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ + +/* Old MS compilers don't support variadic macros. The code is simple, so we + * repeat it for each loglevel. Note that the debug case is special. + * + * Support for variadic macros was introduced in Visual C++ 2005. + * http://msdn.microsoft.com/en-us/library/ms177415%28v=VS.80%29.aspx + */ + +static inline void usbi_info(struct libusb_context *ctx, const char *fmt, ...) +{ +#ifdef ENABLE_LOGGING + va_list args; + va_start(args, fmt); + usbi_log_v(ctx, LOG_LEVEL_INFO, "", fmt, args); + va_end(args); +#else + (void)ctx; +#endif +} + +static inline void usbi_warn(struct libusb_context *ctx, const char *fmt, ...) +{ +#ifdef ENABLE_LOGGING + va_list args; + va_start(args, fmt); + usbi_log_v(ctx, LOG_LEVEL_WARNING, "", fmt, args); + va_end(args); +#else + (void)ctx; +#endif +} + +static inline void usbi_err(struct libusb_context *ctx, const char *fmt, ...) +{ +#ifdef ENABLE_LOGGING + va_list args; + va_start(args, fmt); + usbi_log_v(ctx, LOG_LEVEL_ERROR, "", fmt, args); + va_end(args); +#else + (void)ctx; +#endif +} + +static inline void usbi_dbg(const char *fmt, ...) +{ +#ifdef ENABLE_DEBUG_LOGGING + va_list args; + va_start(args, fmt); + usbi_log_v(NULL, LOG_LEVEL_DEBUG, "", fmt, args); + va_end(args); +#else + (void)fmt; +#endif +} + +#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ + +#define USBI_GET_CONTEXT(ctx) if (!(ctx)) (ctx) = usbi_default_context +#define DEVICE_CTX(dev) ((dev)->ctx) +#define HANDLE_CTX(handle) (DEVICE_CTX((handle)->dev)) +#define TRANSFER_CTX(transfer) (HANDLE_CTX((transfer)->dev_handle)) +#define ITRANSFER_CTX(transfer) \ + (TRANSFER_CTX(USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer))) + +#define IS_EPIN(ep) (0 != ((ep) & LIBUSB_ENDPOINT_IN)) +#define IS_EPOUT(ep) (!IS_EPIN(ep)) +#define IS_XFERIN(xfer) (0 != ((xfer)->endpoint & LIBUSB_ENDPOINT_IN)) +#define IS_XFEROUT(xfer) (!IS_XFERIN(xfer)) + +/* Internal abstractions for thread synchronization and poll */ +#if defined(THREADS_POSIX) +#include +#elif defined(OS_WINDOWS) +#include +#endif + +#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) +#include +#include +#elif defined(OS_WINDOWS) +#include +#endif + +#if defined(OS_WINDOWS) && !defined(__GCC__) +#undef HAVE_GETTIMEOFDAY +int usbi_gettimeofday(struct timeval *tp, void *tzp); +#define LIBUSB_GETTIMEOFDAY_WIN32 +#define HAVE_USBI_GETTIMEOFDAY +#else +#ifdef HAVE_GETTIMEOFDAY +#define usbi_gettimeofday(tv, tz) gettimeofday((tv), (tz)) +#define HAVE_USBI_GETTIMEOFDAY +#endif +#endif + +extern struct libusb_context *usbi_default_context; + +struct libusb_context { + int debug; + int debug_fixed; + + /* internal control pipe, used for interrupting event handling when + * something needs to modify poll fds. */ + int ctrl_pipe[2]; + + struct list_head usb_devs; + usbi_mutex_t usb_devs_lock; + + /* A list of open handles. Backends are free to traverse this if required. + */ + struct list_head open_devs; + usbi_mutex_t open_devs_lock; + + /* this is a list of in-flight transfer handles, sorted by timeout + * expiration. URBs to timeout the soonest are placed at the beginning of + * the list, URBs that will time out later are placed after, and urbs with + * infinite timeout are always placed at the very end. */ + struct list_head flying_transfers; + usbi_mutex_t flying_transfers_lock; + + /* list of poll fds */ + struct list_head pollfds; + usbi_mutex_t pollfds_lock; + + /* a counter that is set when we want to interrupt event handling, in order + * to modify the poll fd set. and a lock to protect it. */ + unsigned int pollfd_modify; + usbi_mutex_t pollfd_modify_lock; + + /* user callbacks for pollfd changes */ + libusb_pollfd_added_cb fd_added_cb; + libusb_pollfd_removed_cb fd_removed_cb; + void *fd_cb_user_data; + + /* ensures that only one thread is handling events at any one time */ + usbi_mutex_t events_lock; + + /* used to see if there is an active thread doing event handling */ + int event_handler_active; + + /* used to wait for event completion in threads other than the one that is + * event handling */ + usbi_mutex_t event_waiters_lock; + usbi_cond_t event_waiters_cond; + +#ifdef USBI_TIMERFD_AVAILABLE + /* used for timeout handling, if supported by OS. + * this timerfd is maintained to trigger on the next pending timeout */ + int timerfd; +#endif +}; + +#ifdef USBI_TIMERFD_AVAILABLE +#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0) +#else +#define usbi_using_timerfd(ctx) (0) +#endif + +struct libusb_device { + /* lock protects refcnt, everything else is finalized at initialization + * time */ + usbi_mutex_t lock; + int refcnt; + + struct libusb_context *ctx; + + uint8_t bus_number; + uint8_t device_address; + uint8_t num_configurations; + enum libusb_speed speed; + + struct list_head list; + unsigned long session_data; + unsigned char os_priv[0]; +}; + +struct libusb_device_handle { + /* lock protects claimed_interfaces */ + usbi_mutex_t lock; + unsigned long claimed_interfaces; + + struct list_head list; + struct libusb_device *dev; + unsigned char os_priv[0]; +}; + +enum { + USBI_CLOCK_MONOTONIC, + USBI_CLOCK_REALTIME +}; + +/* in-memory transfer layout: + * + * 1. struct usbi_transfer + * 2. struct libusb_transfer (which includes iso packets) [variable size] + * 3. os private data [variable size] + * + * from a libusb_transfer, you can get the usbi_transfer by rewinding the + * appropriate number of bytes. + * the usbi_transfer includes the number of allocated packets, so you can + * determine the size of the transfer and hence the start and length of the + * OS-private data. + */ + +struct usbi_transfer { + int num_iso_packets; + struct list_head list; + struct timeval timeout; + int transferred; + uint8_t flags; + + /* this lock is held during libusb_submit_transfer() and + * libusb_cancel_transfer() (allowing the OS backend to prevent duplicate + * cancellation, submission-during-cancellation, etc). the OS backend + * should also take this lock in the handle_events path, to prevent the user + * cancelling the transfer from another thread while you are processing + * its completion (presumably there would be races within your OS backend + * if this were possible). */ + usbi_mutex_t lock; +}; + +enum usbi_transfer_flags { + /* The transfer has timed out */ + USBI_TRANSFER_TIMED_OUT = 1 << 0, + + /* Set by backend submit_transfer() if the OS handles timeout */ + USBI_TRANSFER_OS_HANDLES_TIMEOUT = 1 << 1, + + /* Cancellation was requested via libusb_cancel_transfer() */ + USBI_TRANSFER_CANCELLING = 1 << 2, + + /* Operation on the transfer failed because the device disappeared */ + USBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 3, +}; + +#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \ + ((struct libusb_transfer *)(((unsigned char *)(transfer)) \ + + sizeof(struct usbi_transfer))) +#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \ + ((struct usbi_transfer *)(((unsigned char *)(transfer)) \ + - sizeof(struct usbi_transfer))) + +static inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer) +{ + return ((unsigned char *)transfer) + sizeof(struct usbi_transfer) + + sizeof(struct libusb_transfer) + + (transfer->num_iso_packets + * sizeof(struct libusb_iso_packet_descriptor)); +} + +/* bus structures */ + +/* All standard descriptors have these 2 fields in common */ +struct usb_descriptor_header { + uint8_t bLength; + uint8_t bDescriptorType; +}; + +/* shared data and functions */ + +int usbi_io_init(struct libusb_context *ctx); +void usbi_io_exit(struct libusb_context *ctx); + +struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, + unsigned long session_id); +struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, + unsigned long session_id); +int usbi_sanitize_device(struct libusb_device *dev); +void usbi_handle_disconnect(struct libusb_device_handle *handle); + +int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status); +int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); + +int usbi_parse_descriptor(unsigned char *source, const char *descriptor, + void *dest, int host_endian); +int usbi_get_config_index_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, int *idx); + +/* polling */ + +struct usbi_pollfd { + /* must come first */ + struct libusb_pollfd pollfd; + + struct list_head list; +}; + +int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events); +void usbi_remove_pollfd(struct libusb_context *ctx, int fd); +void usbi_fd_notification(struct libusb_context *ctx); + +/* device discovery */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +struct discovered_devs { + size_t len; + size_t capacity; + struct libusb_device *devices[0]; +}; + +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev); + +/* OS abstraction */ + +/* This is the interface that OS backends need to implement. + * All fields are mandatory, except ones explicitly noted as optional. */ +struct usbi_os_backend { + /* A human-readable name for your backend, e.g. "Linux usbfs" */ + const char *name; + + /* Perform initialization of your backend. You might use this function + * to determine specific capabilities of the system, allocate required + * data structures for later, etc. + * + * This function is called when a libusb user initializes the library + * prior to use. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*init)(struct libusb_context *ctx); + + /* Deinitialization. Optional. This function should destroy anything + * that was set up by init. + * + * This function is called when the user deinitializes the library. + */ + void (*exit)(void); + + /* Enumerate all the USB devices on the system, returning them in a list + * of discovered devices. + * + * Your implementation should enumerate all devices on the system, + * regardless of whether they have been seen before or not. + * + * When you have found a device, compute a session ID for it. The session + * ID should uniquely represent that particular device for that particular + * connection session since boot (i.e. if you disconnect and reconnect a + * device immediately after, it should be assigned a different session ID). + * If your OS cannot provide a unique session ID as described above, + * presenting a session ID of (bus_number << 8 | device_address) should + * be sufficient. Bus numbers and device addresses wrap and get reused, + * but that is an unlikely case. + * + * After computing a session ID for a device, call + * usbi_get_device_by_session_id(). This function checks if libusb already + * knows about the device, and if so, it provides you with a libusb_device + * structure for it. + * + * If usbi_get_device_by_session_id() returns NULL, it is time to allocate + * a new device structure for the device. Call usbi_alloc_device() to + * obtain a new libusb_device structure with reference count 1. Populate + * the bus_number and device_address attributes of the new device, and + * perform any other internal backend initialization you need to do. At + * this point, you should be ready to provide device descriptors and so + * on through the get_*_descriptor functions. Finally, call + * usbi_sanitize_device() to perform some final sanity checks on the + * device. Assuming all of the above succeeded, we can now continue. + * If any of the above failed, remember to unreference the device that + * was returned by usbi_alloc_device(). + * + * At this stage we have a populated libusb_device structure (either one + * that was found earlier, or one that we have just allocated and + * populated). This can now be added to the discovered devices list + * using discovered_devs_append(). Note that discovered_devs_append() + * may reallocate the list, returning a new location for it, and also + * note that reallocation can fail. Your backend should handle these + * error conditions appropriately. + * + * This function should not generate any bus I/O and should not block. + * If I/O is required (e.g. reading the active configuration value), it is + * OK to ignore these suggestions :) + * + * This function is executed when the user wishes to retrieve a list + * of USB devices connected to the system. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*get_device_list)(struct libusb_context *ctx, + struct discovered_devs **discdevs); + + /* Open a device for I/O and other USB operations. The device handle + * is preallocated for you, you can retrieve the device in question + * through handle->dev. + * + * Your backend should allocate any internal resources required for I/O + * and other operations so that those operations can happen (hopefully) + * without hiccup. This is also a good place to inform libusb that it + * should monitor certain file descriptors related to this device - + * see the usbi_add_pollfd() function. + * + * This function should not generate any bus I/O and should not block. + * + * This function is called when the user attempts to obtain a device + * handle for a device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_ACCESS if the user has insufficient permissions + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since + * discovery + * - another LIBUSB_ERROR code on other failure + * + * Do not worry about freeing the handle on failed open, the upper layers + * do this for you. + */ + int (*open)(struct libusb_device_handle *handle); + + /* Close a device such that the handle cannot be used again. Your backend + * should destroy any resources that were allocated in the open path. + * This may also be a good place to call usbi_remove_pollfd() to inform + * libusb of any file descriptors associated with this device that should + * no longer be monitored. + * + * This function is called when the user closes a device handle. + */ + void (*close)(struct libusb_device_handle *handle); + + /* Retrieve the device descriptor from a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. Alternatively, you may be able + * to retrieve it from a kernel interface (some Linux setups can do this) + * still without generating bus I/O. + * + * This function is expected to write DEVICE_DESC_LENGTH (18) bytes into + * buffer, which is guaranteed to be big enough. + * + * This function is called when sanity-checking a device before adding + * it to the list of discovered devices, and also when the user requests + * to read the device descriptor. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return 0 on success or a LIBUSB_ERROR code on failure. + */ + int (*get_device_descriptor)(struct libusb_device *device, + unsigned char *buffer, int *host_endian); + + /* Get the ACTIVE configuration descriptor for a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. You may also have to keep track + * of which configuration is active when the user changes it. + * + * This function is expected to write len bytes of data into buffer, which + * is guaranteed to be big enough. If you can only do a partial write, + * return an error code. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state + * - another LIBUSB_ERROR code on other failure + */ + int (*get_active_config_descriptor)(struct libusb_device *device, + unsigned char *buffer, size_t len, int *host_endian); + + /* Get a specific configuration descriptor for a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. + * + * The requested descriptor is expressed as a zero-based index (i.e. 0 + * indicates that we are requesting the first descriptor). The index does + * not (necessarily) equal the bConfigurationValue of the configuration + * being requested. + * + * This function is expected to write len bytes of data into buffer, which + * is guaranteed to be big enough. If you can only do a partial write, + * return an error code. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return 0 on success or a LIBUSB_ERROR code on failure. + */ + int (*get_config_descriptor)(struct libusb_device *device, + uint8_t config_index, unsigned char *buffer, size_t len, + int *host_endian); + + /* Get the bConfigurationValue for the active configuration for a device. + * Optional. This should only be implemented if you can retrieve it from + * cache (don't generate I/O). + * + * If you cannot retrieve this from cache, either do not implement this + * function, or return LIBUSB_ERROR_NOT_SUPPORTED. This will cause + * libusb to retrieve the information through a standard control transfer. + * + * This function must be non-blocking. + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - LIBUSB_ERROR_NOT_SUPPORTED if the value cannot be retrieved without + * blocking + * - another LIBUSB_ERROR code on other failure. + */ + int (*get_configuration)(struct libusb_device_handle *handle, int *config); + + /* Set the active configuration for a device. + * + * A configuration value of -1 should put the device in unconfigured state. + * + * This function can block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * - LIBUSB_ERROR_BUSY if interfaces are currently claimed (and hence + * configuration cannot be changed) + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure. + */ + int (*set_configuration)(struct libusb_device_handle *handle, int config); + + /* Claim an interface. When claimed, the application can then perform + * I/O to an interface's endpoints. + * + * This function should not generate any bus I/O and should not block. + * Interface claiming is a logical operation that simply ensures that + * no other drivers/applications are using the interface, and after + * claiming, no other drivers/applicatiosn can use the interface because + * we now "own" it. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the interface does not exist + * - LIBUSB_ERROR_BUSY if the interface is in use by another driver/app + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*claim_interface)(struct libusb_device_handle *handle, int interface_number); + + /* Release a previously claimed interface. + * + * This function should also generate a SET_INTERFACE control request, + * resetting the alternate setting of that interface to 0. It's OK for + * this function to block as a result. + * + * You will only ever be asked to release an interface which was + * successfully claimed earlier. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*release_interface)(struct libusb_device_handle *handle, int interface_number); + + /* Set the alternate setting for an interface. + * + * You will only ever be asked to set the alternate setting for an + * interface which was successfully claimed earlier. + * + * It's OK for this function to block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the alternate setting does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*set_interface_altsetting)(struct libusb_device_handle *handle, + int interface_number, int altsetting); + + /* Clear a halt/stall condition on an endpoint. + * + * It's OK for this function to block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*clear_halt)(struct libusb_device_handle *handle, + unsigned char endpoint); + + /* Perform a USB port reset to reinitialize a device. + * + * If possible, the handle should still be usable after the reset + * completes, assuming that the device descriptors did not change during + * reset and all previous interface state can be restored. + * + * If something changes, or you cannot easily locate/verify the resetted + * device, return LIBUSB_ERROR_NOT_FOUND. This prompts the application + * to close the old handle and re-enumerate the device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device + * has been disconnected since it was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*reset_device)(struct libusb_device_handle *handle); + + /* Determine if a kernel driver is active on an interface. Optional. + * + * The presence of a kernel driver on an interface indicates that any + * calls to claim_interface would fail with the LIBUSB_ERROR_BUSY code. + * + * Return: + * - 0 if no driver is active + * - 1 if a driver is active + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*kernel_driver_active)(struct libusb_device_handle *handle, + int interface_number); + + /* Detach a kernel driver from an interface. Optional. + * + * After detaching a kernel driver, the interface should be available + * for claim. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*detach_kernel_driver)(struct libusb_device_handle *handle, + int interface_number); + + /* Attach a kernel driver to an interface. Optional. + * + * Reattach a kernel driver to the device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - LIBUSB_ERROR_BUSY if a program or driver has claimed the interface, + * preventing reattachment + * - another LIBUSB_ERROR code on other failure + */ + int (*attach_kernel_driver)(struct libusb_device_handle *handle, + int interface_number); + + /* Destroy a device. Optional. + * + * This function is called when the last reference to a device is + * destroyed. It should free any resources allocated in the get_device_list + * path. + */ + void (*destroy_device)(struct libusb_device *dev); + + /* Submit a transfer. Your implementation should take the transfer, + * morph it into whatever form your platform requires, and submit it + * asynchronously. + * + * This function must not block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * - another LIBUSB_ERROR code on other failure + */ + int (*submit_transfer)(struct usbi_transfer *itransfer); + + /* Cancel a previously submitted transfer. + * + * This function must not block. The transfer cancellation must complete + * later, resulting in a call to usbi_handle_transfer_cancellation() + * from the context of handle_events. + */ + int (*cancel_transfer)(struct usbi_transfer *itransfer); + + /* Clear a transfer as if it has completed or cancelled, but do not + * report any completion/cancellation to the library. You should free + * all private data from the transfer as if you were just about to report + * completion or cancellation. + * + * This function might seem a bit out of place. It is used when libusb + * detects a disconnected device - it calls this function for all pending + * transfers before reporting completion (with the disconnect code) to + * the user. Maybe we can improve upon this internal interface in future. + */ + void (*clear_transfer_priv)(struct usbi_transfer *itransfer); + + /* Handle any pending events. This involves monitoring any active + * transfers and processing their completion or cancellation. + * + * The function is passed an array of pollfd structures (size nfds) + * as a result of the poll() system call. The num_ready parameter + * indicates the number of file descriptors that have reported events + * (i.e. the poll() return value). This should be enough information + * for you to determine which actions need to be taken on the currently + * active transfers. + * + * For any cancelled transfers, call usbi_handle_transfer_cancellation(). + * For completed transfers, call usbi_handle_transfer_completion(). + * For control/bulk/interrupt transfers, populate the "transferred" + * element of the appropriate usbi_transfer structure before calling the + * above functions. For isochronous transfers, populate the status and + * transferred fields of the iso packet descriptors of the transfer. + * + * This function should also be able to detect disconnection of the + * device, reporting that situation with usbi_handle_disconnect(). + * + * When processing an event related to a transfer, you probably want to + * take usbi_transfer.lock to prevent races. See the documentation for + * the usbi_transfer structure. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*handle_events)(struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); + + /* Get time from specified clock. At least two clocks must be implemented + by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC. + + Description of clocks: + USBI_CLOCK_REALTIME : clock returns time since system epoch. + USBI_CLOCK_MONOTONIC: clock returns time since unspecified start + time (usually boot). + */ + int (*clock_gettime)(int clkid, struct timespec *tp); + +#ifdef USBI_TIMERFD_AVAILABLE + /* clock ID of the clock that should be used for timerfd */ + clockid_t (*get_timerfd_clockid)(void); +#endif + + /* Number of bytes to reserve for per-device private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_device. */ + size_t device_priv_size; + + /* Number of bytes to reserve for per-handle private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_device. */ + size_t device_handle_priv_size; + + /* Number of bytes to reserve for per-transfer private backend data. + * This private data area is accessible by calling + * usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance. + */ + size_t transfer_priv_size; + + /* Mumber of additional bytes for os_priv for each iso packet. + * Can your backend use this? */ + /* FIXME: linux can't use this any more. if other OS's cannot either, + * then remove this */ + size_t add_iso_packet_size; +}; + +extern const struct usbi_os_backend * const usbi_backend; + +extern const struct usbi_os_backend linux_usbfs_backend; +extern const struct usbi_os_backend darwin_backend; +extern const struct usbi_os_backend openbsd_backend; +extern const struct usbi_os_backend windows_backend; + +#endif + diff --git a/libusb/libusb/libusb/os/darwin_usb.c b/libusb/libusb/libusb/os/darwin_usb.c new file mode 100644 index 0000000..3fc0daf --- /dev/null +++ b/libusb/libusb/libusb/os/darwin_usb.c @@ -0,0 +1,1750 @@ +/* + * darwin backend for libusb 1.0 + * Copyright (C) 2008-2011 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + #include +#endif + +#include +#include +#include + +#include "darwin_usb.h" + +/* async event thread */ +static pthread_mutex_t libusb_darwin_at_mutex; +static pthread_cond_t libusb_darwin_at_cond; + +static clock_serv_t clock_realtime; +static clock_serv_t clock_monotonic; + +static CFRunLoopRef libusb_darwin_acfl = NULL; /* async cf loop */ +static volatile int32_t initCount = 0; + +/* async event thread */ +static pthread_t libusb_darwin_at; + +static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian); +static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface); +static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface); +static int darwin_reset_device(struct libusb_device_handle *dev_handle); +static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0); + +static const char *darwin_error_str (int result) { + switch (result) { + case kIOReturnSuccess: + return "no error"; + case kIOReturnNotOpen: + return "device not opened for exclusive access"; + case kIOReturnNoDevice: + return "no connection to an IOService"; + case kIOUSBNoAsyncPortErr: + return "no async port has been opened for interface"; + case kIOReturnExclusiveAccess: + return "another process has device opened for exclusive access"; + case kIOUSBPipeStalled: + return "pipe is stalled"; + case kIOReturnError: + return "could not establish a connection to the Darwin kernel"; + case kIOUSBTransactionTimeout: + return "transaction timed out"; + case kIOReturnBadArgument: + return "invalid argument"; + case kIOReturnAborted: + return "transaction aborted"; + case kIOReturnNotResponding: + return "device not responding"; + case kIOReturnOverrun: + return "data overrun"; + case kIOReturnCannotWire: + return "physical memory can not be wired down"; + default: + return "unknown error"; + } +} + +static int darwin_to_libusb (int result) { + switch (result) { + case kIOReturnUnderrun: + case kIOReturnSuccess: + return LIBUSB_SUCCESS; + case kIOReturnNotOpen: + case kIOReturnNoDevice: + return LIBUSB_ERROR_NO_DEVICE; + case kIOReturnExclusiveAccess: + return LIBUSB_ERROR_ACCESS; + case kIOUSBPipeStalled: + return LIBUSB_ERROR_PIPE; + case kIOReturnBadArgument: + return LIBUSB_ERROR_INVALID_PARAM; + case kIOUSBTransactionTimeout: + return LIBUSB_ERROR_TIMEOUT; + case kIOReturnNotResponding: + case kIOReturnAborted: + case kIOReturnError: + case kIOUSBNoAsyncPortErr: + default: + return LIBUSB_ERROR_OTHER; + } +} + + +static int ep_to_pipeRef(struct libusb_device_handle *dev_handle, uint8_t ep, uint8_t *pipep, uint8_t *ifcp) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface; + + int8_t i, iface; + + usbi_info (HANDLE_CTX(dev_handle), "converting ep address 0x%02x to pipeRef and interface", ep); + + for (iface = 0 ; iface < USB_MAXINTERFACES ; iface++) { + cInterface = &priv->interfaces[iface]; + + if (dev_handle->claimed_interfaces & (1 << iface)) { + for (i = 0 ; i < cInterface->num_endpoints ; i++) { + if (cInterface->endpoint_addrs[i] == ep) { + *pipep = i + 1; + *ifcp = iface; + usbi_info (HANDLE_CTX(dev_handle), "pipe %d on interface %d matches", *pipep, *ifcp); + return 0; + } + } + } + } + + /* No pipe found with the correct endpoint address */ + usbi_warn (HANDLE_CTX(dev_handle), "no pipeRef found with endpoint address 0x%02x.", ep); + + return -1; +} + +static int usb_setup_device_iterator (io_iterator_t *deviceIterator, long location) { + CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName); + + if (!matchingDict) + return kIOReturnError; + + if (location) { + CFMutableDictionaryRef propertyMatchDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (propertyMatchDict) { + CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberLongType, &location); + + CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF); + /* release our reference to the CFNumber (CFDictionarySetValue retains it) */ + CFRelease (locationCF); + + CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict); + /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */ + CFRelease (propertyMatchDict); + } + /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */ + } + + return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator); +} + +static usb_device_t **usb_get_next_device (io_iterator_t deviceIterator, UInt32 *locationp) { + io_cf_plugin_ref_t *plugInInterface = NULL; + usb_device_t **device; + io_service_t usbDevice; + long result; + SInt32 score; + + if (!IOIteratorIsValid (deviceIterator)) + return NULL; + + + while ((usbDevice = IOIteratorNext(deviceIterator))) { + result = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBDeviceUserClientTypeID, + kIOCFPlugInInterfaceID, &plugInInterface, + &score); + + /* we are done with the usb_device_t */ + (void)IOObjectRelease(usbDevice); + if (kIOReturnSuccess == result && plugInInterface) + break; + + usbi_dbg ("libusb/darwin.c usb_get_next_device: could not set up plugin for service: %s\n", darwin_error_str (result)); + } + + if (!usbDevice) + return NULL; + + (void)(*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(DeviceInterfaceID), + (LPVOID)&device); + + (*plugInInterface)->Stop(plugInInterface); + IODestroyPlugInInterface (plugInInterface); + + /* get the location from the device */ + if (locationp) + (*(device))->GetLocationID(device, locationp); + + return device; +} + +static kern_return_t darwin_get_device (uint32_t dev_location, usb_device_t ***darwin_device) { + kern_return_t kresult; + UInt32 location; + io_iterator_t deviceIterator; + + kresult = usb_setup_device_iterator (&deviceIterator, dev_location); + if (kresult) + return kresult; + + /* This port of libusb uses locations to keep track of devices. */ + while ((*darwin_device = usb_get_next_device (deviceIterator, &location)) != NULL) { + if (location == dev_location) + break; + + (**darwin_device)->Release(*darwin_device); + } + + IOObjectRelease (deviceIterator); + + if (!(*darwin_device)) + return kIOReturnNoDevice; + + return kIOReturnSuccess; +} + + + +static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) { + struct libusb_context *ctx = (struct libusb_context *)ptr; + struct libusb_device_handle *handle; + struct darwin_device_priv *dpriv; + struct darwin_device_handle_priv *priv; + + io_service_t device; + long location; + bool locationValid; + CFTypeRef locationCF; + UInt32 message; + + usbi_info (ctx, "a device has been detached"); + + while ((device = IOIteratorNext (rem_devices)) != 0) { + /* get the location from the i/o registry */ + locationCF = IORegistryEntryCreateCFProperty (device, CFSTR(kUSBDevicePropertyLocationID), kCFAllocatorDefault, 0); + + IOObjectRelease (device); + + if (!locationCF) + continue; + + locationValid = CFGetTypeID(locationCF) == CFNumberGetTypeID() && + CFNumberGetValue(locationCF, kCFNumberLongType, &location); + + CFRelease (locationCF); + + if (!locationValid) + continue; + + usbi_mutex_lock(&ctx->open_devs_lock); + list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { + dpriv = (struct darwin_device_priv *)handle->dev->os_priv; + + /* the device may have been opened several times. write to each handle's event descriptor */ + if (dpriv->location == location && handle->os_priv) { + priv = (struct darwin_device_handle_priv *)handle->os_priv; + + message = MESSAGE_DEVICE_GONE; + write (priv->fds[1], &message, sizeof (message)); + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + } +} + +static void darwin_clear_iterator (io_iterator_t iter) { + io_service_t device; + + while ((device = IOIteratorNext (iter)) != 0) + IOObjectRelease (device); +} + +static void *event_thread_main (void *arg0) { + IOReturn kresult; + struct libusb_context *ctx = (struct libusb_context *)arg0; + CFRunLoopRef runloop; + + /* Set this thread's name, so it can be seen in the debugger + and crash reports. */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + pthread_setname_np ("org.libusb.device-detach"); +#endif + + /* Tell the Objective-C garbage collector about this thread. + This is required because, unlike NSThreads, pthreads are + not automatically registered. Although we don't use + Objective-C, we use CoreFoundation, which does. */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + objc_registerThreadWithCollector(); +#endif + + /* hotplug (device removal) source */ + CFRunLoopSourceRef libusb_notification_cfsource; + io_notification_port_t libusb_notification_port; + io_iterator_t libusb_rem_device_iterator; + + usbi_info (ctx, "creating hotplug event source"); + + runloop = CFRunLoopGetCurrent (); + CFRetain (runloop); + + /* add the notification port to the run loop */ + libusb_notification_port = IONotificationPortCreate (kIOMasterPortDefault); + libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port); + CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); + + /* create notifications for removed devices */ + kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification, + IOServiceMatching(kIOUSBDeviceClassName), + (IOServiceMatchingCallback)darwin_devices_detached, + (void *)ctx, &libusb_rem_device_iterator); + + if (kresult != kIOReturnSuccess) { + usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); + + pthread_exit (NULL); + } + + /* arm notifiers */ + darwin_clear_iterator (libusb_rem_device_iterator); + + usbi_info (ctx, "thread ready to receive events"); + + /* signal the main thread that the async runloop has been created. */ + pthread_mutex_lock (&libusb_darwin_at_mutex); + libusb_darwin_acfl = runloop; + pthread_cond_signal (&libusb_darwin_at_cond); + pthread_mutex_unlock (&libusb_darwin_at_mutex); + + /* run the runloop */ + CFRunLoopRun(); + + usbi_info (ctx, "thread exiting"); + + /* delete notification port */ + IONotificationPortDestroy (libusb_notification_port); + IOObjectRelease (libusb_rem_device_iterator); + + CFRelease (runloop); + + libusb_darwin_acfl = NULL; + + pthread_exit (NULL); +} + +static int darwin_init(struct libusb_context *ctx) { + host_name_port_t host_self; + + if (OSAtomicIncrement32Barrier(&initCount) == 1) { + /* create the clocks that will be used */ + + host_self = mach_host_self(); + host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime); + host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic); + mach_port_deallocate(mach_task_self(), host_self); + + pthread_mutex_init (&libusb_darwin_at_mutex, NULL); + pthread_cond_init (&libusb_darwin_at_cond, NULL); + + pthread_create (&libusb_darwin_at, NULL, event_thread_main, (void *)ctx); + + pthread_mutex_lock (&libusb_darwin_at_mutex); + while (!libusb_darwin_acfl) + pthread_cond_wait (&libusb_darwin_at_cond, &libusb_darwin_at_mutex); + pthread_mutex_unlock (&libusb_darwin_at_mutex); + } + + return 0; +} + +static void darwin_exit (void) { + if (OSAtomicDecrement32Barrier(&initCount) == 0) { + mach_port_deallocate(mach_task_self(), clock_realtime); + mach_port_deallocate(mach_task_self(), clock_monotonic); + + /* stop the async runloop and wait for the thread to terminate. */ + CFRunLoopStop (libusb_darwin_acfl); + pthread_join (libusb_darwin_at, NULL); + } +} + +static int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) { + struct darwin_device_priv *priv = (struct darwin_device_priv *)dev->os_priv; + + /* return cached copy */ + memmove (buffer, &(priv->dev_descriptor), DEVICE_DESC_LENGTH); + + *host_endian = 0; + + return 0; +} + +static int get_configuration_index (struct libusb_device *dev, int config_value) { + struct darwin_device_priv *priv = (struct darwin_device_priv *)dev->os_priv; + UInt8 i, numConfig; + IOUSBConfigurationDescriptorPtr desc; + IOReturn kresult; + + /* is there a simpler way to determine the index? */ + kresult = (*(priv->device))->GetNumberOfConfigurations (priv->device, &numConfig); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + for (i = 0 ; i < numConfig ; i++) { + (*(priv->device))->GetConfigurationDescriptorPtr (priv->device, i, &desc); + + if (desc->bConfigurationValue == config_value) + return i; + } + + /* configuration not found */ + return LIBUSB_ERROR_OTHER; +} + +static int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) { + struct darwin_device_priv *priv = (struct darwin_device_priv *)dev->os_priv; + int config_index; + + if (0 == priv->active_config) + return LIBUSB_ERROR_INVALID_PARAM; + + config_index = get_configuration_index (dev, priv->active_config); + if (config_index < 0) + return config_index; + + return darwin_get_config_descriptor (dev, config_index, buffer, len, host_endian); +} + +static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) { + struct darwin_device_priv *priv = (struct darwin_device_priv *)dev->os_priv; + IOUSBConfigurationDescriptorPtr desc; + IOReturn kresult; + usb_device_t **device = NULL; + + if (!priv) + return LIBUSB_ERROR_OTHER; + + if (!priv->device) { + kresult = darwin_get_device (priv->location, &device); + if (kresult || !device) { + usbi_err (DEVICE_CTX (dev), "could not find device: %s", darwin_error_str (kresult)); + + return darwin_to_libusb (kresult); + } + + /* don't have to open the device to get a config descriptor */ + } else + device = priv->device; + + kresult = (*device)->GetConfigurationDescriptorPtr (device, config_index, &desc); + if (kresult == kIOReturnSuccess) { + /* copy descriptor */ + if (libusb_le16_to_cpu(desc->wTotalLength) < len) + len = libusb_le16_to_cpu(desc->wTotalLength); + + memmove (buffer, desc, len); + + /* GetConfigurationDescriptorPtr returns the descriptor in USB bus order */ + *host_endian = 0; + } + + if (!priv->device) + (*device)->Release (device); + + return darwin_to_libusb (kresult); +} + +/* check whether the os has configured the device */ +static int darwin_check_configuration (struct libusb_context *ctx, struct libusb_device *dev, usb_device_t **darwin_device) { + struct darwin_device_priv *priv = (struct darwin_device_priv *)dev->os_priv; + + IOUSBConfigurationDescriptorPtr configDesc; + IOUSBFindInterfaceRequest request; + kern_return_t kresult; + io_iterator_t interface_iterator; + io_service_t firstInterface; + + if (priv->dev_descriptor.bNumConfigurations < 1) { + usbi_err (ctx, "device has no configurations"); + return LIBUSB_ERROR_OTHER; /* no configurations at this speed so we can't use it */ + } + + /* find the first configuration */ + kresult = (*darwin_device)->GetConfigurationDescriptorPtr (darwin_device, 0, &configDesc); + priv->first_config = (kIOReturnSuccess == kresult) ? configDesc->bConfigurationValue : 1; + + /* check if the device is already configured. there is probably a better way than iterating over the + to accomplish this (the trick is we need to avoid a call to GetConfigurations since buggy devices + might lock up on the device request) */ + + /* Setup the Interface Request */ + request.bInterfaceClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; + request.bAlternateSetting = kIOUSBFindInterfaceDontCare; + + kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); + if (kresult) + return darwin_to_libusb (kresult); + + /* iterate once */ + firstInterface = IOIteratorNext(interface_iterator); + + /* done with the interface iterator */ + IOObjectRelease(interface_iterator); + + if (firstInterface) { + IOObjectRelease (firstInterface); + + /* device is configured */ + if (priv->dev_descriptor.bNumConfigurations == 1) + /* to avoid problems with some devices get the configurations value from the configuration descriptor */ + priv->active_config = priv->first_config; + else + /* devices with more than one configuration should work with GetConfiguration */ + (*darwin_device)->GetConfiguration (darwin_device, &priv->active_config); + } else + /* not configured */ + priv->active_config = 0; + + usbi_info (ctx, "active config: %u, first config: %u", priv->active_config, priv->first_config); + + return 0; +} + +static int darwin_cache_device_descriptor (struct libusb_context *ctx, struct libusb_device *dev, usb_device_t **device) { + struct darwin_device_priv *priv; + int retries = 5, delay = 30000; + int unsuspended = 0, try_unsuspend = 1, try_reconfigure = 1; + int is_open = 0; + int ret = 0, ret2; + IOUSBDevRequest req; + UInt8 bDeviceClass; + UInt16 idProduct, idVendor; + + (*device)->GetDeviceClass (device, &bDeviceClass); + (*device)->GetDeviceProduct (device, &idProduct); + (*device)->GetDeviceVendor (device, &idVendor); + + priv = (struct darwin_device_priv *)dev->os_priv; + + /* try to open the device (we can usually continue even if this fails) */ + is_open = ((*device)->USBDeviceOpen (device) == kIOReturnSuccess); + + /**** retrieve device descriptor ****/ + do { + /* Set up request for device descriptor */ + memset (&(priv->dev_descriptor), 0, sizeof(IOUSBDeviceDescriptor)); + req.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); + req.bRequest = kUSBRqGetDescriptor; + req.wValue = kUSBDeviceDesc << 8; + req.wIndex = 0; + req.wLength = sizeof(priv->dev_descriptor); + req.pData = &(priv->dev_descriptor); + + /* according to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some + * devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request. Still, + * to follow the spec as closely as possible, try opening the device */ + + ret = (*(device))->DeviceRequest (device, &req); + + if (kIOReturnOverrun == ret && kUSBDeviceDesc == priv->dev_descriptor.bDescriptorType) + /* received an overrun error but we still received a device descriptor */ + ret = kIOReturnSuccess; + + if (kIOReturnSuccess == ret && (0 == priv->dev_descriptor.bNumConfigurations || + 0 == priv->dev_descriptor.bcdUSB)) { + /* work around for incorrectly configured devices */ + if (try_reconfigure && is_open) { + usbi_dbg("descriptor appears to be invalid. resetting configuration before trying again..."); + + /* set the first configuration */ + (*device)->SetConfiguration(device, 1); + + /* don't try to reconfigure again */ + try_reconfigure = 0; + } + + ret = kIOUSBPipeStalled; + } + + if (kIOReturnSuccess != ret && is_open && try_unsuspend) { + /* device may be suspended. unsuspend it and try again */ +#if DeviceVersion >= 320 + UInt32 info; + + /* IOUSBFamily 320+ provides a way to detect device suspension but earlier versions do not */ + (void)(*device)->GetUSBDeviceInformation (device, &info); + + try_unsuspend = info & (1 << kUSBInformationDeviceIsSuspendedBit); +#endif + + if (try_unsuspend) { + /* resume the device */ + ret2 = (*device)->USBDeviceSuspend (device, 0); + if (kIOReturnSuccess != ret2) { + /* prevent log spew from poorly behaving devices. this indicates the + os actually had trouble communicating with the device */ + usbi_dbg("could not retrieve device descriptor. failed to unsuspend: %s",darwin_error_str(ret2)); + } else + unsuspended = 1; + + try_unsuspend = 0; + } + } + + if (kIOReturnSuccess != ret) { + usbi_dbg("kernel responded with code: 0x%08x. sleeping for %d ms before trying again", ret, delay/1000); + /* sleep for a little while before trying again */ + usleep (delay); + } + } while (kIOReturnSuccess != ret && retries--); + + if (unsuspended) + /* resuspend the device */ + (void)(*device)->USBDeviceSuspend (device, 1); + + if (is_open) + (void) (*device)->USBDeviceClose (device); + + if (ret != kIOReturnSuccess) { + /* a debug message was already printed out for this error */ + if (LIBUSB_CLASS_HUB == bDeviceClass) + usbi_dbg ("could not retrieve device descriptor %.4x:%.4x: %s. skipping device", idVendor, idProduct, darwin_error_str (ret)); + else + usbi_warn (ctx, "could not retrieve device descriptor %.4x:%.4x: %s. skipping device", idVendor, idProduct, darwin_error_str (ret)); + + return -1; + } + + usbi_dbg ("device descriptor:"); + usbi_dbg (" bDescriptorType: 0x%02x", priv->dev_descriptor.bDescriptorType); + usbi_dbg (" bcdUSB: 0x%04x", priv->dev_descriptor.bcdUSB); + usbi_dbg (" bDeviceClass: 0x%02x", priv->dev_descriptor.bDeviceClass); + usbi_dbg (" bDeviceSubClass: 0x%02x", priv->dev_descriptor.bDeviceSubClass); + usbi_dbg (" bDeviceProtocol: 0x%02x", priv->dev_descriptor.bDeviceProtocol); + usbi_dbg (" bMaxPacketSize0: 0x%02x", priv->dev_descriptor.bMaxPacketSize0); + usbi_dbg (" idVendor: 0x%04x", priv->dev_descriptor.idVendor); + usbi_dbg (" idProduct: 0x%04x", priv->dev_descriptor.idProduct); + usbi_dbg (" bcdDevice: 0x%04x", priv->dev_descriptor.bcdDevice); + usbi_dbg (" iManufacturer: 0x%02x", priv->dev_descriptor.iManufacturer); + usbi_dbg (" iProduct: 0x%02x", priv->dev_descriptor.iProduct); + usbi_dbg (" iSerialNumber: 0x%02x", priv->dev_descriptor.iSerialNumber); + usbi_dbg (" bNumConfigurations: 0x%02x", priv->dev_descriptor.bNumConfigurations); + + /* catch buggy hubs (which appear to be virtual). Apple's own USB prober has problems with these devices. */ + if (libusb_le16_to_cpu (priv->dev_descriptor.idProduct) != idProduct) { + /* not a valid device */ + usbi_warn (ctx, "idProduct from iokit (%04x) does not match idProduct in descriptor (%04x). skipping device", + idProduct, libusb_le16_to_cpu (priv->dev_descriptor.idProduct)); + return -1; + } + + return 0; +} + +static int process_new_device (struct libusb_context *ctx, usb_device_t **device, UInt32 locationID, struct discovered_devs **_discdevs) { + struct darwin_device_priv *priv; + struct libusb_device *dev; + struct discovered_devs *discdevs; + UInt16 address; + UInt8 devSpeed; + int ret = 0, need_unref = 0; + + do { + dev = usbi_get_device_by_session_id(ctx, locationID); + if (!dev) { + usbi_info (ctx, "allocating new device for location 0x%08x", locationID); + dev = usbi_alloc_device(ctx, locationID); + need_unref = 1; + } else + usbi_info (ctx, "using existing device for location 0x%08x", locationID); + + if (!dev) { + ret = LIBUSB_ERROR_NO_MEM; + break; + } + + priv = (struct darwin_device_priv *)dev->os_priv; + + (*device)->GetDeviceAddress (device, (USBDeviceAddress *)&address); + + ret = darwin_cache_device_descriptor (ctx, dev, device); + if (ret < 0) + break; + + /* check current active configuration (and cache the first configuration value-- which may be used by claim_interface) */ + ret = darwin_check_configuration (ctx, dev, device); + if (ret < 0) + break; + + dev->bus_number = locationID >> 24; + dev->device_address = address; + + (*device)->GetDeviceSpeed (device, &devSpeed); + + switch (devSpeed) { + case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break; + case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break; + case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break; + default: + usbi_warn (ctx, "Got unknown device speed %d", devSpeed); + } + + /* save our location, we'll need this later */ + priv->location = locationID; + snprintf(priv->sys_path, 20, "%03i-%04x-%04x-%02x-%02x", address, priv->dev_descriptor.idVendor, priv->dev_descriptor.idProduct, + priv->dev_descriptor.bDeviceClass, priv->dev_descriptor.bDeviceSubClass); + + ret = usbi_sanitize_device (dev); + if (ret < 0) + break; + + /* append the device to the list of discovered devices */ + discdevs = discovered_devs_append(*_discdevs, dev); + if (!discdevs) { + ret = LIBUSB_ERROR_NO_MEM; + break; + } + + *_discdevs = discdevs; + + usbi_info (ctx, "found device with address %d at %s", dev->device_address, priv->sys_path); + } while (0); + + if (need_unref) + libusb_unref_device(dev); + + return ret; +} + +static int darwin_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) { + io_iterator_t deviceIterator; + usb_device_t **device; + kern_return_t kresult; + UInt32 location; + + kresult = usb_setup_device_iterator (&deviceIterator, 0); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + while ((device = usb_get_next_device (deviceIterator, &location)) != NULL) { + (void) process_new_device (ctx, device, location, _discdevs); + + (*(device))->Release(device); + } + + IOObjectRelease(deviceIterator); + + return 0; +} + +static int darwin_open (struct libusb_device_handle *dev_handle) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + usb_device_t **darwin_device; + IOReturn kresult; + + if (0 == dpriv->open_count) { + kresult = darwin_get_device (dpriv->location, &darwin_device); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "could not find device: %s", darwin_error_str (kresult)); + return darwin_to_libusb (kresult); + } + + dpriv->device = darwin_device; + + /* try to open the device */ + kresult = (*(dpriv->device))->USBDeviceOpen (dpriv->device); + + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "USBDeviceOpen: %s", darwin_error_str(kresult)); + + switch (kresult) { + case kIOReturnExclusiveAccess: + /* it is possible to perform some actions on a device that is not open so do not return an error */ + priv->is_open = 0; + + break; + default: + (*(dpriv->device))->Release (dpriv->device); + dpriv->device = NULL; + return darwin_to_libusb (kresult); + } + } else { + /* create async event source */ + kresult = (*(dpriv->device))->CreateDeviceAsyncEventSource (dpriv->device, &priv->cfSource); + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "CreateDeviceAsyncEventSource: %s", darwin_error_str(kresult)); + + (*(dpriv->device))->USBDeviceClose (dpriv->device); + (*(dpriv->device))->Release (dpriv->device); + + dpriv->device = NULL; + return darwin_to_libusb (kresult); + } + + priv->is_open = 1; + + CFRetain (libusb_darwin_acfl); + + /* add the cfSource to the aync run loop */ + CFRunLoopAddSource(libusb_darwin_acfl, priv->cfSource, kCFRunLoopCommonModes); + } + } + + /* device opened successfully */ + dpriv->open_count++; + + /* create a file descriptor for notifications */ + pipe (priv->fds); + + /* set the pipe to be non-blocking */ + fcntl (priv->fds[1], F_SETFD, O_NONBLOCK); + + usbi_add_pollfd(HANDLE_CTX(dev_handle), priv->fds[0], POLLIN); + + usbi_info (HANDLE_CTX (dev_handle), "device open for access"); + + return 0; +} + +static void darwin_close (struct libusb_device_handle *dev_handle) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + IOReturn kresult; + int i; + + if (dpriv->open_count == 0) { + /* something is probably very wrong if this is the case */ + usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!\n"); + return; + } + + dpriv->open_count--; + + /* make sure all interfaces are released */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + libusb_release_interface (dev_handle, i); + + if (0 == dpriv->open_count) { + if (priv->is_open) { + /* delete the device's async event source */ + if (priv->cfSource) { + CFRunLoopRemoveSource (libusb_darwin_acfl, priv->cfSource, kCFRunLoopDefaultMode); + CFRelease (priv->cfSource); + } + + /* close the device */ + kresult = (*(dpriv->device))->USBDeviceClose(dpriv->device); + if (kresult) { + /* Log the fact that we had a problem closing the file, however failing a + * close isn't really an error, so return success anyway */ + usbi_err (HANDLE_CTX (dev_handle), "USBDeviceClose: %s", darwin_error_str(kresult)); + } + } + + kresult = (*(dpriv->device))->Release(dpriv->device); + if (kresult) { + /* Log the fact that we had a problem closing the file, however failing a + * close isn't really an error, so return success anyway */ + usbi_err (HANDLE_CTX (dev_handle), "Release: %s", darwin_error_str(kresult)); + } + + dpriv->device = NULL; + } + + /* file descriptors are maintained per-instance */ + usbi_remove_pollfd (HANDLE_CTX (dev_handle), priv->fds[0]); + close (priv->fds[1]); + close (priv->fds[0]); + + priv->fds[0] = priv->fds[1] = -1; +} + +static int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + + *config = (int) dpriv->active_config; + + return 0; +} + +static int darwin_set_configuration(struct libusb_device_handle *dev_handle, int config) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + IOReturn kresult; + int i; + + /* Setting configuration will invalidate the interface, so we need + to reclaim it. First, dispose of existing interfaces, if any. */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + darwin_release_interface (dev_handle, i); + + kresult = (*(dpriv->device))->SetConfiguration (dpriv->device, config); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + /* Reclaim any interfaces. */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + darwin_claim_interface (dev_handle, i); + + dpriv->active_config = config; + + return 0; +} + +static int darwin_get_interface (usb_device_t **darwin_device, uint8_t ifc, io_service_t *usbInterfacep) { + IOUSBFindInterfaceRequest request; + uint8_t current_interface; + kern_return_t kresult; + io_iterator_t interface_iterator; + + *usbInterfacep = IO_OBJECT_NULL; + + /* Setup the Interface Request */ + request.bInterfaceClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; + request.bAlternateSetting = kIOUSBFindInterfaceDontCare; + + kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); + if (kresult) + return kresult; + + for ( current_interface = 0 ; current_interface <= ifc ; current_interface++ ) { + *usbInterfacep = IOIteratorNext(interface_iterator); + if (current_interface != ifc) + (void) IOObjectRelease (*usbInterfacep); + } + + /* done with the interface iterator */ + IOObjectRelease(interface_iterator); + + return 0; +} + +static int get_endpoints (struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + kern_return_t kresult; + + u_int8_t numep, direction, number; + u_int8_t dont_care1, dont_care3; + u_int16_t dont_care2; + int i; + + usbi_info (HANDLE_CTX (dev_handle), "building table of endpoints."); + + /* retrieve the total number of endpoints on this interface */ + kresult = (*(cInterface->interface))->GetNumEndpoints(cInterface->interface, &numep); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "can't get number of endpoints for interface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* iterate through pipe references */ + for (i = 1 ; i <= numep ; i++) { + kresult = (*(cInterface->interface))->GetPipeProperties(cInterface->interface, i, &direction, &number, &dont_care1, + &dont_care2, &dont_care3); + + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "error getting pipe information for pipe %d: %s", i, darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); + } + + usbi_info (HANDLE_CTX (dev_handle), "interface: %i pipe %i: dir: %i number: %i", iface, i, direction, number); + + cInterface->endpoint_addrs[i - 1] = ((direction << 7 & LIBUSB_ENDPOINT_DIR_MASK) | (number & LIBUSB_ENDPOINT_ADDRESS_MASK)); + } + + cInterface->num_endpoints = numep; + + return 0; +} + +static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + io_service_t usbInterface = IO_OBJECT_NULL; + IOReturn kresult; + IOCFPlugInInterface **plugInInterface = NULL; + SInt32 score; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + /* make sure we have an interface */ + if (!usbInterface && dpriv->first_config != 0) { + usbi_info (HANDLE_CTX (dev_handle), "no interface found; setting configuration: %d", dpriv->first_config); + + /* set the configuration */ + kresult = darwin_set_configuration (dev_handle, dpriv->first_config); + if (kresult != LIBUSB_SUCCESS) { + usbi_err (HANDLE_CTX (dev_handle), "could not set configuration"); + return kresult; + } + + kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + } + + if (!usbInterface) { + usbi_err (HANDLE_CTX (dev_handle), "interface not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + /* get an interface to the device's interface */ + kresult = IOCreatePlugInInterfaceForService (usbInterface, kIOUSBInterfaceUserClientTypeID, + kIOCFPlugInInterfaceID, &plugInInterface, &score); + + /* ignore release error */ + (void)IOObjectRelease (usbInterface); + + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "IOCreatePlugInInterfaceForService: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + if (!plugInInterface) { + usbi_err (HANDLE_CTX (dev_handle), "plugin interface not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + /* Do the actual claim */ + kresult = (*plugInInterface)->QueryInterface(plugInInterface, + CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), + (LPVOID)&cInterface->interface); + /* We no longer need the intermediate plug-in */ + IODestroyPlugInInterface (plugInInterface); + if (kresult || !cInterface->interface) { + usbi_err (HANDLE_CTX (dev_handle), "QueryInterface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* claim the interface */ + kresult = (*(cInterface->interface))->USBInterfaceOpen(cInterface->interface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "USBInterfaceOpen: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* update list of endpoints */ + kresult = get_endpoints (dev_handle, iface); + if (kresult) { + /* this should not happen */ + darwin_release_interface (dev_handle, iface); + usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); + return kresult; + } + + cInterface->cfSource = NULL; + + /* create async event source */ + kresult = (*(cInterface->interface))->CreateInterfaceAsyncEventSource (cInterface->interface, &cInterface->cfSource); + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "could not create async event source"); + + /* can't continue without an async event source */ + (void)darwin_release_interface (dev_handle, iface); + + return darwin_to_libusb (kresult); + } + + /* add the cfSource to the async thread's run loop */ + CFRunLoopAddSource(libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); + + usbi_info (HANDLE_CTX (dev_handle), "interface opened"); + + return 0; +} + +static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + IOReturn kresult; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + /* Check to see if an interface is open */ + if (!cInterface->interface) + return LIBUSB_SUCCESS; + + /* clean up endpoint data */ + cInterface->num_endpoints = 0; + + /* delete the interface's async event source */ + if (cInterface->cfSource) { + CFRunLoopRemoveSource (libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); + CFRelease (cInterface->cfSource); + } + + kresult = (*(cInterface->interface))->USBInterfaceClose(cInterface->interface); + if (kresult) + usbi_err (HANDLE_CTX (dev_handle), "USBInterfaceClose: %s", darwin_error_str(kresult)); + + kresult = (*(cInterface->interface))->Release(cInterface->interface); + if (kresult != kIOReturnSuccess) + usbi_err (HANDLE_CTX (dev_handle), "Release: %s", darwin_error_str(kresult)); + + cInterface->interface = IO_OBJECT_NULL; + + return darwin_to_libusb (kresult); +} + +static int darwin_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + IOReturn kresult; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + if (!cInterface->interface) + return LIBUSB_ERROR_NO_DEVICE; + + kresult = (*(cInterface->interface))->SetAlternateInterface (cInterface->interface, altsetting); + if (kresult != kIOReturnSuccess) + darwin_reset_device (dev_handle); + + /* update list of endpoints */ + kresult = get_endpoints (dev_handle, iface); + if (kresult) { + /* this should not happen */ + darwin_release_interface (dev_handle, iface); + usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); + return kresult; + } + + return darwin_to_libusb (kresult); +} + +static int darwin_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + IOReturn kresult; + + /* determine the interface/endpoint to use */ + if (ep_to_pipeRef (dev_handle, endpoint, &pipeRef, &iface) != 0) { + usbi_err (HANDLE_CTX (dev_handle), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + +#if (InterfaceVersion < 190) + kresult = (*(cInterface->interface))->ClearPipeStall(cInterface->interface, pipeRef); +#else + /* newer versions of darwin support clearing additional bits on the device's endpoint */ + kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); +#endif + if (kresult) + usbi_err (HANDLE_CTX (dev_handle), "ClearPipeStall: %s", darwin_error_str (kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_reset_device(struct libusb_device_handle *dev_handle) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + IOReturn kresult; + + kresult = (*(dpriv->device))->ResetDevice (dpriv->device); + if (kresult) + usbi_err (HANDLE_CTX (dev_handle), "ResetDevice: %s", darwin_error_str (kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_kernel_driver_active(struct libusb_device_handle *dev_handle, int interface) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)dev_handle->dev->os_priv; + io_service_t usbInterface; + CFTypeRef driver; + IOReturn kresult; + + kresult = darwin_get_interface (dpriv->device, interface, &usbInterface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); + } + + driver = IORegistryEntryCreateCFProperty (usbInterface, kIOBundleIdentifierKey, kCFAllocatorDefault, 0); + IOObjectRelease (usbInterface); + + if (driver) { + CFRelease (driver); + + return 1; + } + + /* no driver */ + return 0; +} + +/* attaching/detaching kernel drivers is not currently supported (maybe in the future?) */ +static int darwin_attach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { + (void)dev_handle; + (void)interface; + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int darwin_detach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { + (void)dev_handle; + (void)interface; + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void darwin_destroy_device(struct libusb_device *dev) { + (void)dev; +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + + IOReturn ret; + uint8_t transferType; + /* None of the values below are used in libusb for bulk transfers */ + uint8_t direction, number, interval, pipeRef, iface; + uint16_t maxPacketSize; + + struct darwin_interface *cInterface; + + if (IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) + return LIBUSB_ERROR_NOT_SUPPORTED; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + /* submit the request */ + /* timeouts are unavailable on interrupt endpoints */ + if (transferType == kUSBInterrupt) { + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadPipeAsync(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, darwin_async_io_callback, itransfer); + else + ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, darwin_async_io_callback, itransfer); + } else { + itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, transfer->timeout, transfer->timeout, + darwin_async_io_callback, (void *)itransfer); + else + ret = (*(cInterface->interface))->WritePipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, transfer->timeout, transfer->timeout, + darwin_async_io_callback, (void *)itransfer); + } + + if (ret) + usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(ret), ret); + + return darwin_to_libusb (ret); +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + + IOReturn kresult; + uint8_t pipeRef, iface; + UInt64 frame; + AbsoluteTime atTime; + int i; + + struct darwin_interface *cInterface; + + /* construct an array of IOUSBIsocFrames, reuse the old one if possible */ + if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) { + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + if (!tpriv->isoc_framelist) { + tpriv->num_iso_packets = transfer->num_iso_packets; + tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame)); + if (!tpriv->isoc_framelist) + return LIBUSB_ERROR_NO_MEM; + } + + /* copy the frame list from the libusb descriptor (the structures differ only is member order) */ + for (i = 0 ; i < transfer->num_iso_packets ; i++) + tpriv->isoc_framelist[i].frReqCount = transfer->iso_packet_desc[i].length; + + /* determine the interface/endpoint to use */ + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + /* Last but not least we need the bus frame number */ + kresult = (*(cInterface->interface))->GetBusFrameNumber(cInterface->interface, &frame, &atTime); + if (kresult) { + usbi_err (TRANSFER_CTX (transfer), "failed to get bus frame number: %d", kresult); + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + + return darwin_to_libusb (kresult); + } + + /* schedule for a frame a little in the future */ + frame += 4; + + if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint]) + frame = cInterface->frames[transfer->endpoint]; + + /* submit the request */ + if (IS_XFERIN(transfer)) + kresult = (*(cInterface->interface))->ReadIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, + transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, + itransfer); + else + kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, + transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, + itransfer); + + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets / 8; + + if (kresult != kIOReturnSuccess) { + usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(kresult)); + free (tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + return darwin_to_libusb (kresult); +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_control_setup *setup = (struct libusb_control_setup *) transfer->buffer; + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)transfer->dev_handle->dev->os_priv; + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + IOReturn kresult; + + bzero(&tpriv->req, sizeof(tpriv->req)); + + /* IOUSBDeviceInterface expects the request in cpu endianess */ + tpriv->req.bmRequestType = setup->bmRequestType; + tpriv->req.bRequest = setup->bRequest; + /* these values should be in bus order from libusb_fill_control_setup */ + tpriv->req.wValue = OSSwapLittleToHostInt16 (setup->wValue); + tpriv->req.wIndex = OSSwapLittleToHostInt16 (setup->wIndex); + tpriv->req.wLength = OSSwapLittleToHostInt16 (setup->wLength); + /* data is stored after the libusb control block */ + tpriv->req.pData = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; + tpriv->req.completionTimeout = transfer->timeout; + tpriv->req.noDataTimeout = transfer->timeout; + + itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + /* all transfers in libusb-1.0 are async */ + + if (transfer->endpoint) { + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + kresult = (*(cInterface->interface))->ControlRequestAsyncTO (cInterface->interface, pipeRef, &(tpriv->req), darwin_async_io_callback, itransfer); + } else + /* control request on endpoint 0 */ + kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer); + + if (kresult != kIOReturnSuccess) + usbi_err (TRANSFER_CTX (transfer), "control request failed: %s", darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_submit_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int cancel_control_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)transfer->dev_handle->dev->os_priv; + IOReturn kresult; + + usbi_info (ITRANSFER_CTX (itransfer), "WARNING: aborting all transactions control pipe"); + + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + + kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device); + + return darwin_to_libusb (kresult); +} + +static int darwin_abort_transfers (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)transfer->dev_handle->dev->os_priv; + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + IOReturn kresult; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + cInterface = &priv->interfaces[iface]; + + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_info (ITRANSFER_CTX (itransfer), "WARNING: aborting all transactions on interface %d pipe %d", iface, pipeRef); + + /* abort transactions */ + (*(cInterface->interface))->AbortPipe (cInterface->interface, pipeRef); + + usbi_info (ITRANSFER_CTX (itransfer), "calling clear pipe stall to clear the data toggle bit"); + + /* clear the data toggle bit */ +#if (InterfaceVersion < 190) + kresult = (*(cInterface->interface))->ClearPipeStall(cInterface->interface, pipeRef); +#else + /* newer versions of darwin support clearing additional bits on the device's endpoint */ + kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); +#endif + + return darwin_to_libusb (kresult); +} + +static int darwin_cancel_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return cancel_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return darwin_abort_transfers (itransfer); + default: + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS && tpriv->isoc_framelist) { + free (tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } +} + +static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) { + struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon; + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; + UInt32 message, size; + + usbi_info (ITRANSFER_CTX (itransfer), "an async io operation has completed"); + + size = (UInt32) (uintptr_t) arg0; + + /* send a completion message to the device's file descriptor */ + message = MESSAGE_ASYNC_IO_COMPLETE; + write (priv->fds[1], &message, sizeof (message)); + write (priv->fds[1], &itransfer, sizeof (itransfer)); + write (priv->fds[1], &result, sizeof (IOReturn)); + write (priv->fds[1], &size, sizeof (size)); +} + +static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) { + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) + result = kIOUSBTransactionTimeout; + + switch (result) { + case kIOReturnUnderrun: + case kIOReturnSuccess: + return LIBUSB_TRANSFER_COMPLETED; + case kIOReturnAborted: + return LIBUSB_TRANSFER_CANCELLED; + case kIOUSBPipeStalled: + usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: pipe is stalled"); + return LIBUSB_TRANSFER_STALL; + case kIOReturnOverrun: + usbi_err (ITRANSFER_CTX (itransfer), "transfer error: data overrun"); + return LIBUSB_TRANSFER_OVERFLOW; + case kIOUSBTransactionTimeout: + usbi_err (ITRANSFER_CTX (itransfer), "transfer error: timed out"); + itransfer->flags |= USBI_TRANSFER_TIMED_OUT; + return LIBUSB_TRANSFER_TIMED_OUT; + default: + usbi_err (ITRANSFER_CTX (itransfer), "transfer error: %s (value = 0x%08x)", darwin_error_str (result), result); + return LIBUSB_TRANSFER_ERROR; + } +} + +static void darwin_handle_callback (struct usbi_transfer *itransfer, kern_return_t result, UInt32 io_size) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int isIsoc = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type; + int isBulk = LIBUSB_TRANSFER_TYPE_BULK == transfer->type; + int isControl = LIBUSB_TRANSFER_TYPE_CONTROL == transfer->type; + int isInterrupt = LIBUSB_TRANSFER_TYPE_INTERRUPT == transfer->type; + int i; + + if (!isIsoc && !isBulk && !isControl && !isInterrupt) { + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return; + } + + usbi_info (ITRANSFER_CTX (itransfer), "handling %s completion with kernel status %d", + isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", result); + + if (kIOReturnSuccess == result || kIOReturnUnderrun == result) { + if (isIsoc && tpriv->isoc_framelist) { + /* copy isochronous results back */ + + for (i = 0; i < transfer->num_iso_packets ; i++) { + struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i]; + lib_desc->status = darwin_to_libusb (tpriv->isoc_framelist[i].frStatus); + lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount; + } + } else if (!isIsoc) + itransfer->transferred += io_size; + } + + /* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */ + usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, result)); +} + +static int op_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) { + struct usbi_transfer *itransfer; + UInt32 io_size; + IOReturn kresult; + POLL_NFDS_TYPE i = 0; + ssize_t ret; + UInt32 message; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + struct pollfd *pollfd = &fds[i]; + struct libusb_device_handle *handle; + struct darwin_device_handle_priv *hpriv = NULL; + + usbi_info (ctx, "checking fd %i with revents = %x", fds[i], pollfd->revents); + + if (!pollfd->revents) + continue; + + num_ready--; + list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { + hpriv = (struct darwin_device_handle_priv *)handle->os_priv; + if (hpriv->fds[0] == pollfd->fd) + break; + } + + if (!(pollfd->revents & POLLERR)) { + ret = read (hpriv->fds[0], &message, sizeof (message)); + if (ret < (ssize_t)sizeof (message)) + continue; + } else + /* could not poll the device-- response is to delete the device (this seems a little heavy-handed) */ + message = MESSAGE_DEVICE_GONE; + + switch (message) { + case MESSAGE_DEVICE_GONE: + /* remove the device's async port from the runloop */ + if (hpriv->cfSource) { + if (libusb_darwin_acfl) + CFRunLoopRemoveSource (libusb_darwin_acfl, hpriv->cfSource, kCFRunLoopDefaultMode); + CFRelease (hpriv->cfSource); + hpriv->cfSource = NULL; + } + + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fds[0]); + usbi_handle_disconnect(handle); + + /* done with this device */ + continue; + case MESSAGE_ASYNC_IO_COMPLETE: + read (hpriv->fds[0], &itransfer, sizeof (itransfer)); + read (hpriv->fds[0], &kresult, sizeof (IOReturn)); + read (hpriv->fds[0], &io_size, sizeof (UInt32)); + + darwin_handle_callback (itransfer, kresult, io_size); + break; + default: + usbi_err (ctx, "unknown message received from device pipe"); + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + + return 0; +} + +static int darwin_clock_gettime(int clk_id, struct timespec *tp) { + mach_timespec_t sys_time; + clock_serv_t clock_ref; + + switch (clk_id) { + case USBI_CLOCK_REALTIME: + /* CLOCK_REALTIME represents time since the epoch */ + clock_ref = clock_realtime; + break; + case USBI_CLOCK_MONOTONIC: + /* use system boot time as reference for the monotonic clock */ + clock_ref = clock_monotonic; + break; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } + + clock_get_time (clock_ref, &sys_time); + + tp->tv_sec = sys_time.tv_sec; + tp->tv_nsec = sys_time.tv_nsec; + + return 0; +} + +const struct usbi_os_backend darwin_backend = { + .name = "Darwin", + .init = darwin_init, + .exit = darwin_exit, + .get_device_list = darwin_get_device_list, + .get_device_descriptor = darwin_get_device_descriptor, + .get_active_config_descriptor = darwin_get_active_config_descriptor, + .get_config_descriptor = darwin_get_config_descriptor, + + .open = darwin_open, + .close = darwin_close, + .get_configuration = darwin_get_configuration, + .set_configuration = darwin_set_configuration, + .claim_interface = darwin_claim_interface, + .release_interface = darwin_release_interface, + + .set_interface_altsetting = darwin_set_interface_altsetting, + .clear_halt = darwin_clear_halt, + .reset_device = darwin_reset_device, + + .kernel_driver_active = darwin_kernel_driver_active, + .detach_kernel_driver = darwin_detach_kernel_driver, + .attach_kernel_driver = darwin_attach_kernel_driver, + + .destroy_device = darwin_destroy_device, + + .submit_transfer = darwin_submit_transfer, + .cancel_transfer = darwin_cancel_transfer, + .clear_transfer_priv = darwin_clear_transfer_priv, + + .handle_events = op_handle_events, + + .clock_gettime = darwin_clock_gettime, + + .device_priv_size = sizeof(struct darwin_device_priv), + .device_handle_priv_size = sizeof(struct darwin_device_handle_priv), + .transfer_priv_size = sizeof(struct darwin_transfer_priv), + .add_iso_packet_size = 0, +}; + diff --git a/libusb/libusb/libusb/os/darwin_usb.h b/libusb/libusb/libusb/os/darwin_usb.h new file mode 100644 index 0000000..59d0a69 --- /dev/null +++ b/libusb/libusb/libusb/os/darwin_usb.h @@ -0,0 +1,169 @@ +/* + * darwin backend for libusb 1.0 + * Copyright (C) 2008-2009 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(LIBUSB_DARWIN_H) +#define LIBUSB_DARWIN_H + +#include "libusbi.h" + +#include +#include +#include +#include + +/* IOUSBInterfaceInferface */ +#if defined (kIOUSBInterfaceInterfaceID300) + +#define usb_interface_t IOUSBInterfaceInterface300 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 +#define InterfaceVersion 300 + +#elif defined (kIOUSBInterfaceInterfaceID245) + +#define usb_interface_t IOUSBInterfaceInterface245 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 +#define InterfaceVersion 245 + +#elif defined (kIOUSBInterfaceInterfaceID220) + +#define usb_interface_t IOUSBInterfaceInterface220 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 +#define InterfaceVersion 220 + +#elif defined (kIOUSBInterfaceInterfaceID197) + +#define usb_interface_t IOUSBInterfaceInterface197 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID197 +#define InterfaceVersion 197 + +#elif defined (kIOUSBInterfaceInterfaceID190) + +#define usb_interface_t IOUSBInterfaceInterface190 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID190 +#define InterfaceVersion 190 + +#elif defined (kIOUSBInterfaceInterfaceID182) + +#define usb_interface_t IOUSBInterfaceInterface182 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID182 +#define InterfaceVersion 182 + +#else + +#error "IOUSBFamily is too old. Please upgrade your OS" + +#endif + +/* IOUSBDeviceInterface */ +#if defined (kIOUSBDeviceInterfaceID320) + +#define usb_device_t IOUSBDeviceInterface320 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 +#define DeviceVersion 320 + +#elif defined (kIOUSBDeviceInterfaceID300) + +#define usb_device_t IOUSBDeviceInterface300 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 +#define DeviceVersion 300 + +#elif defined (kIOUSBDeviceInterfaceID245) + +#define usb_device_t IOUSBDeviceInterface245 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 +#define DeviceVersion 245 + +#elif defined (kIOUSBDeviceInterfaceID197) + +#define usb_device_t IOUSBDeviceInterface197 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 +#define DeviceVersion 197 + +#elif defined (kIOUSBDeviceInterfaceID187) + +#define usb_device_t IOUSBDeviceInterface187 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID187 +#define DeviceVersion 187 + +#elif defined (kIOUSBDeviceInterfaceID182) + +#define usb_device_t IOUSBDeviceInterface182 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID182 +#define DeviceVersion 182 + +#else + +#error "IOUSBFamily is too old. Please upgrade your OS" + +#endif + +#if !defined(IO_OBJECT_NULL) +#define IO_OBJECT_NULL ((io_object_t) 0) +#endif + +typedef IOCFPlugInInterface *io_cf_plugin_ref_t; +typedef IONotificationPortRef io_notification_port_t; + +/* private structures */ +struct darwin_device_priv { + IOUSBDeviceDescriptor dev_descriptor; + UInt32 location; + char sys_path[21]; + usb_device_t **device; + int open_count; + UInt8 first_config, active_config; +}; + +struct darwin_device_handle_priv { + int is_open; + CFRunLoopSourceRef cfSource; + int fds[2]; + + struct darwin_interface { + usb_interface_t **interface; + uint8_t num_endpoints; + CFRunLoopSourceRef cfSource; + uint64_t frames[256]; + uint8_t endpoint_addrs[USB_MAXENDPOINTS]; + } interfaces[USB_MAXINTERFACES]; +}; + +struct darwin_transfer_priv { + /* Isoc */ + IOUSBIsocFrame *isoc_framelist; + size_t num_iso_packets; + + /* Control */ +#if !defined (LIBUSB_NO_TIMEOUT_DEVICE) + IOUSBDevRequestTO req; +#else + IOUSBDevRequest req; +#endif + + /* Bulk */ +}; + +enum { + MESSAGE_DEVICE_GONE, + MESSAGE_ASYNC_IO_COMPLETE +}; + + + +#endif diff --git a/libusb/libusb/libusb/os/linux_usbfs.c b/libusb/libusb/libusb/os/linux_usbfs.c new file mode 100644 index 0000000..02d182d --- /dev/null +++ b/libusb/libusb/libusb/os/linux_usbfs.c @@ -0,0 +1,2438 @@ +/* + * Linux usbfs backend for libusb + * Copyright (C) 2007-2009 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusb.h" +#include "libusbi.h" +#include "linux_usbfs.h" + +/* sysfs vs usbfs: + * opening a usbfs node causes the device to be resumed, so we attempt to + * avoid this during enumeration. + * + * sysfs allows us to read the kernel's in-memory copies of device descriptors + * and so forth, avoiding the need to open the device: + * - The binary "descriptors" file was added in 2.6.23. + * - The "busnum" file was added in 2.6.22 + * - The "devnum" file has been present since pre-2.6.18 + * - the "bConfigurationValue" file has been present since pre-2.6.18 + * + * If we have bConfigurationValue, busnum, and devnum, then we can determine + * the active configuration without having to open the usbfs node in RDWR mode. + * We assume this is the case if we see the busnum file (indicates 2.6.22+). + * The busnum file is important as that is the only way we can relate sysfs + * devices to usbfs nodes. + * + * If we also have descriptors, we can obtain the device descriptor and active + * configuration without touching usbfs at all. + * + * The descriptors file originally only contained the active configuration + * descriptor alongside the device descriptor, but all configurations are + * included as of Linux 2.6.26. + */ + +/* endianness for multi-byte fields: + * + * Descriptors exposed by usbfs have the multi-byte fields in the device + * descriptor as host endian. Multi-byte fields in the other descriptors are + * bus-endian. The kernel documentation says otherwise, but it is wrong. + */ + +static const char *usbfs_path = NULL; + +/* use usbdev*.* device names in /dev instead of the usbfs bus directories */ +static int usbdev_names = 0; + +/* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically + * allows us to mark URBs as being part of a specific logical transfer when + * we submit them to the kernel. then, on any error except a cancellation, all + * URBs within that transfer will be cancelled and no more URBs will be + * accepted for the transfer, meaning that no more data can creep in. + * + * The BULK_CONTINUATION flag must be set on all URBs within a bulk transfer + * (in either direction) except the first. + * For IN transfers, we must also set SHORT_NOT_OK on all URBs except the + * last; it means that the kernel should treat a short reply as an error. + * For OUT transfers, SHORT_NOT_OK must not be set. it isn't needed (OUT + * transfers can't be short unless there's already some sort of error), and + * setting this flag is disallowed (a kernel with USB debugging enabled will + * reject such URBs). + */ +static int supports_flag_bulk_continuation = -1; + +/* Linux 2.6.31 fixes support for the zero length packet URB flag. This + * allows us to mark URBs that should be followed by a zero length data + * packet, which can be required by device- or class-specific protocols. + */ +static int supports_flag_zero_packet = -1; + +/* clock ID for monotonic clock, as not all clock sources are available on all + * systems. appropriate choice made at initialization time. */ +static clockid_t monotonic_clkid = -1; + +/* do we have a busnum to relate devices? this also implies that we can read + * the active configuration through bConfigurationValue */ +static int sysfs_can_relate_devices = 0; + +/* do we have a descriptors file? */ +static int sysfs_has_descriptors = 0; + +struct linux_device_priv { + char *sysfs_dir; + unsigned char *dev_descriptor; + unsigned char *config_descriptor; +}; + +struct linux_device_handle_priv { + int fd; +}; + +enum reap_action { + NORMAL = 0, + /* submission failed after the first URB, so await cancellation/completion + * of all the others */ + SUBMIT_FAILED, + + /* cancelled by user or timeout */ + CANCELLED, + + /* completed multi-URB transfer in non-final URB */ + COMPLETED_EARLY, + + /* one or more urbs encountered a low-level error */ + ERROR, +}; + +struct linux_transfer_priv { + union { + struct usbfs_urb *urbs; + struct usbfs_urb **iso_urbs; + }; + + enum reap_action reap_action; + int num_urbs; + unsigned int num_retired; + enum libusb_transfer_status reap_status; + + /* next iso packet in user-supplied transfer to be populated */ + int iso_packet_offset; +}; + +static void _get_usbfs_path(struct libusb_device *dev, char *path) +{ + if (usbdev_names) + snprintf(path, PATH_MAX, "%s/usbdev%d.%d", + usbfs_path, dev->bus_number, dev->device_address); + else + snprintf(path, PATH_MAX, "%s/%03d/%03d", + usbfs_path, dev->bus_number, dev->device_address); +} + +static struct linux_device_priv *_device_priv(struct libusb_device *dev) +{ + return (struct linux_device_priv *) dev->os_priv; +} + +static struct linux_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct linux_device_handle_priv *) handle->os_priv; +} + +/* check dirent for a /dev/usbdev%d.%d name + * optionally return bus/device on success */ +static int _is_usbdev_entry(struct dirent *entry, int *bus_p, int *dev_p) +{ + int busnum, devnum; + + if (sscanf(entry->d_name, "usbdev%d.%d", &busnum, &devnum) != 2) + return 0; + + usbi_dbg("found: %s", entry->d_name); + if (bus_p != NULL) + *bus_p = busnum; + if (dev_p != NULL) + *dev_p = devnum; + return 1; +} + +static int check_usb_vfs(const char *dirname) +{ + DIR *dir; + struct dirent *entry; + int found = 0; + + dir = opendir(dirname); + if (!dir) + return 0; + + while ((entry = readdir(dir)) != NULL) { + if (entry->d_name[0] == '.') + continue; + + /* We assume if we find any files that it must be the right place */ + found = 1; + break; + } + + closedir(dir); + return found; +} + +static const char *find_usbfs_path(void) +{ + const char *path = "/dev/bus/usb"; + const char *ret = NULL; + + if (check_usb_vfs(path)) { + ret = path; + } else { + path = "/proc/bus/usb"; + if (check_usb_vfs(path)) + ret = path; + } + + /* look for /dev/usbdev*.* if the normal places fail */ + if (ret == NULL) { + struct dirent *entry; + DIR *dir; + + path = "/dev"; + dir = opendir(path); + if (dir != NULL) { + while ((entry = readdir(dir)) != NULL) { + if (_is_usbdev_entry(entry, NULL, NULL)) { + /* found one; that's enough */ + ret = path; + usbdev_names = 1; + break; + } + } + closedir(dir); + } + } + + if (ret != NULL) + usbi_dbg("found usbfs at %s", ret); + + return ret; +} + +/* the monotonic clock is not usable on all systems (e.g. embedded ones often + * seem to lack it). fall back to REALTIME if we have to. */ +static clockid_t find_monotonic_clock(void) +{ +#ifdef CLOCK_MONOTONIC + struct timespec ts; + int r; + + /* Linux 2.6.28 adds CLOCK_MONOTONIC_RAW but we don't use it + * because it's not available through timerfd */ + r = clock_gettime(CLOCK_MONOTONIC, &ts); + if (r == 0) + return CLOCK_MONOTONIC; + usbi_dbg("monotonic clock doesn't work, errno %d", errno); +#endif + + return CLOCK_REALTIME; +} + +static int kernel_version_ge(int major, int minor, int sublevel) +{ + struct utsname uts; + int atoms, kmajor, kminor, ksublevel; + + if (uname(&uts) < 0) + return -1; + atoms = sscanf(uts.release, "%d.%d.%d", &kmajor, &kminor, &ksublevel); + if (atoms < 1) + return -1; + + if (kmajor > major) + return 1; + if (kmajor < major) + return 0; + + /* kmajor == major */ + if (atoms < 2) + return 0 == minor && 0 == sublevel; + if (kminor > minor) + return 1; + if (kminor < minor) + return 0; + + /* kminor == minor */ + if (atoms < 3) + return 0 == sublevel; + + return ksublevel >= sublevel; +} + +/* Return 1 if filename exists inside dirname in sysfs. + SYSFS_DEVICE_PATH is assumed to be the beginning of the path. */ +static int sysfs_has_file(const char *dirname, const char *filename) +{ + struct stat statbuf; + char path[PATH_MAX]; + int r; + + snprintf(path, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, dirname, filename); + r = stat(path, &statbuf); + if (r == 0 && S_ISREG(statbuf.st_mode)) + return 1; + + return 0; +} + +static int op_init(struct libusb_context *ctx) +{ + struct stat statbuf; + int r; + + usbfs_path = find_usbfs_path(); + if (!usbfs_path) { + usbi_err(ctx, "could not find usbfs"); + return LIBUSB_ERROR_OTHER; + } + + if (monotonic_clkid == -1) + monotonic_clkid = find_monotonic_clock(); + + if (supports_flag_bulk_continuation == -1) { + /* bulk continuation URB flag available from Linux 2.6.32 */ + supports_flag_bulk_continuation = kernel_version_ge(2,6,32); + if (supports_flag_bulk_continuation == -1) { + usbi_err(ctx, "error checking for bulk continuation support"); + return LIBUSB_ERROR_OTHER; + } + } + + if (supports_flag_bulk_continuation) + usbi_dbg("bulk continuation flag supported"); + + if (-1 == supports_flag_zero_packet) { + /* zero length packet URB flag fixed since Linux 2.6.31 */ + supports_flag_zero_packet = kernel_version_ge(2,6,31); + if (-1 == supports_flag_zero_packet) { + usbi_err(ctx, "error checking for zero length packet support"); + return LIBUSB_ERROR_OTHER; + } + } + + if (supports_flag_zero_packet) + usbi_dbg("zero length packet flag supported"); + + r = stat(SYSFS_DEVICE_PATH, &statbuf); + if (r == 0 && S_ISDIR(statbuf.st_mode)) { + DIR *devices = opendir(SYSFS_DEVICE_PATH); + struct dirent *entry; + + usbi_dbg("found usb devices in sysfs"); + + if (!devices) { + usbi_err(ctx, "opendir devices failed errno=%d", errno); + return LIBUSB_ERROR_IO; + } + + /* Make sure sysfs supports all the required files. If it + * does not, then usbfs will be used instead. Determine + * this by looping through the directories in + * SYSFS_DEVICE_PATH. With the assumption that there will + * always be subdirectories of the name usbN (usb1, usb2, + * etc) representing the root hubs, check the usbN + * subdirectories to see if they have all the needed files. + * This algorithm uses the usbN subdirectories (root hubs) + * because a device disconnection will cause a race + * condition regarding which files are available, sometimes + * causing an incorrect result. The root hubs are used + * because it is assumed that they will always be present. + * See the "sysfs vs usbfs" comment at the top of this file + * for more details. */ + while ((entry = readdir(devices))) { + int has_busnum=0, has_devnum=0, has_descriptors=0; + int has_configuration_value=0; + + /* Only check the usbN directories. */ + if (strncmp(entry->d_name, "usb", 3) != 0) + continue; + + /* Check for the files libusb needs from sysfs. */ + has_busnum = sysfs_has_file(entry->d_name, "busnum"); + has_devnum = sysfs_has_file(entry->d_name, "devnum"); + has_descriptors = sysfs_has_file(entry->d_name, "descriptors"); + has_configuration_value = sysfs_has_file(entry->d_name, "bConfigurationValue"); + + if (has_busnum && has_devnum && has_configuration_value) + sysfs_can_relate_devices = 1; + if (has_descriptors) + sysfs_has_descriptors = 1; + + /* Only need to check until we've found ONE device which + has all the attributes. */ + if (sysfs_has_descriptors && sysfs_can_relate_devices) + break; + } + closedir(devices); + + /* Only use sysfs descriptors if the rest of + sysfs will work for libusb. */ + if (!sysfs_can_relate_devices) + sysfs_has_descriptors = 0; + } else { + usbi_dbg("sysfs usb info not available"); + sysfs_has_descriptors = 0; + sysfs_can_relate_devices = 0; + } + + return 0; +} + +static int usbfs_get_device_descriptor(struct libusb_device *dev, + unsigned char *buffer) +{ + struct linux_device_priv *priv = _device_priv(dev); + + /* return cached copy */ + memcpy(buffer, priv->dev_descriptor, DEVICE_DESC_LENGTH); + return 0; +} + +static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) +{ + struct linux_device_priv *priv = _device_priv(dev); + char filename[PATH_MAX]; + int fd; + + snprintf(filename, PATH_MAX, "%s/%s/%s", + SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); + fd = open(filename, O_RDONLY); + if (fd < 0) { + usbi_err(DEVICE_CTX(dev), + "open %s failed ret=%d errno=%d", filename, fd, errno); + return LIBUSB_ERROR_IO; + } + + return fd; +} + +/* Note only suitable for attributes which always read >= 0, < 0 is error */ +static int __read_sysfs_attr(struct libusb_context *ctx, + const char *devname, const char *attr) +{ + char filename[PATH_MAX]; + FILE *f; + int r, value; + + snprintf(filename, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, + devname, attr); + f = fopen(filename, "r"); + if (f == NULL) { + if (errno == ENOENT) { + /* File doesn't exist. Assume the device has been + disconnected (see trac ticket #70). */ + return LIBUSB_ERROR_NO_DEVICE; + } + usbi_err(ctx, "open %s failed errno=%d", filename, errno); + return LIBUSB_ERROR_IO; + } + + r = fscanf(f, "%d", &value); + fclose(f); + if (r != 1) { + usbi_err(ctx, "fscanf %s returned %d, errno=%d", attr, r, errno); + return LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */ + } + if (value < 0) { + usbi_err(ctx, "%s contains a negative value", filename); + return LIBUSB_ERROR_IO; + } + + return value; +} + +static int sysfs_get_device_descriptor(struct libusb_device *dev, + unsigned char *buffer) +{ + int fd; + ssize_t r; + + /* sysfs provides access to an in-memory copy of the device descriptor, + * so we use that rather than keeping our own copy */ + + fd = _open_sysfs_attr(dev, "descriptors"); + if (fd < 0) + return fd; + + r = read(fd, buffer, DEVICE_DESC_LENGTH);; + close(fd); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d", fd, errno); + return LIBUSB_ERROR_IO; + } else if (r < DEVICE_DESC_LENGTH) { + usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, DEVICE_DESC_LENGTH); + return LIBUSB_ERROR_IO; + } + + return 0; +} + +static int op_get_device_descriptor(struct libusb_device *dev, + unsigned char *buffer, int *host_endian) +{ + if (sysfs_has_descriptors) { + return sysfs_get_device_descriptor(dev, buffer); + } else { + *host_endian = 1; + return usbfs_get_device_descriptor(dev, buffer); + } +} + +static int usbfs_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buffer, size_t len) +{ + struct linux_device_priv *priv = _device_priv(dev); + if (!priv->config_descriptor) + return LIBUSB_ERROR_NOT_FOUND; /* device is unconfigured */ + + /* retrieve cached copy */ + memcpy(buffer, priv->config_descriptor, len); + return 0; +} + +/* read the bConfigurationValue for a device */ +static int sysfs_get_active_config(struct libusb_device *dev, int *config) +{ + char *endptr; + char tmp[4] = {0, 0, 0, 0}; + long num; + int fd; + ssize_t r; + + fd = _open_sysfs_attr(dev, "bConfigurationValue"); + if (fd < 0) + return fd; + + r = read(fd, tmp, sizeof(tmp)); + close(fd); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "read bConfigurationValue failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } else if (r == 0) { + usbi_dbg("device unconfigured"); + *config = -1; + return 0; + } + + if (tmp[sizeof(tmp) - 1] != 0) { + usbi_err(DEVICE_CTX(dev), "not null-terminated?"); + return LIBUSB_ERROR_IO; + } else if (tmp[0] == 0) { + usbi_err(DEVICE_CTX(dev), "no configuration value?"); + return LIBUSB_ERROR_IO; + } + + num = strtol(tmp, &endptr, 10); + if (endptr == tmp) { + usbi_err(DEVICE_CTX(dev), "error converting '%s' to integer", tmp); + return LIBUSB_ERROR_IO; + } + + *config = (int) num; + return 0; +} + +/* takes a usbfs/descriptors fd seeked to the start of a configuration, and + * seeks to the next one. */ +static int seek_to_next_config(struct libusb_context *ctx, int fd, + int host_endian) +{ + struct libusb_config_descriptor config; + unsigned char tmp[6]; + off_t off; + ssize_t r; + + /* read first 6 bytes of descriptor */ + r = read(fd, tmp, sizeof(tmp)); + if (r < 0) { + usbi_err(ctx, "read failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } else if (r < sizeof(tmp)) { + usbi_err(ctx, "short descriptor read %d/%d", r, sizeof(tmp)); + return LIBUSB_ERROR_IO; + } + + /* seek forward to end of config */ + usbi_parse_descriptor(tmp, "bbwbb", &config, host_endian); + off = lseek(fd, config.wTotalLength - sizeof(tmp), SEEK_CUR); + if (off < 0) { + usbi_err(ctx, "seek failed ret=%d errno=%d", off, errno); + return LIBUSB_ERROR_IO; + } + + return 0; +} + +static int sysfs_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buffer, size_t len) +{ + int fd; + ssize_t r; + off_t off; + int to_copy; + int config; + unsigned char tmp[6]; + + r = sysfs_get_active_config(dev, &config); + if (r < 0) + return r; + if (config == -1) + return LIBUSB_ERROR_NOT_FOUND; + + usbi_dbg("active configuration %d", config); + + /* sysfs provides access to an in-memory copy of the device descriptor, + * so we use that rather than keeping our own copy */ + + fd = _open_sysfs_attr(dev, "descriptors"); + if (fd < 0) + return fd; + + /* device might have been unconfigured since we read bConfigurationValue, + * so first check that there is any config descriptor data at all... */ + off = lseek(fd, 0, SEEK_END); + if (off < 1) { + usbi_err(DEVICE_CTX(dev), "end seek failed, ret=%d errno=%d", + off, errno); + close(fd); + return LIBUSB_ERROR_IO; + } else if (off == DEVICE_DESC_LENGTH) { + close(fd); + return LIBUSB_ERROR_NOT_FOUND; + } + + off = lseek(fd, DEVICE_DESC_LENGTH, SEEK_SET); + if (off < 0) { + usbi_err(DEVICE_CTX(dev), "seek failed, ret=%d errno=%d", off, errno); + close(fd); + return LIBUSB_ERROR_IO; + } + + /* unbounded loop: we expect the descriptor to be present under all + * circumstances */ + while (1) { + r = read(fd, tmp, sizeof(tmp)); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d", + fd, errno); + return LIBUSB_ERROR_IO; + } else if (r < sizeof(tmp)) { + usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, sizeof(tmp)); + return LIBUSB_ERROR_IO; + } + + /* check bConfigurationValue */ + if (tmp[5] == config) + break; + + /* try the next descriptor */ + off = lseek(fd, 0 - sizeof(tmp), SEEK_CUR); + if (off < 0) + return LIBUSB_ERROR_IO; + + r = seek_to_next_config(DEVICE_CTX(dev), fd, 0); + if (r < 0) + return r; + } + + to_copy = (len < sizeof(tmp)) ? len : sizeof(tmp); + memcpy(buffer, tmp, to_copy); + if (len > sizeof(tmp)) { + r = read(fd, buffer + sizeof(tmp), len - sizeof(tmp)); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), "read failed, ret=%d errno=%d", + fd, errno); + r = LIBUSB_ERROR_IO; + } else if (r == 0) { + usbi_dbg("device is unconfigured"); + r = LIBUSB_ERROR_NOT_FOUND; + } else if (r < len - sizeof(tmp)) { + usbi_err(DEVICE_CTX(dev), "short read %d/%d", r, len); + r = LIBUSB_ERROR_IO; + } + } else { + r = 0; + } + + close(fd); + return r; +} + +static int op_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buffer, size_t len, int *host_endian) +{ + if (sysfs_has_descriptors) { + return sysfs_get_active_config_descriptor(dev, buffer, len); + } else { + return usbfs_get_active_config_descriptor(dev, buffer, len); + } +} + +/* takes a usbfs fd, attempts to find the requested config and copy a certain + * amount of it into an output buffer. */ +static int get_config_descriptor(struct libusb_context *ctx, int fd, + uint8_t config_index, unsigned char *buffer, size_t len) +{ + off_t off; + ssize_t r; + + off = lseek(fd, DEVICE_DESC_LENGTH, SEEK_SET); + if (off < 0) { + usbi_err(ctx, "seek failed ret=%d errno=%d", off, errno); + return LIBUSB_ERROR_IO; + } + + /* might need to skip some configuration descriptors to reach the + * requested configuration */ + while (config_index > 0) { + r = seek_to_next_config(ctx, fd, 1); + if (r < 0) + return r; + config_index--; + } + + /* read the rest of the descriptor */ + r = read(fd, buffer, len); + if (r < 0) { + usbi_err(ctx, "read failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } else if (r < len) { + usbi_err(ctx, "short output read %d/%d", r, len); + return LIBUSB_ERROR_IO; + } + + return 0; +} + +static int op_get_config_descriptor(struct libusb_device *dev, + uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + char filename[PATH_MAX]; + int fd; + int r; + + /* always read from usbfs: sysfs only has the active descriptor + * this will involve waking the device up, but oh well! */ + + /* FIXME: the above is no longer true, new kernels have all descriptors + * in the descriptors file. but its kinda hard to detect if the kernel + * is sufficiently new. */ + + _get_usbfs_path(dev, filename); + fd = open(filename, O_RDONLY); + if (fd < 0) { + usbi_err(DEVICE_CTX(dev), + "open '%s' failed, ret=%d errno=%d", filename, fd, errno); + return LIBUSB_ERROR_IO; + } + + r = get_config_descriptor(DEVICE_CTX(dev), fd, config_index, buffer, len); + close(fd); + return r; +} + +/* cache the active config descriptor in memory. a value of -1 means that + * we aren't sure which one is active, so just assume the first one. + * only for usbfs. */ +static int cache_active_config(struct libusb_device *dev, int fd, + int active_config) +{ + struct linux_device_priv *priv = _device_priv(dev); + struct libusb_config_descriptor config; + unsigned char tmp[8]; + unsigned char *buf; + int idx; + int r; + + if (active_config == -1) { + idx = 0; + } else { + r = usbi_get_config_index_by_value(dev, active_config, &idx); + if (r < 0) + return r; + if (idx == -1) + return LIBUSB_ERROR_NOT_FOUND; + } + + r = get_config_descriptor(DEVICE_CTX(dev), fd, idx, tmp, sizeof(tmp)); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), "first read error %d", r); + return r; + } + + usbi_parse_descriptor(tmp, "bbw", &config, 0); + buf = malloc(config.wTotalLength); + if (!buf) + return LIBUSB_ERROR_NO_MEM; + + r = get_config_descriptor(DEVICE_CTX(dev), fd, idx, buf, + config.wTotalLength); + if (r < 0) { + free(buf); + return r; + } + + if (priv->config_descriptor) + free(priv->config_descriptor); + priv->config_descriptor = buf; + return 0; +} + +/* send a control message to retrieve active configuration */ +static int usbfs_get_active_config(struct libusb_device *dev, int fd) +{ + unsigned char active_config = 0; + int r; + + struct usbfs_ctrltransfer ctrl = { + .bmRequestType = LIBUSB_ENDPOINT_IN, + .bRequest = LIBUSB_REQUEST_GET_CONFIGURATION, + .wValue = 0, + .wIndex = 0, + .wLength = 1, + .timeout = 1000, + .data = &active_config + }; + + r = ioctl(fd, IOCTL_USBFS_CONTROL, &ctrl); + if (r < 0) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + /* we hit this error path frequently with buggy devices :( */ + usbi_warn(DEVICE_CTX(dev), + "get_configuration failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } + + return active_config; +} + +static int initialize_device(struct libusb_device *dev, uint8_t busnum, + uint8_t devaddr, const char *sysfs_dir) +{ + struct linux_device_priv *priv = _device_priv(dev); + unsigned char *dev_buf; + char path[PATH_MAX]; + int fd, speed; + int active_config = 0; + int device_configured = 1; + ssize_t r; + + dev->bus_number = busnum; + dev->device_address = devaddr; + + if (sysfs_dir) { + priv->sysfs_dir = malloc(strlen(sysfs_dir) + 1); + if (!priv->sysfs_dir) + return LIBUSB_ERROR_NO_MEM; + strcpy(priv->sysfs_dir, sysfs_dir); + + /* Note speed can contain 1.5, in this case __read_sysfs_attr + will stop parsing at the '.' and return 1 */ + speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed"); + if (speed >= 0) { + switch (speed) { + case 1: dev->speed = LIBUSB_SPEED_LOW; break; + case 12: dev->speed = LIBUSB_SPEED_FULL; break; + case 480: dev->speed = LIBUSB_SPEED_HIGH; break; + case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(DEVICE_CTX(dev), "Unknown device speed: %d Mbps", speed); + } + } + } + + if (sysfs_has_descriptors) + return 0; + + /* cache device descriptor in memory so that we can retrieve it later + * without waking the device up (op_get_device_descriptor) */ + + priv->dev_descriptor = NULL; + priv->config_descriptor = NULL; + + if (sysfs_can_relate_devices) { + int tmp = sysfs_get_active_config(dev, &active_config); + if (tmp < 0) + return tmp; + if (active_config == -1) + device_configured = 0; + } + + _get_usbfs_path(dev, path); + fd = open(path, O_RDWR); + if (fd < 0 && errno == EACCES) { + fd = open(path, O_RDONLY); + /* if we only have read-only access to the device, we cannot + * send a control message to determine the active config. just + * assume the first one is active. */ + active_config = -1; + } + + if (fd < 0) { + usbi_err(DEVICE_CTX(dev), "open failed, ret=%d errno=%d", fd, errno); + return LIBUSB_ERROR_IO; + } + + if (!sysfs_can_relate_devices) { + if (active_config == -1) { + /* if we only have read-only access to the device, we cannot + * send a control message to determine the active config. just + * assume the first one is active. */ + usbi_warn(DEVICE_CTX(dev), "access to %s is read-only; cannot " + "determine active configuration descriptor", path); + } else { + active_config = usbfs_get_active_config(dev, fd); + if (active_config == LIBUSB_ERROR_IO) { + /* buggy devices sometimes fail to report their active config. + * assume unconfigured and continue the probing */ + usbi_warn(DEVICE_CTX(dev), "couldn't query active " + "configuration, assumung unconfigured"); + device_configured = 0; + } else if (active_config < 0) { + close(fd); + return active_config; + } else if (active_config == 0) { + /* some buggy devices have a configuration 0, but we're + * reaching into the corner of a corner case here, so let's + * not support buggy devices in these circumstances. + * stick to the specs: a configuration value of 0 means + * unconfigured. */ + usbi_dbg("active cfg 0? assuming unconfigured device"); + device_configured = 0; + } + } + } + + dev_buf = malloc(DEVICE_DESC_LENGTH); + if (!dev_buf) { + close(fd); + return LIBUSB_ERROR_NO_MEM; + } + + r = read(fd, dev_buf, DEVICE_DESC_LENGTH); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "read descriptor failed ret=%d errno=%d", fd, errno); + free(dev_buf); + close(fd); + return LIBUSB_ERROR_IO; + } else if (r < DEVICE_DESC_LENGTH) { + usbi_err(DEVICE_CTX(dev), "short descriptor read (%d)", r); + free(dev_buf); + close(fd); + return LIBUSB_ERROR_IO; + } + + /* bit of a hack: set num_configurations now because cache_active_config() + * calls usbi_get_config_index_by_value() which uses it */ + dev->num_configurations = dev_buf[DEVICE_DESC_LENGTH - 1]; + + if (device_configured) { + r = cache_active_config(dev, fd, active_config); + if (r < 0) { + close(fd); + free(dev_buf); + return r; + } + } + + close(fd); + priv->dev_descriptor = dev_buf; + return 0; +} + +static int enumerate_device(struct libusb_context *ctx, + struct discovered_devs **_discdevs, uint8_t busnum, uint8_t devaddr, + const char *sysfs_dir) +{ + struct discovered_devs *discdevs; + unsigned long session_id; + int need_unref = 0; + struct libusb_device *dev; + int r = 0; + + /* FIXME: session ID is not guaranteed unique as addresses can wrap and + * will be reused. instead we should add a simple sysfs attribute with + * a session ID. */ + session_id = busnum << 8 | devaddr; + usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr, + session_id); + + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev) { + usbi_dbg("using existing device for %d/%d (session %ld)", + busnum, devaddr, session_id); + } else { + usbi_dbg("allocating new device for %d/%d (session %ld)", + busnum, devaddr, session_id); + dev = usbi_alloc_device(ctx, session_id); + if (!dev) + return LIBUSB_ERROR_NO_MEM; + need_unref = 1; + r = initialize_device(dev, busnum, devaddr, sysfs_dir); + if (r < 0) + goto out; + r = usbi_sanitize_device(dev); + if (r < 0) + goto out; + } + + discdevs = discovered_devs_append(*_discdevs, dev); + if (!discdevs) + r = LIBUSB_ERROR_NO_MEM; + else + *_discdevs = discdevs; + +out: + if (need_unref) + libusb_unref_device(dev); + return r; +} + +/* open a bus directory and adds all discovered devices to discdevs. on + * failure (non-zero return) the pre-existing discdevs should be destroyed + * (and devices freed). on success, the new discdevs pointer should be used + * as it may have been moved. */ +static int usbfs_scan_busdir(struct libusb_context *ctx, + struct discovered_devs **_discdevs, uint8_t busnum) +{ + DIR *dir; + char dirpath[PATH_MAX]; + struct dirent *entry; + struct discovered_devs *discdevs = *_discdevs; + int r = LIBUSB_ERROR_IO; + + snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum); + usbi_dbg("%s", dirpath); + dir = opendir(dirpath); + if (!dir) { + usbi_err(ctx, "opendir '%s' failed, errno=%d", dirpath, errno); + /* FIXME: should handle valid race conditions like hub unplugged + * during directory iteration - this is not an error */ + return r; + } + + while ((entry = readdir(dir))) { + int devaddr; + + if (entry->d_name[0] == '.') + continue; + + devaddr = atoi(entry->d_name); + if (devaddr == 0) { + usbi_dbg("unknown dir entry %s", entry->d_name); + continue; + } + + if (enumerate_device(ctx, &discdevs, busnum, (uint8_t) devaddr, NULL)) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + + r = 0; + } + + if (!r) + *_discdevs = discdevs; + closedir(dir); + return r; +} + +static int usbfs_get_device_list(struct libusb_context *ctx, + struct discovered_devs **_discdevs) +{ + struct dirent *entry; + DIR *buses = opendir(usbfs_path); + struct discovered_devs *discdevs = *_discdevs; + int r = 0; + + if (!buses) { + usbi_err(ctx, "opendir buses failed errno=%d", errno); + return LIBUSB_ERROR_IO; + } + + while ((entry = readdir(buses))) { + struct discovered_devs *discdevs_new = discdevs; + int busnum; + + if (entry->d_name[0] == '.') + continue; + + if (usbdev_names) { + int devaddr; + if (!_is_usbdev_entry(entry, &busnum, &devaddr)) + continue; + + r = enumerate_device(ctx, &discdevs_new, busnum, + (uint8_t) devaddr, NULL); + if (r < 0) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + } else { + busnum = atoi(entry->d_name); + if (busnum == 0) { + usbi_dbg("unknown dir entry %s", entry->d_name); + continue; + } + + r = usbfs_scan_busdir(ctx, &discdevs_new, busnum); + if (r < 0) + goto out; + } + discdevs = discdevs_new; + } + +out: + closedir(buses); + *_discdevs = discdevs; + return r; + +} + +static int sysfs_scan_device(struct libusb_context *ctx, + struct discovered_devs **_discdevs, const char *devname) +{ + int busnum; + int devaddr; + + usbi_dbg("scan %s", devname); + + busnum = __read_sysfs_attr(ctx, devname, "busnum"); + if (busnum < 0) + return busnum; + + devaddr = __read_sysfs_attr(ctx, devname, "devnum"); + if (devaddr < 0) + return devaddr; + + usbi_dbg("bus=%d dev=%d", busnum, devaddr); + if (busnum > 255 || devaddr > 255) + return LIBUSB_ERROR_INVALID_PARAM; + + return enumerate_device(ctx, _discdevs, busnum & 0xff, devaddr & 0xff, + devname); +} + +static int sysfs_get_device_list(struct libusb_context *ctx, + struct discovered_devs **_discdevs) +{ + struct discovered_devs *discdevs = *_discdevs; + DIR *devices = opendir(SYSFS_DEVICE_PATH); + struct dirent *entry; + int r = LIBUSB_ERROR_IO; + + if (!devices) { + usbi_err(ctx, "opendir devices failed errno=%d", errno); + return r; + } + + while ((entry = readdir(devices))) { + struct discovered_devs *discdevs_new = discdevs; + + if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb", 3)) + || strchr(entry->d_name, ':')) + continue; + + if (sysfs_scan_device(ctx, &discdevs_new, entry->d_name)) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + + r = 0; + discdevs = discdevs_new; + } + + if (!r) + *_discdevs = discdevs; + closedir(devices); + return r; +} + +static int op_get_device_list(struct libusb_context *ctx, + struct discovered_devs **_discdevs) +{ + /* we can retrieve device list and descriptors from sysfs or usbfs. + * sysfs is preferable, because if we use usbfs we end up resuming + * any autosuspended USB devices. however, sysfs is not available + * everywhere, so we need a usbfs fallback too. + * + * as described in the "sysfs vs usbfs" comment at the top of this + * file, sometimes we have sysfs but not enough information to + * relate sysfs devices to usbfs nodes. op_init() determines the + * adequacy of sysfs and sets sysfs_can_relate_devices. + */ + if (sysfs_can_relate_devices != 0) + return sysfs_get_device_list(ctx, _discdevs); + else + return usbfs_get_device_list(ctx, _discdevs); +} + +static int op_open(struct libusb_device_handle *handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + char filename[PATH_MAX]; + + _get_usbfs_path(handle->dev, filename); + usbi_dbg("opening %s", filename); + hpriv->fd = open(filename, O_RDWR); + if (hpriv->fd < 0) { + if (errno == EACCES) { + usbi_err(HANDLE_CTX(handle), "libusb couldn't open USB device %s: " + "Permission denied.", filename); + usbi_err(HANDLE_CTX(handle), + "libusb requires write access to USB device nodes."); + return LIBUSB_ERROR_ACCESS; + } else if (errno == ENOENT) { + usbi_err(HANDLE_CTX(handle), "libusb couldn't open USB device %s: " + "No such file or directory.", filename); + return LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_err(HANDLE_CTX(handle), + "open failed, code %d errno %d", hpriv->fd, errno); + return LIBUSB_ERROR_IO; + } + } + + return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT); +} + +static void op_close(struct libusb_device_handle *dev_handle) +{ + int fd = _device_handle_priv(dev_handle)->fd; + usbi_remove_pollfd(HANDLE_CTX(dev_handle), fd); + close(fd); +} + +static int op_get_configuration(struct libusb_device_handle *handle, + int *config) +{ + int r; + if (sysfs_can_relate_devices != 1) + return LIBUSB_ERROR_NOT_SUPPORTED; + + r = sysfs_get_active_config(handle->dev, config); + if (r < 0) + return r; + + if (*config == -1) { + usbi_err(HANDLE_CTX(handle), "device unconfigured"); + *config = 0; + } + + return 0; +} + +static int op_set_configuration(struct libusb_device_handle *handle, int config) +{ + struct linux_device_priv *priv = _device_priv(handle->dev); + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config); + if (r) { + if (errno == EINVAL) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + if (!sysfs_has_descriptors) { + /* update our cached active config descriptor */ + if (config == -1) { + if (priv->config_descriptor) { + free(priv->config_descriptor); + priv->config_descriptor = NULL; + } + } else { + r = cache_active_config(handle->dev, fd, config); + if (r < 0) + usbi_warn(HANDLE_CTX(handle), + "failed to update cached config descriptor, error %d", r); + } + } + + return 0; +} + +static int op_claim_interface(struct libusb_device_handle *handle, int iface) +{ + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface); + if (r) { + if (errno == ENOENT) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "claim interface failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return 0; +} + +static int op_release_interface(struct libusb_device_handle *handle, int iface) +{ + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface); + if (r) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "release interface failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return 0; +} + +static int op_set_interface(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_setinterface setintf; + int r; + + setintf.interface = iface; + setintf.altsetting = altsetting; + r = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf); + if (r) { + if (errno == EINVAL) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "setintf failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_clear_halt(struct libusb_device_handle *handle, + unsigned char endpoint) +{ + int fd = _device_handle_priv(handle)->fd; + unsigned int _endpoint = endpoint; + int r = ioctl(fd, IOCTL_USBFS_CLEAR_HALT, &_endpoint); + if (r) { + if (errno == ENOENT) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "clear_halt failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_reset_device(struct libusb_device_handle *handle) +{ + int fd = _device_handle_priv(handle)->fd; + int i, r, ret = 0; + + /* Doing a device reset will cause the usbfs driver to get unbound + from any interfaces it is bound to. By voluntarily unbinding + the usbfs driver ourself, we stop the kernel from rebinding + the interface after reset (which would end up with the interface + getting bound to the in kernel driver if any). */ + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (handle->claimed_interfaces & (1L << i)) { + op_release_interface(handle, i); + } + } + + usbi_mutex_lock(&handle->lock); + r = ioctl(fd, IOCTL_USBFS_RESET, NULL); + if (r) { + if (errno == ENODEV) { + ret = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + usbi_err(HANDLE_CTX(handle), + "reset failed error %d errno %d", r, errno); + ret = LIBUSB_ERROR_OTHER; + goto out; + } + + /* And re-claim any interfaces which were claimed before the reset */ + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (handle->claimed_interfaces & (1L << i)) { + r = op_claim_interface(handle, i); + if (r) { + usbi_warn(HANDLE_CTX(handle), + "failed to re-claim interface %d after reset", i); + handle->claimed_interfaces &= ~(1L << i); + } + } + } +out: + usbi_mutex_unlock(&handle->lock); + return ret; +} + +static int op_kernel_driver_active(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_getdriver getdrv; + int r; + + getdrv.interface = interface; + r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); + if (r) { + if (errno == ENODATA) + return 0; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "get driver failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 1; +} + +static int op_detach_kernel_driver(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_ioctl command; + int r; + + command.ifno = interface; + command.ioctl_code = IOCTL_USBFS_DISCONNECT; + command.data = NULL; + + r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); + if (r) { + if (errno == ENODATA) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "detach failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_attach_kernel_driver(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_ioctl command; + int r; + + command.ifno = interface; + command.ioctl_code = IOCTL_USBFS_CONNECT; + command.data = NULL; + + r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); + if (r < 0) { + if (errno == ENODATA) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + + usbi_err(HANDLE_CTX(handle), + "attach failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } else if (r == 0) { + return LIBUSB_ERROR_NOT_FOUND; + } + + return 0; +} + +static void op_destroy_device(struct libusb_device *dev) +{ + struct linux_device_priv *priv = _device_priv(dev); + if (!sysfs_has_descriptors) { + if (priv->dev_descriptor) + free(priv->dev_descriptor); + if (priv->config_descriptor) + free(priv->config_descriptor); + } + if (priv->sysfs_dir) + free(priv->sysfs_dir); +} + +/* URBs are discarded in reverse order of submission to avoid races. */ +static int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plus_one) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = + usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + int i, ret = 0; + struct usbfs_urb *urb; + + for (i = last_plus_one - 1; i >= first; i--) { + if (LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type) + urb = tpriv->iso_urbs[i]; + else + urb = &tpriv->urbs[i]; + + if (0 == ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urb)) + continue; + + if (EINVAL == errno) { + usbi_dbg("URB not found --> assuming ready to be reaped"); + if (i == (last_plus_one - 1)) + ret = LIBUSB_ERROR_NOT_FOUND; + } else if (ENODEV == errno) { + usbi_dbg("Device not found for URB --> assuming ready to be reaped"); + ret = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised discard errno %d", errno); + ret = LIBUSB_ERROR_OTHER; + } + } + return ret; +} + +static void free_iso_urbs(struct linux_transfer_priv *tpriv) +{ + int i; + for (i = 0; i < tpriv->num_urbs; i++) { + struct usbfs_urb *urb = tpriv->iso_urbs[i]; + if (!urb) + break; + free(urb); + } + + free(tpriv->iso_urbs); + tpriv->iso_urbs = NULL; +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer, + unsigned char urb_type) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb *urbs; + int is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) + == LIBUSB_ENDPOINT_OUT; + int r; + int i; + size_t alloc_size; + + if (tpriv->urbs) + return LIBUSB_ERROR_BUSY; + + if (is_out && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET && + !supports_flag_zero_packet) + return LIBUSB_ERROR_NOT_SUPPORTED; + + /* usbfs places a 16kb limit on bulk URBs. we divide up larger requests + * into smaller units to meet such restriction, then fire off all the + * units at once. it would be simpler if we just fired one unit at a time, + * but there is a big performance gain through doing it this way. */ + int num_urbs = transfer->length / MAX_BULK_BUFFER_LENGTH; + int last_urb_partial = 0; + + if (transfer->length == 0) { + num_urbs = 1; + } else if ((transfer->length % MAX_BULK_BUFFER_LENGTH) > 0) { + last_urb_partial = 1; + num_urbs++; + } + usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, + transfer->length); + alloc_size = num_urbs * sizeof(struct usbfs_urb); + urbs = malloc(alloc_size); + if (!urbs) + return LIBUSB_ERROR_NO_MEM; + memset(urbs, 0, alloc_size); + tpriv->urbs = urbs; + tpriv->num_urbs = num_urbs; + tpriv->num_retired = 0; + tpriv->reap_action = NORMAL; + tpriv->reap_status = LIBUSB_TRANSFER_COMPLETED; + + for (i = 0; i < num_urbs; i++) { + struct usbfs_urb *urb = &urbs[i]; + urb->usercontext = itransfer; + urb->type = urb_type; + urb->endpoint = transfer->endpoint; + urb->buffer = transfer->buffer + (i * MAX_BULK_BUFFER_LENGTH); + if (supports_flag_bulk_continuation && !is_out) + urb->flags = USBFS_URB_SHORT_NOT_OK; + if (i == num_urbs - 1 && last_urb_partial) + urb->buffer_length = transfer->length % MAX_BULK_BUFFER_LENGTH; + else if (transfer->length == 0) + urb->buffer_length = 0; + else + urb->buffer_length = MAX_BULK_BUFFER_LENGTH; + + if (i > 0 && supports_flag_bulk_continuation) + urb->flags |= USBFS_URB_BULK_CONTINUATION; + + /* we have already checked that the flag is supported */ + if (is_out && i == num_urbs - 1 && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) + urb->flags |= USBFS_URB_ZERO_PACKET; + + r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); + if (r < 0) { + if (errno == ENODEV) { + r = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + r = LIBUSB_ERROR_IO; + } + + /* if the first URB submission fails, we can simply free up and + * return failure immediately. */ + if (i == 0) { + usbi_dbg("first URB failed, easy peasy"); + free(urbs); + tpriv->urbs = NULL; + return r; + } + + /* if it's not the first URB that failed, the situation is a bit + * tricky. we may need to discard all previous URBs. there are + * complications: + * - discarding is asynchronous - discarded urbs will be reaped + * later. the user must not have freed the transfer when the + * discarded URBs are reaped, otherwise libusb will be using + * freed memory. + * - the earlier URBs may have completed successfully and we do + * not want to throw away any data. + * - this URB failing may be no error; EREMOTEIO means that + * this transfer simply didn't need all the URBs we submitted + * so, we report that the transfer was submitted successfully and + * in case of error we discard all previous URBs. later when + * the final reap completes we can report error to the user, + * or success if an earlier URB was completed successfully. + */ + tpriv->reap_action = EREMOTEIO == errno ? COMPLETED_EARLY : SUBMIT_FAILED; + + /* The URBs we haven't submitted yet we count as already + * retired. */ + tpriv->num_retired += num_urbs - i; + + /* If we completed short then don't try to discard. */ + if (COMPLETED_EARLY == tpriv->reap_action) + return 0; + + discard_urbs(itransfer, 0, i); + + usbi_dbg("reporting successful submission but waiting for %d " + "discards before reporting error", i); + return 0; + } + } + + return 0; +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb **urbs; + size_t alloc_size; + int num_packets = transfer->num_iso_packets; + int i; + int this_urb_len = 0; + int num_urbs = 1; + int packet_offset = 0; + unsigned int packet_len; + unsigned char *urb_buffer = transfer->buffer; + + if (tpriv->iso_urbs) + return LIBUSB_ERROR_BUSY; + + /* usbfs places a 32kb limit on iso URBs. we divide up larger requests + * into smaller units to meet such restriction, then fire off all the + * units at once. it would be simpler if we just fired one unit at a time, + * but there is a big performance gain through doing it this way. */ + + /* calculate how many URBs we need */ + for (i = 0; i < num_packets; i++) { + int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len; + packet_len = transfer->iso_packet_desc[i].length; + + if (packet_len > space_remaining) { + num_urbs++; + this_urb_len = packet_len; + } else { + this_urb_len += packet_len; + } + } + usbi_dbg("need %d 32k URBs for transfer", num_urbs); + + alloc_size = num_urbs * sizeof(*urbs); + urbs = malloc(alloc_size); + if (!urbs) + return LIBUSB_ERROR_NO_MEM; + memset(urbs, 0, alloc_size); + + tpriv->iso_urbs = urbs; + tpriv->num_urbs = num_urbs; + tpriv->num_retired = 0; + tpriv->reap_action = NORMAL; + tpriv->iso_packet_offset = 0; + + /* allocate + initialize each URB with the correct number of packets */ + for (i = 0; i < num_urbs; i++) { + struct usbfs_urb *urb; + int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; + int urb_packet_offset = 0; + unsigned char *urb_buffer_orig = urb_buffer; + int j; + int k; + + /* swallow up all the packets we can fit into this URB */ + while (packet_offset < transfer->num_iso_packets) { + packet_len = transfer->iso_packet_desc[packet_offset].length; + if (packet_len <= space_remaining_in_urb) { + /* throw it in */ + urb_packet_offset++; + packet_offset++; + space_remaining_in_urb -= packet_len; + urb_buffer += packet_len; + } else { + /* it can't fit, save it for the next URB */ + break; + } + } + + alloc_size = sizeof(*urb) + + (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc)); + urb = malloc(alloc_size); + if (!urb) { + free_iso_urbs(tpriv); + return LIBUSB_ERROR_NO_MEM; + } + memset(urb, 0, alloc_size); + urbs[i] = urb; + + /* populate packet lengths */ + for (j = 0, k = packet_offset - urb_packet_offset; + k < packet_offset; k++, j++) { + packet_len = transfer->iso_packet_desc[k].length; + urb->iso_frame_desc[j].length = packet_len; + } + + urb->usercontext = itransfer; + urb->type = USBFS_URB_TYPE_ISO; + /* FIXME: interface for non-ASAP data? */ + urb->flags = USBFS_URB_ISO_ASAP; + urb->endpoint = transfer->endpoint; + urb->number_of_packets = urb_packet_offset; + urb->buffer = urb_buffer_orig; + } + + /* submit URBs */ + for (i = 0; i < num_urbs; i++) { + int r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urbs[i]); + if (r < 0) { + if (errno == ENODEV) { + r = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + r = LIBUSB_ERROR_IO; + } + + /* if the first URB submission fails, we can simply free up and + * return failure immediately. */ + if (i == 0) { + usbi_dbg("first URB failed, easy peasy"); + free_iso_urbs(tpriv); + return r; + } + + /* if it's not the first URB that failed, the situation is a bit + * tricky. we must discard all previous URBs. there are + * complications: + * - discarding is asynchronous - discarded urbs will be reaped + * later. the user must not have freed the transfer when the + * discarded URBs are reaped, otherwise libusb will be using + * freed memory. + * - the earlier URBs may have completed successfully and we do + * not want to throw away any data. + * so, in this case we discard all the previous URBs BUT we report + * that the transfer was submitted successfully. then later when + * the final discard completes we can report error to the user. + */ + tpriv->reap_action = SUBMIT_FAILED; + + /* The URBs we haven't submitted yet we count as already + * retired. */ + tpriv->num_retired = num_urbs - i; + discard_urbs(itransfer, 0, i); + + usbi_dbg("reporting successful submission but waiting for %d " + "discards before reporting error", i); + return 0; + } + } + + return 0; +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb *urb; + int r; + + if (tpriv->urbs) + return LIBUSB_ERROR_BUSY; + + if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + urb = malloc(sizeof(struct usbfs_urb)); + if (!urb) + return LIBUSB_ERROR_NO_MEM; + memset(urb, 0, sizeof(struct usbfs_urb)); + tpriv->urbs = urb; + tpriv->num_urbs = 1; + tpriv->reap_action = NORMAL; + + urb->usercontext = itransfer; + urb->type = USBFS_URB_TYPE_CONTROL; + urb->endpoint = transfer->endpoint; + urb->buffer = transfer->buffer; + urb->buffer_length = transfer->length; + + r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); + if (r < 0) { + free(urb); + tpriv->urbs = NULL; + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } + return 0; +} + +static int op_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + return submit_bulk_transfer(itransfer, USBFS_URB_TYPE_BULK); + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return submit_bulk_transfer(itransfer, USBFS_URB_TYPE_INTERRUPT); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int op_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_BULK: + if (tpriv->reap_action == ERROR) + break; + /* else, fall through */ + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + tpriv->reap_action = CANCELLED; + break; + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + if (!tpriv->urbs) + return LIBUSB_ERROR_NOT_FOUND; + + return discard_urbs(itransfer, 0, tpriv->num_urbs); +} + +static void op_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + /* urbs can be freed also in submit_transfer so lock mutex first */ + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + usbi_mutex_lock(&itransfer->lock); + if (tpriv->urbs) + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + usbi_mutex_lock(&itransfer->lock); + if (tpriv->iso_urbs) + free_iso_urbs(tpriv); + usbi_mutex_unlock(&itransfer->lock); + break; + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + } +} + +static int handle_bulk_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int urb_idx = urb - tpriv->urbs; + + usbi_mutex_lock(&itransfer->lock); + usbi_dbg("handling completion status %d of bulk urb %d/%d", urb->status, + urb_idx + 1, tpriv->num_urbs); + + tpriv->num_retired++; + + if (tpriv->reap_action != NORMAL) { + /* cancelled, submit_fail, or completed early */ + usbi_dbg("abnormal reap: urb status %d", urb->status); + + /* even though we're in the process of cancelling, it's possible that + * we may receive some data in these URBs that we don't want to lose. + * examples: + * 1. while the kernel is cancelling all the packets that make up an + * URB, a few of them might complete. so we get back a successful + * cancellation *and* some data. + * 2. we receive a short URB which marks the early completion condition, + * so we start cancelling the remaining URBs. however, we're too + * slow and another URB completes (or at least completes partially). + * (this can't happen since we always use BULK_CONTINUATION.) + * + * When this happens, our objectives are not to lose any "surplus" data, + * and also to stick it at the end of the previously-received data + * (closing any holes), so that libusb reports the total amount of + * transferred data and presents it in a contiguous chunk. + */ + if (urb->actual_length > 0) { + unsigned char *target = transfer->buffer + itransfer->transferred; + usbi_dbg("received %d bytes of surplus data", urb->actual_length); + if (urb->buffer != target) { + usbi_dbg("moving surplus data from offset %d to offset %d", + (unsigned char *) urb->buffer - transfer->buffer, + target - transfer->buffer); + memmove(target, urb->buffer, urb->actual_length); + } + itransfer->transferred += urb->actual_length; + } + + if (tpriv->num_retired == tpriv->num_urbs) { + usbi_dbg("abnormal reap: last URB handled, reporting"); + if (tpriv->reap_action != COMPLETED_EARLY && + tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_ERROR; + goto completed; + } + goto out_unlock; + } + + itransfer->transferred += urb->actual_length; + + /* Many of these errors can occur on *any* urb of a multi-urb + * transfer. When they do, we tear down the rest of the transfer. + */ + switch (urb->status) { + case 0: + break; + case -EREMOTEIO: /* short transfer */ + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + tpriv->reap_status = LIBUSB_TRANSFER_NO_DEVICE; + goto cancel_remaining; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_STALL; + goto cancel_remaining; + case -EOVERFLOW: + /* overflow can only ever occur in the last urb */ + usbi_dbg("overflow, actual_length=%d", urb->actual_length); + if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_OVERFLOW; + goto completed; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + usbi_dbg("low level error %d", urb->status); + tpriv->reap_action = ERROR; + goto cancel_remaining; + default: + usbi_warn(ITRANSFER_CTX(itransfer), + "unrecognised urb status %d", urb->status); + tpriv->reap_action = ERROR; + goto cancel_remaining; + } + + /* if we're the last urb or we got less data than requested then we're + * done */ + if (urb_idx == tpriv->num_urbs - 1) { + usbi_dbg("last URB in transfer --> complete!"); + goto completed; + } else if (urb->actual_length < urb->buffer_length) { + usbi_dbg("short transfer %d/%d --> complete!", + urb->actual_length, urb->buffer_length); + if (tpriv->reap_action == NORMAL) + tpriv->reap_action = COMPLETED_EARLY; + } else + goto out_unlock; + +cancel_remaining: + if (ERROR == tpriv->reap_action && LIBUSB_TRANSFER_COMPLETED == tpriv->reap_status) + tpriv->reap_status = LIBUSB_TRANSFER_ERROR; + + if (tpriv->num_retired == tpriv->num_urbs) /* nothing to cancel */ + goto completed; + + /* cancel remaining urbs and wait for their completion before + * reporting results */ + discard_urbs(itransfer, urb_idx + 1, tpriv->num_urbs); + +out_unlock: + usbi_mutex_unlock(&itransfer->lock); + return 0; + +completed: + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return CANCELLED == tpriv->reap_action ? + usbi_handle_transfer_cancellation(itransfer) : + usbi_handle_transfer_completion(itransfer, tpriv->reap_status); +} + +static int handle_iso_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int num_urbs = tpriv->num_urbs; + int urb_idx = 0; + int i; + enum libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; + + usbi_mutex_lock(&itransfer->lock); + for (i = 0; i < num_urbs; i++) { + if (urb == tpriv->iso_urbs[i]) { + urb_idx = i + 1; + break; + } + } + if (urb_idx == 0) { + usbi_err(TRANSFER_CTX(transfer), "could not locate urb!"); + usbi_mutex_unlock(&itransfer->lock); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("handling completion status %d of iso urb %d/%d", urb->status, + urb_idx, num_urbs); + + /* copy isochronous results back in */ + + for (i = 0; i < urb->number_of_packets; i++) { + struct usbfs_iso_packet_desc *urb_desc = &urb->iso_frame_desc[i]; + struct libusb_iso_packet_descriptor *lib_desc = + &transfer->iso_packet_desc[tpriv->iso_packet_offset++]; + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; + switch (urb_desc->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + lib_desc->status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + lib_desc->status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("overflow error"); + lib_desc->status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + case -EXDEV: + usbi_dbg("low-level USB error %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + } + lib_desc->actual_length = urb_desc->actual_length; + } + + tpriv->num_retired++; + + if (tpriv->reap_action != NORMAL) { /* cancelled or submit_fail */ + usbi_dbg("CANCEL: urb status %d", urb->status); + + if (tpriv->num_retired == num_urbs) { + usbi_dbg("CANCEL: last URB handled, reporting"); + free_iso_urbs(tpriv); + if (tpriv->reap_action == CANCELLED) { + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_cancellation(itransfer); + } else { + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, + LIBUSB_TRANSFER_ERROR); + } + } + goto out; + } + + switch (urb->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ESHUTDOWN: + usbi_dbg("device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb->status); + status = LIBUSB_TRANSFER_ERROR; + break; + } + + /* if we're the last urb then we're done */ + if (urb_idx == num_urbs) { + usbi_dbg("last URB in transfer --> complete!"); + free_iso_urbs(tpriv); + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); + } + +out: + usbi_mutex_unlock(&itransfer->lock); + return 0; +} + +static int handle_control_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int status; + + usbi_mutex_lock(&itransfer->lock); + usbi_dbg("handling completion status %d", urb->status); + + itransfer->transferred += urb->actual_length; + + if (tpriv->reap_action == CANCELLED) { + if (urb->status != 0 && urb->status != -ENOENT) + usbi_warn(ITRANSFER_CTX(itransfer), + "cancel: unrecognised urb status %d", urb->status); + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_cancellation(itransfer); + } + + switch (urb->status) { + case 0: + status = LIBUSB_TRANSFER_COMPLETED; + break; + case -ENOENT: /* cancelled */ + status = LIBUSB_TRANSFER_CANCELLED; + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("unsupported control request"); + status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("control overflow error"); + status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + usbi_dbg("low-level bus error occurred"); + status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(ITRANSFER_CTX(itransfer), + "unrecognised urb status %d", urb->status); + status = LIBUSB_TRANSFER_ERROR; + break; + } + + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); +} + +static int reap_for_handle(struct libusb_device_handle *handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + int r; + struct usbfs_urb *urb; + struct usbi_transfer *itransfer; + struct libusb_transfer *transfer; + + r = ioctl(hpriv->fd, IOCTL_USBFS_REAPURBNDELAY, &urb); + if (r == -1 && errno == EAGAIN) + return 1; + if (r < 0) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), "reap failed error %d errno=%d", + r, errno); + return LIBUSB_ERROR_IO; + } + + itransfer = urb->usercontext; + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + usbi_dbg("urb type=%d status=%d transferred=%d", urb->type, urb->status, + urb->actual_length); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return handle_iso_completion(itransfer, urb); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return handle_bulk_completion(itransfer, urb); + case LIBUSB_TRANSFER_TYPE_CONTROL: + return handle_control_completion(itransfer, urb); + default: + usbi_err(HANDLE_CTX(handle), "unrecognised endpoint type %x", + transfer->type); + return LIBUSB_ERROR_OTHER; + } +} + +static int op_handle_events(struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + int r; + int i = 0; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + struct pollfd *pollfd = &fds[i]; + struct libusb_device_handle *handle; + struct linux_device_handle_priv *hpriv = NULL; + + if (!pollfd->revents) + continue; + + num_ready--; + list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { + hpriv = _device_handle_priv(handle); + if (hpriv->fd == pollfd->fd) + break; + } + + if (pollfd->revents & POLLERR) { + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd); + usbi_handle_disconnect(handle); + continue; + } + + r = reap_for_handle(handle); + if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE) + continue; + else if (r < 0) + goto out; + } + + r = 0; +out: + usbi_mutex_unlock(&ctx->open_devs_lock); + return r; +} + +static int op_clock_gettime(int clk_id, struct timespec *tp) +{ + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + return clock_gettime(monotonic_clkid, tp); + case USBI_CLOCK_REALTIME: + return clock_gettime(CLOCK_REALTIME, tp); + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +#ifdef USBI_TIMERFD_AVAILABLE +static clockid_t op_get_timerfd_clockid(void) +{ + return monotonic_clkid; + +} +#endif + +const struct usbi_os_backend linux_usbfs_backend = { + .name = "Linux usbfs", + .init = op_init, + .exit = NULL, + .get_device_list = op_get_device_list, + .get_device_descriptor = op_get_device_descriptor, + .get_active_config_descriptor = op_get_active_config_descriptor, + .get_config_descriptor = op_get_config_descriptor, + + .open = op_open, + .close = op_close, + .get_configuration = op_get_configuration, + .set_configuration = op_set_configuration, + .claim_interface = op_claim_interface, + .release_interface = op_release_interface, + + .set_interface_altsetting = op_set_interface, + .clear_halt = op_clear_halt, + .reset_device = op_reset_device, + + .kernel_driver_active = op_kernel_driver_active, + .detach_kernel_driver = op_detach_kernel_driver, + .attach_kernel_driver = op_attach_kernel_driver, + + .destroy_device = op_destroy_device, + + .submit_transfer = op_submit_transfer, + .cancel_transfer = op_cancel_transfer, + .clear_transfer_priv = op_clear_transfer_priv, + + .handle_events = op_handle_events, + + .clock_gettime = op_clock_gettime, + +#ifdef USBI_TIMERFD_AVAILABLE + .get_timerfd_clockid = op_get_timerfd_clockid, +#endif + + .device_priv_size = sizeof(struct linux_device_priv), + .device_handle_priv_size = sizeof(struct linux_device_handle_priv), + .transfer_priv_size = sizeof(struct linux_transfer_priv), + .add_iso_packet_size = 0, +}; + diff --git a/libusb/libusb/libusb/os/linux_usbfs.h b/libusb/libusb/libusb/os/linux_usbfs.h new file mode 100644 index 0000000..487acb5 --- /dev/null +++ b/libusb/libusb/libusb/os/linux_usbfs.h @@ -0,0 +1,139 @@ +/* + * usbfs header structures + * Copyright (C) 2007 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_USBFS_H +#define LIBUSB_USBFS_H + +#define SYSFS_DEVICE_PATH "/sys/bus/usb/devices" + +struct usbfs_ctrltransfer { + /* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */ + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + + uint32_t timeout; /* in milliseconds */ + + /* pointer to data */ + void *data; +}; + +struct usbfs_bulktransfer { + /* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */ + unsigned int ep; + unsigned int len; + unsigned int timeout; /* in milliseconds */ + + /* pointer to data */ + void *data; +}; + +struct usbfs_setinterface { + /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */ + unsigned int interface; + unsigned int altsetting; +}; + +#define USBFS_MAXDRIVERNAME 255 + +struct usbfs_getdriver { + unsigned int interface; + char driver[USBFS_MAXDRIVERNAME + 1]; +}; + +#define USBFS_URB_SHORT_NOT_OK 0x01 +#define USBFS_URB_ISO_ASAP 0x02 +#define USBFS_URB_BULK_CONTINUATION 0x04 +#define USBFS_URB_QUEUE_BULK 0x10 +#define USBFS_URB_ZERO_PACKET 0x40 + +enum usbfs_urb_type { + USBFS_URB_TYPE_ISO = 0, + USBFS_URB_TYPE_INTERRUPT = 1, + USBFS_URB_TYPE_CONTROL = 2, + USBFS_URB_TYPE_BULK = 3, +}; + +struct usbfs_iso_packet_desc { + unsigned int length; + unsigned int actual_length; + unsigned int status; +}; + +#define MAX_ISO_BUFFER_LENGTH 32768 +#define MAX_BULK_BUFFER_LENGTH 16384 +#define MAX_CTRL_BUFFER_LENGTH 4096 + +struct usbfs_urb { + unsigned char type; + unsigned char endpoint; + int status; + unsigned int flags; + void *buffer; + int buffer_length; + int actual_length; + int start_frame; + int number_of_packets; + int error_count; + unsigned int signr; + void *usercontext; + struct usbfs_iso_packet_desc iso_frame_desc[0]; +}; + +struct usbfs_connectinfo { + unsigned int devnum; + unsigned char slow; +}; + +struct usbfs_ioctl { + int ifno; /* interface 0..N ; negative numbers reserved */ + int ioctl_code; /* MUST encode size + direction of data so the + * macros in give correct values */ + void *data; /* param buffer (in, or out) */ +}; + +struct usbfs_hub_portinfo { + unsigned char numports; + unsigned char port[127]; /* port to device num mapping */ +}; + +#define IOCTL_USBFS_CONTROL _IOWR('U', 0, struct usbfs_ctrltransfer) +#define IOCTL_USBFS_BULK _IOWR('U', 2, struct usbfs_bulktransfer) +#define IOCTL_USBFS_RESETEP _IOR('U', 3, unsigned int) +#define IOCTL_USBFS_SETINTF _IOR('U', 4, struct usbfs_setinterface) +#define IOCTL_USBFS_SETCONFIG _IOR('U', 5, unsigned int) +#define IOCTL_USBFS_GETDRIVER _IOW('U', 8, struct usbfs_getdriver) +#define IOCTL_USBFS_SUBMITURB _IOR('U', 10, struct usbfs_urb) +#define IOCTL_USBFS_DISCARDURB _IO('U', 11) +#define IOCTL_USBFS_REAPURB _IOW('U', 12, void *) +#define IOCTL_USBFS_REAPURBNDELAY _IOW('U', 13, void *) +#define IOCTL_USBFS_CLAIMINTF _IOR('U', 15, unsigned int) +#define IOCTL_USBFS_RELEASEINTF _IOR('U', 16, unsigned int) +#define IOCTL_USBFS_CONNECTINFO _IOW('U', 17, struct usbfs_connectinfo) +#define IOCTL_USBFS_IOCTL _IOWR('U', 18, struct usbfs_ioctl) +#define IOCTL_USBFS_HUB_PORTINFO _IOR('U', 19, struct usbfs_hub_portinfo) +#define IOCTL_USBFS_RESET _IO('U', 20) +#define IOCTL_USBFS_CLEAR_HALT _IOR('U', 21, unsigned int) +#define IOCTL_USBFS_DISCONNECT _IO('U', 22) +#define IOCTL_USBFS_CONNECT _IO('U', 23) + +#endif diff --git a/libusb/libusb/libusb/os/openbsd_usb.c b/libusb/libusb/libusb/os/openbsd_usb.c new file mode 100644 index 0000000..e31941b --- /dev/null +++ b/libusb/libusb/libusb/os/openbsd_usb.c @@ -0,0 +1,727 @@ +/* + * Copyright (c) 2011 Martin Pieuchot + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "libusb.h" +#include "libusbi.h" + +struct device_priv { + char devnode[16]; + int fd; + + unsigned char *cdesc; /* active config descriptor */ + usb_device_descriptor_t ddesc; /* usb device descriptor */ +}; + +struct handle_priv { + int pipe[2]; /* for event notification */ + int endpoints[USB_MAX_ENDPOINTS]; +}; + +/* + * Backend functions + */ +static int obsd_get_device_list(struct libusb_context *, + struct discovered_devs **); +static int obsd_open(struct libusb_device_handle *); +static void obsd_close(struct libusb_device_handle *); + +static int obsd_get_device_descriptor(struct libusb_device *, unsigned char *, + int *); +static int obsd_get_active_config_descriptor(struct libusb_device *, + unsigned char *, size_t, int *); +static int obsd_get_config_descriptor(struct libusb_device *, uint8_t, + unsigned char *, size_t, int *); + +static int obsd_get_configuration(struct libusb_device_handle *, int *); +static int obsd_set_configuration(struct libusb_device_handle *, int); + +static int obsd_claim_interface(struct libusb_device_handle *, int); +static int obsd_release_interface(struct libusb_device_handle *, int); + +static int obsd_set_interface_altsetting(struct libusb_device_handle *, int, + int); +static int obsd_clear_halt(struct libusb_device_handle *, unsigned char); +static int obsd_reset_device(struct libusb_device_handle *); +static void obsd_destroy_device(struct libusb_device *); + +static int obsd_submit_transfer(struct usbi_transfer *); +static int obsd_cancel_transfer(struct usbi_transfer *); +static void obsd_clear_transfer_priv(struct usbi_transfer *); +static int obsd_handle_events(struct libusb_context *ctx, struct pollfd *, + nfds_t, int); +static int obsd_clock_gettime(int, struct timespec *); + +/* + * Private functions + */ +static int _errno_to_libusb(int); +static int _cache_active_config_descriptor(struct libusb_device *, int); +static int _sync_control_transfer(struct usbi_transfer *); +static int _sync_gen_transfer(struct usbi_transfer *); +static int _access_endpoint(struct libusb_transfer *); + +const struct usbi_os_backend openbsd_backend = { + "Synchronous OpenBSD backend", + NULL, /* init() */ + NULL, /* exit() */ + obsd_get_device_list, + obsd_open, + obsd_close, + + obsd_get_device_descriptor, + obsd_get_active_config_descriptor, + obsd_get_config_descriptor, + + obsd_get_configuration, + obsd_set_configuration, + + obsd_claim_interface, + obsd_release_interface, + + obsd_set_interface_altsetting, + obsd_clear_halt, + obsd_reset_device, + + NULL, /* kernel_driver_active() */ + NULL, /* detach_kernel_driver() */ + NULL, /* attach_kernel_driver() */ + + obsd_destroy_device, + + obsd_submit_transfer, + obsd_cancel_transfer, + obsd_clear_transfer_priv, + + obsd_handle_events, + + obsd_clock_gettime, + sizeof(struct device_priv), + sizeof(struct handle_priv), + 0, /* transfer_priv_size */ + 0, /* add_iso_packet_size */ +}; + +int +obsd_get_device_list(struct libusb_context * ctx, + struct discovered_devs **discdevs) +{ + struct libusb_device *dev; + struct device_priv *dpriv; + struct usb_device_info di; + unsigned long session_id; + char devnode[16]; + int fd, err, i; + + usbi_dbg(""); + + /* Only ugen(4) is supported */ + for (i = 0; i < USB_MAX_DEVICES; i++) { + /* Control endpoint is always .00 */ + snprintf(devnode, sizeof(devnode), "/dev/ugen%d.00", i); + + if ((fd = open(devnode, O_RDONLY)) < 0) { + if (errno != ENOENT && errno != ENXIO) + usbi_err(ctx, "could not open %s", devnode); + continue; + } + + if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) + continue; + + session_id = (di.udi_bus << 8 | di.udi_addr); + dev = usbi_get_device_by_session_id(ctx, session_id); + + if (dev == NULL) { + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) + return (LIBUSB_ERROR_NO_MEM); + + dev->bus_number = di.udi_bus; + dev->device_address = di.udi_addr; + dev->speed = di.udi_speed; + + dpriv = (struct device_priv *)dev->os_priv; + strlcpy(dpriv->devnode, devnode, sizeof(devnode)); + dpriv->fd = -1; + + if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { + err = errno; + goto error; + } + + dpriv->cdesc = NULL; + if (_cache_active_config_descriptor(dev, fd)) { + err = errno; + goto error; + } + + if ((err = usbi_sanitize_device(dev))) + goto error; + } + close(fd); + + if (discovered_devs_append(*discdevs, dev) == NULL) + return (LIBUSB_ERROR_NO_MEM); + } + + return (LIBUSB_SUCCESS); + +error: + close(fd); + libusb_unref_device(dev); + return _errno_to_libusb(err); +} + +int +obsd_open(struct libusb_device_handle *handle) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + dpriv->fd = open(dpriv->devnode, O_RDWR); + if (dpriv->fd < 0) { + dpriv->fd = open(dpriv->devnode, O_RDONLY); + if (dpriv->fd < 0) + return _errno_to_libusb(errno); + } + + usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd); + + if (pipe(hpriv->pipe) < 0) + return _errno_to_libusb(errno); + + return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->pipe[0], POLLIN); +} + +void +obsd_close(struct libusb_device_handle *handle) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg("close: fd %d", dpriv->fd); + + close(dpriv->fd); + dpriv->fd = -1; + + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); + + close(hpriv->pipe[0]); + close(hpriv->pipe[1]); +} + +int +obsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf, + int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg(""); + + memcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH); + + *host_endian = 0; + + return (LIBUSB_SUCCESS); +} + +int +obsd_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buf, size_t len, int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + usb_config_descriptor_t *ucd; + + ucd = (usb_config_descriptor_t *) dpriv->cdesc; + len = MIN(len, UGETW(ucd->wTotalLength)); + + usbi_dbg("len %d", len); + + memcpy(buf, dpriv->cdesc, len); + + *host_endian = 0; + + return (LIBUSB_SUCCESS); +} + +int +obsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx, + unsigned char *buf, size_t len, int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + struct usb_full_desc ufd; + int fd, err; + + usbi_dbg("index %d, len %d", idx, len); + + /* A config descriptor may be requested before opening the device */ + if (dpriv->fd >= 0) { + fd = dpriv->fd; + } else { + fd = open(dpriv->devnode, O_RDONLY); + if (fd < 0) + return _errno_to_libusb(errno); + } + + ufd.ufd_config_index = idx; + ufd.ufd_size = len; + ufd.ufd_data = buf; + + if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { + err = errno; + if (dpriv->fd < 0) + close(fd); + return _errno_to_libusb(err); + } + + if (dpriv->fd < 0) + close(fd); + + *host_endian = 0; + + return (LIBUSB_SUCCESS); +} + +int +obsd_get_configuration(struct libusb_device_handle *handle, int *config) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg(""); + + if (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0) + return _errno_to_libusb(errno); + + usbi_dbg("configuration %d", *config); + + return (LIBUSB_SUCCESS); +} + +int +obsd_set_configuration(struct libusb_device_handle *handle, int config) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg("configuration %d", config); + + if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) + return _errno_to_libusb(errno); + + return _cache_active_config_descriptor(handle->dev, dpriv->fd); +} + +int +obsd_claim_interface(struct libusb_device_handle *handle, int iface) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + int i; + + for (i = 0; i < USB_MAX_ENDPOINTS; i++) + hpriv->endpoints[i] = -1; + + return (LIBUSB_SUCCESS); +} + +int +obsd_release_interface(struct libusb_device_handle *handle, int iface) +{ + struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; + int i; + + for (i = 0; i < USB_MAX_ENDPOINTS; i++) + if (hpriv->endpoints[i] >= 0) + close(hpriv->endpoints[i]); + + return (LIBUSB_SUCCESS); +} + +int +obsd_set_interface_altsetting(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + struct usb_alt_interface intf; + + usbi_dbg("iface %d, setting %d", iface, altsetting); + + memset(&intf, 0, sizeof(intf)); + + intf.uai_interface_index = iface; + intf.uai_alt_no = altsetting; + + if (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0) + return _errno_to_libusb(errno); + + return (LIBUSB_SUCCESS); +} + +int +obsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + struct usb_ctl_request req; + + usbi_dbg(""); + + req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; + req.ucr_request.bRequest = UR_CLEAR_FEATURE; + USETW(req.ucr_request.wValue, UF_ENDPOINT_HALT); + USETW(req.ucr_request.wIndex, endpoint); + USETW(req.ucr_request.wLength, 0); + + if (ioctl(dpriv->fd, USB_DO_REQUEST, &req) < 0) + return _errno_to_libusb(errno); + + return (LIBUSB_SUCCESS); +} + +int +obsd_reset_device(struct libusb_device_handle *handle) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +obsd_destroy_device(struct libusb_device *dev) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg(""); + + free(dpriv->cdesc); +} + +int +obsd_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct handle_priv *hpriv; + int err = 0; + + usbi_dbg(""); + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + err = _sync_control_transfer(itransfer); + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + if (IS_XFEROUT(transfer)) { + /* Isochronous write is not supported */ + err = LIBUSB_ERROR_NOT_SUPPORTED; + break; + } + err = _sync_gen_transfer(itransfer); + break; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { + err = LIBUSB_ERROR_NOT_SUPPORTED; + break; + } + err = _sync_gen_transfer(itransfer); + break; + } + + if (err) + return (err); + + if (write(hpriv->pipe[1], &itransfer, sizeof(itransfer)) < 0) + return _errno_to_libusb(errno); + + return (LIBUSB_SUCCESS); +} + +int +obsd_cancel_transfer(struct usbi_transfer *itransfer) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +obsd_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + usbi_dbg(""); + + /* Nothing to do */ +} + +int +obsd_handle_events(struct libusb_context *ctx, struct pollfd *fds, nfds_t nfds, + int num_ready) +{ + struct libusb_device_handle *handle; + struct handle_priv *hpriv = NULL; + struct usbi_transfer *itransfer; + struct pollfd *pollfd; + int i, err = 0; + + usbi_dbg(""); + + pthread_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + pollfd = &fds[i]; + + if (!pollfd->revents) + continue; + + hpriv = NULL; + num_ready--; + list_for_each_entry(handle, &ctx->open_devs, list, + struct libusb_device_handle) { + hpriv = (struct handle_priv *)handle->os_priv; + + if (hpriv->pipe[0] == pollfd->fd) + break; + + hpriv = NULL; + } + + if (NULL == hpriv) { + usbi_dbg("fd %d is not an event pipe!", pollfd->fd); + err = ENOENT; + break; + } + + if (pollfd->revents & POLLERR) { + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->pipe[0]); + usbi_handle_disconnect(handle); + continue; + } + + if (read(hpriv->pipe[0], &itransfer, sizeof(itransfer)) < 0) { + err = errno; + break; + } + + if ((err = usbi_handle_transfer_completion(itransfer, + LIBUSB_TRANSFER_COMPLETED))) + break; + } + pthread_mutex_unlock(&ctx->open_devs_lock); + + if (err) + return _errno_to_libusb(err); + + return (LIBUSB_SUCCESS); +} + +int +obsd_clock_gettime(int clkid, struct timespec *tp) +{ + usbi_dbg("clock %d", clkid); + + if (clkid == USBI_CLOCK_REALTIME) + return clock_gettime(CLOCK_REALTIME, tp); + + if (clkid == USBI_CLOCK_MONOTONIC) + return clock_gettime(CLOCK_MONOTONIC, tp); + + return (LIBUSB_ERROR_INVALID_PARAM); +} + +int +_errno_to_libusb(int err) +{ + switch (err) { + case EIO: + return (LIBUSB_ERROR_IO); + case EACCES: + return (LIBUSB_ERROR_ACCESS); + case ENOENT: + return (LIBUSB_ERROR_NO_DEVICE); + case ENOMEM: + return (LIBUSB_ERROR_NO_MEM); + } + + usbi_dbg("error: %s", strerror(err)); + + return (LIBUSB_ERROR_OTHER); +} + +int +_cache_active_config_descriptor(struct libusb_device *dev, int fd) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + struct usb_config_desc ucd; + struct usb_full_desc ufd; + unsigned char* buf; + int len; + + usbi_dbg("fd %d", fd); + + ucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX; + + if ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0) + return _errno_to_libusb(errno); + + usbi_dbg("active bLength %d", ucd.ucd_desc.bLength); + + len = UGETW(ucd.ucd_desc.wTotalLength); + buf = malloc(len); + if (buf == NULL) + return (LIBUSB_ERROR_NO_MEM); + + ufd.ufd_config_index = ucd.ucd_config_index; + ufd.ufd_size = len; + ufd.ufd_data = buf; + + usbi_dbg("index %d, len %d", ufd.ufd_config_index, len); + + if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { + free(buf); + return _errno_to_libusb(errno); + } + + if (dpriv->cdesc) + free(dpriv->cdesc); + dpriv->cdesc = buf; + + return (0); +} + +int +_sync_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct libusb_control_setup *setup; + struct device_priv *dpriv; + struct usb_ctl_request req; + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; + setup = (struct libusb_control_setup *)transfer->buffer; + + usbi_dbg("type %d request %d value %d index %d length %d timeout %d", + setup->bmRequestType, setup->bRequest, + libusb_le16_to_cpu(setup->wValue), + libusb_le16_to_cpu(setup->wIndex), + libusb_le16_to_cpu(setup->wLength), transfer->timeout); + + req.ucr_request.bmRequestType = setup->bmRequestType; + req.ucr_request.bRequest = setup->bRequest; + /* Don't use USETW, libusb already deals with the endianness */ + (*(uint16_t *)req.ucr_request.wValue) = setup->wValue; + (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex; + (*(uint16_t *)req.ucr_request.wLength) = setup->wLength; + req.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; + + if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) + req.ucr_flags = USBD_SHORT_XFER_OK; + + if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) + return _errno_to_libusb(errno); + + if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) + return _errno_to_libusb(errno); + + itransfer->transferred = req.ucr_actlen; + + usbi_dbg("transferred %d", itransfer->transferred); + + return (0); +} + +int +_access_endpoint(struct libusb_transfer *transfer) +{ + struct handle_priv *hpriv; + struct device_priv *dpriv; + char *s, devnode[16]; + int fd, endpt; + mode_t mode; + + hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; + dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; + + endpt = UE_GET_ADDR(transfer->endpoint); + mode = IS_XFERIN(transfer) ? O_RDONLY : O_WRONLY; + + usbi_dbg("endpoint %d mode %d", endpt, mode); + + if (hpriv->endpoints[endpt] < 0) { + /* Pick the right node given the control one */ + strlcpy(devnode, dpriv->devnode, sizeof(devnode)); + s = strchr(devnode, '.'); + snprintf(s, 4, ".%02d", endpt); + + /* We may need to read/write to the same endpoint later. */ + if (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO)) + if ((fd = open(devnode, mode)) < 0) + return (-1); + + hpriv->endpoints[endpt] = fd; + } + + return (hpriv->endpoints[endpt]); +} + +int +_sync_gen_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + int fd, nr = 1; + + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + /* + * Bulk, Interrupt or Isochronous transfer depends on the + * endpoint and thus the node to open. + */ + if ((fd = _access_endpoint(transfer)) < 0) + return _errno_to_libusb(errno); + + if ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) + return _errno_to_libusb(errno); + + if (IS_XFERIN(transfer)) { + if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) + if ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0) + return _errno_to_libusb(errno); + + nr = read(fd, transfer->buffer, transfer->length); + } else { + nr = write(fd, transfer->buffer, transfer->length); + } + + if (nr < 0) + return _errno_to_libusb(errno); + + itransfer->transferred = nr; + + return (0); +} diff --git a/libusb/libusb/libusb/os/poll_posix.h b/libusb/libusb/libusb/os/poll_posix.h new file mode 100644 index 0000000..0e5e7f5 --- /dev/null +++ b/libusb/libusb/libusb/os/poll_posix.h @@ -0,0 +1,10 @@ +#ifndef LIBUSB_POLL_POSIX_H +#define LIBUSB_POLL_POSIX_H + +#define usbi_write write +#define usbi_read read +#define usbi_close close +#define usbi_pipe pipe +#define usbi_poll poll + +#endif /* LIBUSB_POLL_POSIX_H */ diff --git a/libusb/libusb/libusb/os/poll_windows.c b/libusb/libusb/libusb/os/poll_windows.c new file mode 100644 index 0000000..7f4d9c4 --- /dev/null +++ b/libusb/libusb/libusb/os/poll_windows.c @@ -0,0 +1,745 @@ +/* + * poll_windows: poll compatibility wrapper for Windows + * Copyright (C) 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + * poll() and pipe() Windows compatibility layer for libusb 1.0 + * + * The way this layer works is by using OVERLAPPED with async I/O transfers, as + * OVERLAPPED have an associated event which is flagged for I/O completion. + * + * For USB pollable async I/O, you would typically: + * - obtain a Windows HANDLE to a file or device that has been opened in + * OVERLAPPED mode + * - call usbi_create_fd with this handle to obtain a custom fd. + * Note that if you need simultaneous R/W access, you need to call create_fd + * twice, once in _O_RDONLY and once in _O_WRONLY mode to obtain 2 separate + * pollable fds + * - leave the core functions call the poll routine and flag POLLIN/POLLOUT + * + * The pipe pollable synchronous I/O works using the overlapped event associated + * with a fake pipe. The read/write functions are only meant to be used in that + * context. + */ +#include +#include +#include +#include +#include + +#include + +// Uncomment to debug the polling layer +//#define DEBUG_POLL_WINDOWS +#if defined(DEBUG_POLL_WINDOWS) +#define poll_dbg usbi_dbg +#else +// MSVC++ < 2005 cannot use a variadic argument and non MSVC +// compilers produce warnings if parenthesis are omitted. +#if defined(_MSC_VER) && _MSC_VER < 1400 +#define poll_dbg +#else +#define poll_dbg(...) +#endif +#endif + +#if defined(_PREFAST_) +#pragma warning(disable:28719) +#endif + +#if defined(__CYGWIN__) +// cygwin produces a warning unless these prototypes are defined +extern int _open(char* name, int flags); +extern int _close(int fd); +extern int _snprintf(char *buffer, size_t count, const char *format, ...); +#define NUL_DEVICE "/dev/null" +#else +#define NUL_DEVICE "NUL" +#endif + +#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0) + +// public fd data +const struct winfd INVALID_WINFD = {-1, INVALID_HANDLE_VALUE, NULL, RW_NONE}; +struct winfd poll_fd[MAX_FDS]; +// internal fd data +struct { + CRITICAL_SECTION mutex; // lock for fds + // Additional variables for XP CancelIoEx partial emulation + HANDLE original_handle; + DWORD thread_id; +} _poll_fd[MAX_FDS]; + +// globals +BOOLEAN is_polling_set = FALSE; +LONG pipe_number = 0; +static volatile LONG compat_spinlock = 0; + +// CancelIoEx, available on Vista and later only, provides the ability to cancel +// a single transfer (OVERLAPPED) when used. As it may not be part of any of the +// platform headers, we hook into the Kernel32 system DLL directly to seek it. +static BOOL (__stdcall *pCancelIoEx)(HANDLE, LPOVERLAPPED) = NULL; +#define CancelIoEx_Available (pCancelIoEx != NULL) +static __inline BOOL cancel_io(int _index) +{ + if ((_index < 0) || (_index >= MAX_FDS)) { + return FALSE; + } + + if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) + || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { + return TRUE; + } + if (CancelIoEx_Available) { + return (*pCancelIoEx)(poll_fd[_index].handle, poll_fd[_index].overlapped); + } + if (_poll_fd[_index].thread_id == GetCurrentThreadId()) { + return CancelIo(poll_fd[_index].handle); + } + usbi_warn(NULL, "Unable to cancel I/O that was started from another thread"); + return FALSE; +} + +// Init +void init_polling(void) +{ + int i; + + while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { + SleepEx(0, TRUE); + } + if (!is_polling_set) { + pCancelIoEx = (BOOL (__stdcall *)(HANDLE,LPOVERLAPPED)) + GetProcAddress(GetModuleHandleA("KERNEL32"), "CancelIoEx"); + usbi_dbg("Will use CancelIo%s for I/O cancellation", + CancelIoEx_Available?"Ex":""); + for (i=0; ihEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if(overlapped->hEvent == NULL) { + free (overlapped); + return NULL; + } + return overlapped; +} + +void free_overlapped(OVERLAPPED *overlapped) +{ + if (overlapped == NULL) + return; + + if ( (overlapped->hEvent != 0) + && (overlapped->hEvent != INVALID_HANDLE_VALUE) ) { + CloseHandle(overlapped->hEvent); + } + free(overlapped); +} + +void reset_overlapped(OVERLAPPED *overlapped) +{ + HANDLE event_handle; + if (overlapped == NULL) + return; + + event_handle = overlapped->hEvent; + if (event_handle != NULL) { + ResetEvent(event_handle); + } + memset(overlapped, 0, sizeof(OVERLAPPED)); + overlapped->hEvent = event_handle; +} + +void exit_polling(void) +{ + int i; + + while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { + SleepEx(0, TRUE); + } + if (is_polling_set) { + is_polling_set = FALSE; + + for (i=0; i 0) && (poll_fd[i].handle != INVALID_HANDLE_VALUE) && (poll_fd[i].handle != 0) + && (GetFileType(poll_fd[i].handle) == FILE_TYPE_UNKNOWN) ) { + _close(poll_fd[i].fd); + } + free_overlapped(poll_fd[i].overlapped); + if (!CancelIoEx_Available) { + // Close duplicate handle + if (_poll_fd[i].original_handle != INVALID_HANDLE_VALUE) { + CloseHandle(poll_fd[i].handle); + } + } + poll_fd[i] = INVALID_WINFD; + LeaveCriticalSection(&_poll_fd[i].mutex); + DeleteCriticalSection(&_poll_fd[i].mutex); + } + } + compat_spinlock = 0; +} + +/* + * Create a fake pipe. + * As libusb only uses pipes for signaling, all we need from a pipe is an + * event. To that extent, we create a single wfd and overlapped as a means + * to access that event. + */ +int usbi_pipe(int filedes[2]) +{ + int i; + OVERLAPPED* overlapped; + + CHECK_INIT_POLLING; + + overlapped = (OVERLAPPED*) calloc(1, sizeof(OVERLAPPED)); + if (overlapped == NULL) { + return -1; + } + // The overlapped must have status pending for signaling to work in poll + overlapped->Internal = STATUS_PENDING; + overlapped->InternalHigh = 0; + + // Read end of the "pipe" + filedes[0] = _open(NUL_DEVICE, _O_WRONLY); + if (filedes[0] < 0) { + usbi_err(NULL, "could not create pipe: errno %d", errno); + goto out1; + } + // We can use the same handle for both ends + filedes[1] = filedes[0]; + poll_dbg("pipe filedes = %d", filedes[0]); + + // Note: manual reset must be true (second param) as the reset occurs in read + overlapped->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if(!overlapped->hEvent) { + goto out2; + } + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[i].mutex); + continue; + } + + poll_fd[i].fd = filedes[0]; + poll_fd[i].handle = DUMMY_HANDLE; + poll_fd[i].overlapped = overlapped; + // There's no polling on the write end, so we just use READ for our needs + poll_fd[i].rw = RW_READ; + _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; + LeaveCriticalSection(&_poll_fd[i].mutex); + return 0; + } + } + + CloseHandle(overlapped->hEvent); +out2: + _close(filedes[0]); +out1: + free(overlapped); + return -1; +} + +/* + * Create both an fd and an OVERLAPPED from an open Windows handle, so that + * it can be used with our polling function + * The handle MUST support overlapped transfers (usually requires CreateFile + * with FILE_FLAG_OVERLAPPED) + * Return a pollable file descriptor struct, or INVALID_WINFD on error + * + * Note that the fd returned by this function is a per-transfer fd, rather + * than a per-session fd and cannot be used for anything else but our + * custom functions (the fd itself points to the NUL: device) + * if you plan to do R/W on the same handle, you MUST create 2 fds: one for + * read and one for write. Using a single R/W fd is unsupported and will + * produce unexpected results + */ +struct winfd usbi_create_fd(HANDLE handle, int access_mode) +{ + int i, fd; + struct winfd wfd = INVALID_WINFD; + OVERLAPPED* overlapped = NULL; + + CHECK_INIT_POLLING; + + if ((handle == 0) || (handle == INVALID_HANDLE_VALUE)) { + return INVALID_WINFD; + } + + if ((access_mode != _O_RDONLY) && (access_mode != _O_WRONLY)) { + usbi_warn(NULL, "only one of _O_RDONLY or _O_WRONLY are supported.\n" + "If you want to poll for R/W simultaneously, create multiple fds from the same handle."); + return INVALID_WINFD; + } + if (access_mode == _O_RDONLY) { + wfd.rw = RW_READ; + } else { + wfd.rw = RW_WRITE; + } + + // Ensure that we get a non system conflicting unique fd, using + // the same fd attribution system as the pipe ends + fd = _open(NUL_DEVICE, _O_WRONLY); + if (fd < 0) { + return INVALID_WINFD; + } + + overlapped = create_overlapped(); + if(overlapped == NULL) { + _close(fd); + return INVALID_WINFD; + } + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[i].mutex); + continue; + } + wfd.fd = fd; + // Attempt to emulate some of the CancelIoEx behaviour on platforms + // that don't have it + if (!CancelIoEx_Available) { + _poll_fd[i].thread_id = GetCurrentThreadId(); + if (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), + &wfd.handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { + usbi_dbg("could not duplicate handle for CancelIo - using original one"); + wfd.handle = handle; + // Make sure we won't close the original handle on fd deletion then + _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; + } else { + _poll_fd[i].original_handle = handle; + } + } else { + wfd.handle = handle; + } + wfd.overlapped = overlapped; + memcpy(&poll_fd[i], &wfd, sizeof(struct winfd)); + LeaveCriticalSection(&_poll_fd[i].mutex); + return wfd; + } + } + free_overlapped(overlapped); + _close(fd); + return INVALID_WINFD; +} + +void _free_index(int _index) +{ + // Cancel any async IO (Don't care about the validity of our handles for this) + cancel_io(_index); + // close fake handle for devices + if ( (poll_fd[_index].handle != INVALID_HANDLE_VALUE) && (poll_fd[_index].handle != 0) + && (GetFileType(poll_fd[_index].handle) == FILE_TYPE_UNKNOWN) ) { + _close(poll_fd[_index].fd); + } + // close the duplicate handle (if we have an actual duplicate) + if (!CancelIoEx_Available) { + if (_poll_fd[_index].original_handle != INVALID_HANDLE_VALUE) { + CloseHandle(poll_fd[_index].handle); + } + _poll_fd[_index].original_handle = INVALID_HANDLE_VALUE; + _poll_fd[_index].thread_id = 0; + } + free_overlapped(poll_fd[_index].overlapped); + poll_fd[_index] = INVALID_WINFD; +} + +/* + * Release a pollable file descriptor. + * + * Note that the associated Windows handle is not closed by this call + */ +void usbi_free_fd(int fd) +{ + int _index; + + CHECK_INIT_POLLING; + + _index = _fd_to_index_and_lock(fd); + if (_index < 0) { + return; + } + _free_index(_index); + LeaveCriticalSection(&_poll_fd[_index].mutex); +} + +/* + * The functions below perform various conversions between fd, handle and OVERLAPPED + */ +struct winfd fd_to_winfd(int fd) +{ + int i; + struct winfd wfd; + + CHECK_INIT_POLLING; + + if (fd <= 0) + return INVALID_WINFD; + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + usbi_warn(NULL, "invalid fd"); + triggered = -1; + goto poll_exit; + } + + // IN or OUT must match our fd direction + if ((fds[i].events & POLLIN) && (poll_fd[_index].rw != RW_READ)) { + fds[i].revents |= POLLNVAL | POLLERR; + errno = EBADF; + usbi_warn(NULL, "attempted POLLIN on fd without READ access"); + LeaveCriticalSection(&_poll_fd[_index].mutex); + triggered = -1; + goto poll_exit; + } + + if ((fds[i].events & POLLOUT) && (poll_fd[_index].rw != RW_WRITE)) { + fds[i].revents |= POLLNVAL | POLLERR; + errno = EBADF; + usbi_warn(NULL, "attempted POLLOUT on fd without WRITE access"); + LeaveCriticalSection(&_poll_fd[_index].mutex); + triggered = -1; + goto poll_exit; + } + + // The following macro only works if overlapped I/O was reported pending + if ( (HasOverlappedIoCompleted(poll_fd[_index].overlapped)) + || (HasOverlappedIoCompletedSync(poll_fd[_index].overlapped)) ) { + poll_dbg(" completed"); + // checks above should ensure this works: + fds[i].revents = fds[i].events; + triggered++; + } else { + handles_to_wait_on[nb_handles_to_wait_on] = poll_fd[_index].overlapped->hEvent; + handle_to_index[nb_handles_to_wait_on] = i; + nb_handles_to_wait_on++; + } + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + + // If nothing was triggered, wait on all fds that require it + if ((timeout != 0) && (triggered == 0) && (nb_handles_to_wait_on != 0)) { + if (timeout < 0) { + poll_dbg("starting infinite wait for %d handles...", (int)nb_handles_to_wait_on); + } else { + poll_dbg("starting %d ms wait for %d handles...", timeout, (int)nb_handles_to_wait_on); + } + ret = WaitForMultipleObjects(nb_handles_to_wait_on, handles_to_wait_on, + FALSE, (timeout<0)?INFINITE:(DWORD)timeout); + object_index = ret-WAIT_OBJECT_0; + if ((object_index >= 0) && ((DWORD)object_index < nb_handles_to_wait_on)) { + poll_dbg(" completed after wait"); + i = handle_to_index[object_index]; + _index = _fd_to_index_and_lock(fds[i].fd); + fds[i].revents = fds[i].events; + triggered++; + if (_index >= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + } else if (ret == WAIT_TIMEOUT) { + poll_dbg(" timed out"); + triggered = 0; // 0 = timeout + } else { + errno = EIO; + triggered = -1; // error + } + } + +poll_exit: + if (handles_to_wait_on != NULL) { + free(handles_to_wait_on); + } + if (handle_to_index != NULL) { + free(handle_to_index); + } + return triggered; +} + +/* + * close a fake pipe fd + */ +int usbi_close(int fd) +{ + int _index; + int r = -1; + + CHECK_INIT_POLLING; + + _index = _fd_to_index_and_lock(fd); + + if (_index < 0) { + errno = EBADF; + } else { + if (poll_fd[_index].overlapped != NULL) { + // Must be a different event for each end of the pipe + CloseHandle(poll_fd[_index].overlapped->hEvent); + free(poll_fd[_index].overlapped); + } + r = _close(poll_fd[_index].fd); + if (r != 0) { + errno = EIO; + } + poll_fd[_index] = INVALID_WINFD; + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + return r; +} + +/* + * synchronous write for fake "pipe" signaling + */ +ssize_t usbi_write(int fd, const void *buf, size_t count) +{ + int _index; + + CHECK_INIT_POLLING; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + return -1; + } + + _index = _fd_to_index_and_lock(fd); + + if ( (_index < 0) || (poll_fd[_index].overlapped == NULL) ) { + errno = EBADF; + if (_index >= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + return -1; + } + + poll_dbg("set pipe event (fd = %d, thread = %08X)", _index, GetCurrentThreadId()); + SetEvent(poll_fd[_index].overlapped->hEvent); + poll_fd[_index].overlapped->Internal = STATUS_WAIT_0; + // If two threads write on the pipe at the same time, we need to + // process two separate reads => use the overlapped as a counter + poll_fd[_index].overlapped->InternalHigh++; + + LeaveCriticalSection(&_poll_fd[_index].mutex); + return sizeof(unsigned char); +} + +/* + * synchronous read for fake "pipe" signaling + */ +ssize_t usbi_read(int fd, void *buf, size_t count) +{ + int _index; + ssize_t r = -1; + + CHECK_INIT_POLLING; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + return -1; + } + + _index = _fd_to_index_and_lock(fd); + + if (_index < 0) { + errno = EBADF; + return -1; + } + + if (WaitForSingleObject(poll_fd[_index].overlapped->hEvent, INFINITE) != WAIT_OBJECT_0) { + usbi_warn(NULL, "waiting for event failed: %d", (int)GetLastError()); + errno = EIO; + goto out; + } + + poll_dbg("clr pipe event (fd = %d, thread = %08X)", _index, GetCurrentThreadId()); + poll_fd[_index].overlapped->InternalHigh--; + // Don't reset unless we don't have any more events to process + if (poll_fd[_index].overlapped->InternalHigh <= 0) { + ResetEvent(poll_fd[_index].overlapped->hEvent); + poll_fd[_index].overlapped->Internal = STATUS_PENDING; + } + + r = sizeof(unsigned char); + +out: + LeaveCriticalSection(&_poll_fd[_index].mutex); + return r; +} diff --git a/libusb/libusb/libusb/os/poll_windows.h b/libusb/libusb/libusb/os/poll_windows.h new file mode 100644 index 0000000..6e5bf2b --- /dev/null +++ b/libusb/libusb/libusb/os/poll_windows.h @@ -0,0 +1,115 @@ +/* + * Windows compat: POSIX compatibility wrapper + * Copyright (C) 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#pragma once + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4127) // conditional expression is constant +#endif + +// Handle synchronous completion through the overlapped structure +#if !defined(STATUS_REPARSE) // reuse the REPARSE status code +#define STATUS_REPARSE ((LONG)0x00000104L) +#endif +#define STATUS_COMPLETED_SYNCHRONOUSLY STATUS_REPARSE +#define HasOverlappedIoCompletedSync(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY) + +#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2) + +enum windows_version { + WINDOWS_UNSUPPORTED, + WINDOWS_XP, + WINDOWS_2003, // also includes XP 64 + WINDOWS_VISTA_AND_LATER, +}; +extern enum windows_version windows_version; + +#define MAX_FDS 256 + +#define POLLIN 0x0001 /* There is data to read */ +#define POLLPRI 0x0002 /* There is urgent data to read */ +#define POLLOUT 0x0004 /* Writing now will not block */ +#define POLLERR 0x0008 /* Error condition */ +#define POLLHUP 0x0010 /* Hung up */ +#define POLLNVAL 0x0020 /* Invalid request: fd not open */ + +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; + +// access modes +enum rw_type { + RW_NONE, + RW_READ, + RW_WRITE, +}; + +// fd struct that can be used for polling on Windows +struct winfd { + int fd; // what's exposed to libusb core + HANDLE handle; // what we need to attach overlapped to the I/O op, so we can poll it + OVERLAPPED* overlapped; // what will report our I/O status + enum rw_type rw; // I/O transfer direction: read *XOR* write (NOT BOTH) +}; +extern const struct winfd INVALID_WINFD; + +int usbi_pipe(int pipefd[2]); +int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout); +ssize_t usbi_write(int fd, const void *buf, size_t count); +ssize_t usbi_read(int fd, void *buf, size_t count); +int usbi_close(int fd); + +void init_polling(void); +void exit_polling(void); +struct winfd usbi_create_fd(HANDLE handle, int access_mode); +void usbi_free_fd(int fd); +struct winfd fd_to_winfd(int fd); +struct winfd handle_to_winfd(HANDLE handle); +struct winfd overlapped_to_winfd(OVERLAPPED* overlapped); + +/* + * Timeval operations + */ +#if defined(DDKBUILD) +#include // defines timeval functions on DDK +#endif + +#if !defined(TIMESPEC_TO_TIMEVAL) +#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ + (tv)->tv_sec = (long)(ts)->tv_sec; \ + (tv)->tv_usec = (long)(ts)->tv_nsec / 1000; \ +} +#endif +#if !defined(timersub) +#define timersub(a, b, result) \ +do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((result)->tv_usec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_usec += 1000000; \ + } \ +} while (0) +#endif + diff --git a/libusb/libusb/libusb/os/threads_posix.c b/libusb/libusb/libusb/os/threads_posix.c new file mode 100644 index 0000000..60c57cf --- /dev/null +++ b/libusb/libusb/libusb/os/threads_posix.c @@ -0,0 +1,55 @@ +/* + * libusb synchronization using POSIX Threads + * + * Copyright (C) 2011 Vitali Lovich + * Copyright (C) 2011 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef _XOPEN_SOURCE +# if _XOPEN_SOURCE < 500 +# undef _XOPEN_SOURCE +# define _XOPEN_SOURCE 500 +# endif +#else +#define _XOPEN_SOURCE 500 +#endif /* _XOPEN_SOURCE */ + +#include "threads_posix.h" + +int usbi_mutex_init_recursive(pthread_mutex_t *mutex, pthread_mutexattr_t *attr) +{ + int err; + pthread_mutexattr_t stack_attr; + if (!attr) { + attr = &stack_attr; + err = pthread_mutexattr_init(&stack_attr); + if (err != 0) + return err; + } + + err = pthread_mutexattr_settype(attr, PTHREAD_MUTEX_RECURSIVE); + if (err != 0) + goto finish; + + err = pthread_mutex_init(mutex, attr); + +finish: + if (attr == &stack_attr) + pthread_mutexattr_destroy(&stack_attr); + + return err; +} diff --git a/libusb/libusb/libusb/os/threads_posix.h b/libusb/libusb/libusb/os/threads_posix.h new file mode 100644 index 0000000..9752208 --- /dev/null +++ b/libusb/libusb/libusb/os/threads_posix.h @@ -0,0 +1,48 @@ +/* + * libusb synchronization using POSIX Threads + * + * Copyright (C) 2010 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_POSIX_H +#define LIBUSB_THREADS_POSIX_H + +#include + +#define usbi_mutex_static_t pthread_mutex_t +#define USBI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#define usbi_mutex_static_lock pthread_mutex_lock +#define usbi_mutex_static_unlock pthread_mutex_unlock + +#define usbi_mutex_t pthread_mutex_t +#define usbi_mutex_init pthread_mutex_init +#define usbi_mutex_lock pthread_mutex_lock +#define usbi_mutex_unlock pthread_mutex_unlock +#define usbi_mutex_trylock pthread_mutex_trylock +#define usbi_mutex_destroy pthread_mutex_destroy + +#define usbi_cond_t pthread_cond_t +#define usbi_cond_init pthread_cond_init +#define usbi_cond_wait pthread_cond_wait +#define usbi_cond_timedwait pthread_cond_timedwait +#define usbi_cond_broadcast pthread_cond_broadcast +#define usbi_cond_destroy pthread_cond_destroy +#define usbi_cond_signal pthread_cond_signal + +extern int usbi_mutex_init_recursive(pthread_mutex_t *mutex, pthread_mutexattr_t *attr); + +#endif /* LIBUSB_THREADS_POSIX_H */ diff --git a/libusb/libusb/libusb/os/threads_windows.c b/libusb/libusb/libusb/os/threads_windows.c new file mode 100644 index 0000000..1394bb0 --- /dev/null +++ b/libusb/libusb/libusb/os/threads_windows.c @@ -0,0 +1,207 @@ +/* + * libusb synchronization on Microsoft Windows + * + * Copyright (C) 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#include "libusbi.h" + + +int usbi_mutex_init(usbi_mutex_t *mutex, + const usbi_mutexattr_t *attr) { + if(! mutex) return ((errno=EINVAL)); + *mutex = CreateMutex(NULL, FALSE, NULL); + if(!*mutex) return ((errno=ENOMEM)); + return 0; +} +int usbi_mutex_destroy(usbi_mutex_t *mutex) { + // It is not clear if CloseHandle failure is due to failure to unlock. + // If so, this should be errno=EBUSY. + if(!mutex || !CloseHandle(*mutex)) return ((errno=EINVAL)); + *mutex = NULL; + return 0; +} +int usbi_mutex_trylock(usbi_mutex_t *mutex) { + DWORD result; + if(!mutex) return ((errno=EINVAL)); + result = WaitForSingleObject(*mutex, 0); + if(result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) + return 0; // acquired (ToDo: check that abandoned is ok) + if(result == WAIT_TIMEOUT) + return ((errno=EBUSY)); + return ((errno=EINVAL)); // don't know how this would happen + // so don't know proper errno +} +int usbi_mutex_lock(usbi_mutex_t *mutex) { + DWORD result; + if(!mutex) return ((errno=EINVAL)); + result = WaitForSingleObject(*mutex, INFINITE); + if(result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) + return 0; // acquired (ToDo: check that abandoned is ok) + return ((errno=EINVAL)); // don't know how this would happen + // so don't know proper errno +} +int usbi_mutex_unlock(usbi_mutex_t *mutex) { + if(!mutex) return ((errno=EINVAL)); + if(!ReleaseMutex(*mutex)) return ((errno=EPERM )); + return 0; +} + +int usbi_mutex_static_lock(usbi_mutex_static_t *mutex) { + if(!mutex) return ((errno=EINVAL)); + while (InterlockedExchange((LONG *)mutex, 1) == 1) { + SleepEx(0, TRUE); + } + return 0; +} +int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) { + if(!mutex) return ((errno=EINVAL)); + *mutex = 0; + return 0; +} + + + +int usbi_cond_init(usbi_cond_t *cond, + const usbi_condattr_t *attr) { + if(!cond) return ((errno=EINVAL)); + list_init(&cond->waiters ); + list_init(&cond->not_waiting); + return 0; +} +int usbi_cond_destroy(usbi_cond_t *cond) { + // This assumes no one is using this anymore. The check MAY NOT BE safe. + struct usbi_cond_perthread *pos, *prev_pos = NULL; + if(!cond) return ((errno=EINVAL)); + if(!list_empty(&cond->waiters)) return ((errno=EBUSY )); // (!see above!) + list_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) { + free(prev_pos); + list_del(&pos->list); + prev_pos = pos; + } + free(prev_pos); + + return 0; +} + +int usbi_cond_broadcast(usbi_cond_t *cond) { + // Assumes mutex is locked; this is not in keeping with POSIX spec, but + // libusb does this anyway, so we simplify by not adding more sync + // primitives to the CV definition! + int fail = 0; + struct usbi_cond_perthread *pos; + if(!cond) return ((errno=EINVAL)); + list_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) { + if(!SetEvent(pos->event)) + fail = 1; + } + // The wait function will remove its respective item from the list. + return fail ? ((errno=EINVAL)) : 0; +} +int usbi_cond_signal(usbi_cond_t *cond) { + // Assumes mutex is locked; this is not in keeping with POSIX spec, but + // libusb does this anyway, so we simplify by not adding more sync + // primitives to the CV definition! + struct usbi_cond_perthread *pos; + if(!cond) return ((errno=EINVAL)); + if(list_empty(&cond->waiters)) return 0; // no one to wakeup. + pos = list_entry(&cond->waiters.next, struct usbi_cond_perthread, list); + // The wait function will remove its respective item from the list. + return SetEvent(pos->event) ? 0 : ((errno=EINVAL)); +} +static int __inline usbi_cond_intwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, + DWORD timeout_ms) { + struct usbi_cond_perthread *pos; + int found = 0, r; + DWORD r2,tid = GetCurrentThreadId(); + if(!cond || !mutex) return ((errno=EINVAL)); + list_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) { + if(tid == pos->tid) { + found = 1; + break; + } + } + if(!found) { + pos = (struct usbi_cond_perthread*) calloc(1, sizeof(struct usbi_cond_perthread)); + if(!pos) return ((errno=ENOMEM)); // This errno is not POSIX-allowed. + pos->tid = tid; + pos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset. + if(!pos->event) { + free(pos); + return ((errno=ENOMEM)); + } + list_add(&pos->list, &cond->not_waiting); + } + + list_del(&pos->list); // remove from not_waiting list. + list_add(&pos->list, &cond->waiters); + + r = usbi_mutex_unlock(mutex); + if(r) return r; + r2 = WaitForSingleObject(pos->event, timeout_ms); + r = usbi_mutex_lock(mutex); + if(r) return r; + + list_del(&pos->list); + list_add(&pos->list, &cond->not_waiting); + + if(r2 == WAIT_TIMEOUT) return ((errno=ETIMEDOUT)); + + return 0; +} +// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot! +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) { + return usbi_cond_intwait(cond, mutex, INFINITE); +} +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, + const struct timespec *abstime) { + FILETIME filetime; + ULARGE_INTEGER rtime; + struct timeval targ_time, cur_time, delta_time; + struct timespec cur_time_ns; + DWORD millis; + extern const uint64_t epoch_time; + + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + cur_time_ns.tv_sec = (long)(rtime.QuadPart / 10000000); + cur_time_ns.tv_nsec = (long)((rtime.QuadPart % 10000000)*100); + TIMESPEC_TO_TIMEVAL(&cur_time, &cur_time_ns); + + TIMESPEC_TO_TIMEVAL(&targ_time, abstime); + timersub(&targ_time, &cur_time, &delta_time); + if(delta_time.tv_sec < 0) // abstime already passed? + millis = 0; + else { + millis = delta_time.tv_usec/1000; + millis += delta_time.tv_sec *1000; + if (delta_time.tv_usec % 1000) // round up to next millisecond + millis++; + } + + return usbi_cond_intwait(cond, mutex, millis); +} + diff --git a/libusb/libusb/libusb/os/threads_windows.h b/libusb/libusb/libusb/os/threads_windows.h new file mode 100644 index 0000000..7bb144a --- /dev/null +++ b/libusb/libusb/libusb/os/threads_windows.h @@ -0,0 +1,86 @@ +/* + * libusb synchronization on Microsoft Windows + * + * Copyright (C) 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_WINDOWS_H +#define LIBUSB_THREADS_WINDOWS_H + +#define usbi_mutex_static_t volatile LONG +#define USBI_MUTEX_INITIALIZER 0 + +#define usbi_mutex_t HANDLE + +struct usbi_cond_perthread { + struct list_head list; + DWORD tid; + HANDLE event; +}; +struct usbi_cond_t_ { + // Every time a thread touches the CV, it winds up in one of these lists. + // It stays there until the CV is destroyed, even if the thread + // terminates. + struct list_head waiters; + struct list_head not_waiting; +}; +typedef struct usbi_cond_t_ usbi_cond_t; + +// We *were* getting timespec from pthread.h: +#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) +#define HAVE_STRUCT_TIMESPEC 1 +#define _TIMESPEC_DEFINED 1 +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ + +// We *were* getting ETIMEDOUT from pthread.h: +#ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +#define usbi_mutexattr_t void +#define usbi_condattr_t void + +// all Windows mutexes are recursive +#define usbi_mutex_init_recursive(mutex, attr) usbi_mutex_init((mutex), (attr)) + +int usbi_mutex_static_lock(usbi_mutex_static_t *mutex); +int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex); + + +int usbi_mutex_init(usbi_mutex_t *mutex, + const usbi_mutexattr_t *attr); +int usbi_mutex_lock(usbi_mutex_t *mutex); +int usbi_mutex_unlock(usbi_mutex_t *mutex); +int usbi_mutex_trylock(usbi_mutex_t *mutex); +int usbi_mutex_destroy(usbi_mutex_t *mutex); + +int usbi_cond_init(usbi_cond_t *cond, + const usbi_condattr_t *attr); +int usbi_cond_destroy(usbi_cond_t *cond); +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, + const struct timespec *abstime); +int usbi_cond_broadcast(usbi_cond_t *cond); +int usbi_cond_signal(usbi_cond_t *cond); + +#endif /* LIBUSB_THREADS_WINDOWS_H */ + diff --git a/libusb/libusb/libusb/os/windows_usb.c b/libusb/libusb/libusb/os/windows_usb.c new file mode 100644 index 0000000..0739c19 --- /dev/null +++ b/libusb/libusb/libusb/os/windows_usb.c @@ -0,0 +1,2996 @@ +/* + * windows backend for libusb 1.0 + * Copyright (c) 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "poll_windows.h" +#include "windows_usb.h" + +// The following prevents "banned API" errors when using the MS's WDK OACR/Prefast +#if defined(_PREFAST_) +#pragma warning(disable:28719) +#endif + +// The 2 macros below are used in conjunction with safe loops. +#define LOOP_CHECK(fcall) { r=fcall; if (r != LIBUSB_SUCCESS) continue; } +#define LOOP_BREAK(err) { r=err; continue; } + +extern void usbi_fd_notification(struct libusb_context *ctx); + +// Helper prototypes +static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian); +static int windows_clock_gettime(int clk_id, struct timespec *tp); +unsigned __stdcall windows_clock_gettime_threaded(void* param); +// WinUSB API prototypes +static int winusb_init(struct libusb_context *ctx); +static int winusb_exit(void); +static int winusb_open(struct libusb_device_handle *dev_handle); +static void winusb_close(struct libusb_device_handle *dev_handle); +static int winusb_configure_endpoints(struct libusb_device_handle *dev_handle, int iface); +static int winusb_claim_interface(struct libusb_device_handle *dev_handle, int iface); +static int winusb_release_interface(struct libusb_device_handle *dev_handle, int iface); +static int winusb_submit_control_transfer(struct usbi_transfer *itransfer); +static int winusb_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int winusb_submit_bulk_transfer(struct usbi_transfer *itransfer); +static int winusb_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int winusb_abort_transfers(struct usbi_transfer *itransfer); +static int winusb_abort_control(struct usbi_transfer *itransfer); +static int winusb_reset_device(struct libusb_device_handle *dev_handle); +static int winusb_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); +// Composite API prototypes +static int composite_init(struct libusb_context *ctx); +static int composite_exit(void); +static int composite_open(struct libusb_device_handle *dev_handle); +static void composite_close(struct libusb_device_handle *dev_handle); +static int composite_claim_interface(struct libusb_device_handle *dev_handle, int iface); +static int composite_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int composite_release_interface(struct libusb_device_handle *dev_handle, int iface); +static int composite_submit_control_transfer(struct usbi_transfer *itransfer); +static int composite_submit_bulk_transfer(struct usbi_transfer *itransfer); +static int composite_submit_iso_transfer(struct usbi_transfer *itransfer); +static int composite_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int composite_abort_transfers(struct usbi_transfer *itransfer); +static int composite_abort_control(struct usbi_transfer *itransfer); +static int composite_reset_device(struct libusb_device_handle *dev_handle); +static int composite_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); + + +// Global variables +uint64_t hires_frequency, hires_ticks_to_ps; +const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime +enum windows_version windows_version = WINDOWS_UNSUPPORTED; +// Concurrency +static int concurrent_usage = -1; +usbi_mutex_t autoclaim_lock; +// Timer thread +// NB: index 0 is for monotonic and 1 is for the thread exit event +HANDLE timer_thread = NULL; +HANDLE timer_mutex = NULL; +struct timespec timer_tp; +volatile LONG request_count[2] = {0, 1}; // last one must be > 0 +HANDLE timer_request[2] = { NULL, NULL }; +HANDLE timer_response = NULL; +// API globals +bool api_winusb_available = false; +#define CHECK_WINUSB_AVAILABLE do { if (!api_winusb_available) return LIBUSB_ERROR_ACCESS; } while (0) + +static inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2) { + if ((guid1 != NULL) && (guid2 != NULL)) { + return (memcmp(guid1, guid2, sizeof(GUID)) == 0); + } + return false; +} + +#if defined(ENABLE_DEBUG_LOGGING) || (defined(_MSC_VER) && _MSC_VER < 1400) +static char* guid_to_string(const GUID* guid) +{ + static char guid_string[MAX_GUID_STRING_LENGTH]; + + if (guid == NULL) return NULL; + sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + (unsigned int)guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); + return guid_string; +} +#endif + +/* + * Converts a windows error to human readable string + * uses retval as errorcode, or, if 0, use GetLastError() + */ +static char *windows_error_str(uint32_t retval) +{ +static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + size_t i; + uint32_t error_code, format_error; + + error_code = retval?retval:GetLastError(); + + safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%d] ", error_code); + + size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &err_string[safe_strlen(err_string)], + ERR_BUFFER_SIZE - (DWORD)safe_strlen(err_string), NULL); + if (size == 0) { + format_error = GetLastError(); + if (format_error) + safe_sprintf(err_string, ERR_BUFFER_SIZE, + "Windows error code %u (FormatMessage error code %u)", error_code, format_error); + else + safe_sprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", error_code); + } else { + // Remove CR/LF terminators + for (i=safe_strlen(err_string)-1; ((err_string[i]==0x0A) || (err_string[i]==0x0D)); i--) { + err_string[i] = 0; + } + } + return err_string; +} + +/* + * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. + * Return an allocated sanitized string or NULL on error. + */ +static char* sanitize_path(const char* path) +{ + const char root_prefix[] = "\\\\.\\"; + size_t j, size, root_size; + char* ret_path = NULL; + size_t add_root = 0; + + if (path == NULL) + return NULL; + + size = safe_strlen(path)+1; + root_size = sizeof(root_prefix)-1; + + // Microsoft indiscriminatly uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes. + if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\')) || + ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) { + add_root = root_size; + size += add_root; + } + + if ((ret_path = (char*)calloc(size, 1)) == NULL) + return NULL; + + safe_strcpy(&ret_path[add_root], size-add_root, path); + + // Ensure consistancy with root prefix + for (j=0; jcbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return false; + } + return true; +} + +/* + * enumerate interfaces for a specific GUID + * + * Parameters: + * dev_info: a pointer to a dev_info list + * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) + * guid: the GUID for which to retrieve interface details + * index: zero based index of the interface in the device info list + * + * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA + * structure returned and call this function repeatedly using the same guid (with an + * incremented index starting at zero) until all interfaces have been returned. + */ +static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID* guid, unsigned _index) +{ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + DWORD size; + + if (_index <= 0) { + *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + } + + if (dev_info_data != NULL) { + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + } + + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) { + usbi_err(ctx, "Could not obtain interface data for index %u: %s", + _index, windows_error_str(0)); + } + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", + _index, windows_error_str(0)); + goto err_exit; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); + goto err_exit; + } + + if ((dev_interface_details = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) calloc(size, 1)) == NULL) { + usbi_err(ctx, "could not allocate interface data for index %u.", _index); + goto err_exit; + } + + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, + dev_interface_details, size, &size, NULL)) { + usbi_err(ctx, "could not access interface data (actual) for index %u: %s", + _index, windows_error_str(0)); + } + + return dev_interface_details; + +err_exit: + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; +} + +/* Hash table functions - modified From glibc 2.3.2: + [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ +typedef struct htab_entry { + unsigned long used; + char* str; +} htab_entry; +htab_entry* htab_table = NULL; +usbi_mutex_t htab_write_mutex = NULL; +unsigned long htab_size, htab_filled; + +/* For the used double hash method the table size has to be a prime. To + correct the user given table size we need a prime test. This trivial + algorithm is adequate because the code is called only during init and + the number is likely to be small */ +static int isprime(unsigned long number) +{ + // no even number will be passed + unsigned int divider = 3; + + while((divider * divider < number) && (number % divider != 0)) + divider += 2; + + return (number % divider != 0); +} + +/* Before using the hash table we must allocate memory for it. + We allocate one element more as the found prime number says. + This is done for more effective indexing as explained in the + comment for the hash function. */ +static int htab_create(struct libusb_context *ctx, unsigned long nel) +{ + if (htab_table != NULL) { + usbi_err(ctx, "hash table already allocated"); + } + + // Create a mutex + usbi_mutex_init(&htab_write_mutex, NULL); + + // Change nel to the first prime number not smaller as nel. + nel |= 1; + while(!isprime(nel)) + nel += 2; + + htab_size = nel; + usbi_dbg("using %d entries hash table", nel); + htab_filled = 0; + + // allocate memory and zero out. + htab_table = (htab_entry*)calloc(htab_size + 1, sizeof(htab_entry)); + if (htab_table == NULL) { + usbi_err(ctx, "could not allocate space for hash table"); + return 0; + } + + return 1; +} + +/* After using the hash table it has to be destroyed. */ +static void htab_destroy(void) +{ + size_t i; + if (htab_table == NULL) { + return; + } + + for (i=0; i New entry + + // If the table is full return an error + if (htab_filled >= htab_size) { + usbi_err(NULL, "hash table is full (%d entries)", htab_size); + return 0; + } + + // Concurrent threads might be storing the same entry at the same time + // (eg. "simultaneous" enums from different threads) => use a mutex + usbi_mutex_lock(&htab_write_mutex); + // Just free any previously allocated string (which should be the same as + // new one). The possibility of concurrent threads storing a collision + // string (same hash, different string) at the same time is extremely low + safe_free(htab_table[idx].str); + htab_table[idx].used = hval; + htab_table[idx].str = (char*) calloc(1, safe_strlen(str)+1); + if (htab_table[idx].str == NULL) { + usbi_err(NULL, "could not duplicate string for hash table"); + usbi_mutex_unlock(&htab_write_mutex); + return 0; + } + memcpy(htab_table[idx].str, str, safe_strlen(str)+1); + ++htab_filled; + usbi_mutex_unlock(&htab_write_mutex); + + return idx; +} + +/* + * Returns the session ID of a device's nth level ancestor + * If there's no device at the nth level, return 0 + */ +static unsigned long get_ancestor_session_id(DWORD devinst, unsigned level) +{ + DWORD parent_devinst; + unsigned long session_id = 0; + char* sanitized_path = NULL; + char path[MAX_PATH_LENGTH]; + unsigned i; + + if (level < 1) return 0; + for (i = 0; idev); + struct libusb_config_descriptor *conf_desc; + const struct libusb_interface_descriptor *if_desc; + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + r = libusb_get_config_descriptor(dev_handle->dev, 0, &conf_desc); + if (r != LIBUSB_SUCCESS) { + usbi_warn(ctx, "could not read config descriptor: error %d", r); + return r; + } + + if_desc = &conf_desc->interface[iface].altsetting[altsetting]; + safe_free(priv->usb_interface[iface].endpoint); + + if (if_desc->bNumEndpoints == 0) { + usbi_dbg("no endpoints found for interface %d", iface); + return LIBUSB_SUCCESS; + } + + priv->usb_interface[iface].endpoint = (uint8_t*) calloc(1, if_desc->bNumEndpoints); + if (priv->usb_interface[iface].endpoint == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + + priv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints; + for (i=0; ibNumEndpoints; i++) { + priv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress; + usbi_dbg("(re)assigned endpoint %02X to interface %d", priv->usb_interface[iface].endpoint[i], iface); + } + libusb_free_config_descriptor(conf_desc); + + // Extra init is required for WinUSB endpoints + if (priv->apib->id == USB_API_WINUSB) { + return winusb_configure_endpoints(dev_handle, iface); + } + + return LIBUSB_SUCCESS; +} + +// Lookup for a match in the list of API driver names +static bool is_api_driver(char* driver, uint8_t api) +{ + uint8_t i; + const char sep_str[2] = {LIST_SEPARATOR, 0}; + char *tok, *tmp_str; + size_t len = safe_strlen(driver); + + if (len == 0) return false; + tmp_str = (char*) calloc(1, len+1); + if (tmp_str == NULL) return false; + memcpy(tmp_str, driver, len+1); + tok = strtok(tmp_str, sep_str); + while (tok != NULL) { + for (i=0; idev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv( + transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = *interface_number; + int r = LIBUSB_SUCCESS; + + usbi_mutex_lock(&autoclaim_lock); + if (current_interface < 0) // No serviceable interface was found + { + for (current_interface=0; current_interfaceusb_interface[current_interface].apib->id == api_type) + && (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS) ) { + usbi_dbg("auto-claimed interface %d for control request", current_interface); + if (handle_priv->autoclaim_count[current_interface] != 0) { + usbi_warn(ctx, "program assertion failed - autoclaim_count was nonzero"); + } + handle_priv->autoclaim_count[current_interface]++; + break; + } + } + if (current_interface == USB_MAXINTERFACES) { + usbi_err(ctx, "could not auto-claim any interface"); + r = LIBUSB_ERROR_NOT_FOUND; + } + } else { + // If we have a valid interface that was autoclaimed, we must increment + // its autoclaim count so that we can prevent an early release. + if (handle_priv->autoclaim_count[current_interface] != 0) { + handle_priv->autoclaim_count[current_interface]++; + } + } + usbi_mutex_unlock(&autoclaim_lock); + + *interface_number = current_interface; + return r; + +} + +static void auto_release(struct usbi_transfer *itransfer) +{ + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + libusb_device_handle *dev_handle = transfer->dev_handle; + struct windows_device_handle_priv* handle_priv = _device_handle_priv(dev_handle); + int r; + + usbi_mutex_lock(&autoclaim_lock); + if (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) { + handle_priv->autoclaim_count[transfer_priv->interface_number]--; + if (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) { + r = libusb_release_interface(dev_handle, transfer_priv->interface_number); + if (r == LIBUSB_SUCCESS) { + usbi_dbg("auto-released interface %d", transfer_priv->interface_number); + } else { + usbi_dbg("failed to auto-release interface %d (%s)", + transfer_priv->interface_number, libusb_error_name((enum libusb_error)r)); + } + } + } + usbi_mutex_unlock(&autoclaim_lock); +} + +/* + * init: libusb backend init function + * + * This function enumerates the HCDs (Host Controller Drivers) and populates our private HCD list + * In our implementation, we equate Windows' "HCD" to LibUSB's "bus". Note that bus is zero indexed. + * HCDs are not expected to change after init (might not hold true for hot pluggable USB PCI card?) + */ +static int windows_init(struct libusb_context *ctx) +{ + int i, r = LIBUSB_ERROR_OTHER; + OSVERSIONINFO os_version; + HANDLE semaphore; + char sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) + + sprintf(sem_name, "libusb_init%08X", (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); + semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); + if (semaphore == NULL) { + usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_MEM; + } + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore's release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); + CloseHandle(semaphore); + return LIBUSB_ERROR_NO_MEM; + } + + // NB: concurrent usage supposes that init calls are equally balanced with + // exit calls. If init is called more than exit, we will not exit properly + if ( ++concurrent_usage == 0 ) { // First init? + // Detect OS version + memset(&os_version, 0, sizeof(OSVERSIONINFO)); + os_version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + windows_version = WINDOWS_UNSUPPORTED; + if ((GetVersionEx(&os_version) != 0) && (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)) { + if ((os_version.dwMajorVersion == 5) && (os_version.dwMinorVersion == 1)) { + windows_version = WINDOWS_XP; + } else if ((os_version.dwMajorVersion == 5) && (os_version.dwMinorVersion == 2)) { + windows_version = WINDOWS_2003; // also includes XP 64 + } else if (os_version.dwMajorVersion >= 6) { + windows_version = WINDOWS_VISTA_AND_LATER; + } + } + if (windows_version == WINDOWS_UNSUPPORTED) { + usbi_err(ctx, "This version of Windows is NOT supported"); + r = LIBUSB_ERROR_NOT_SUPPORTED; + goto init_exit; + } + + // We need a lock for proper auto-release + usbi_mutex_init(&autoclaim_lock, NULL); + + // Initialize pollable file descriptors + init_polling(); + + // Load DLL imports + if (init_dlls() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + return LIBUSB_ERROR_NOT_FOUND; + } + + // Initialize the low level APIs (we don't care about errors at this stage) + for (i=0; inum_configurations = 1; + priv->dev_descriptor.bLength = sizeof(USB_DEVICE_DESCRIPTOR); + priv->dev_descriptor.bDescriptorType = USB_DEVICE_DESCRIPTOR_TYPE; + priv->dev_descriptor.bNumConfigurations = 1; + priv->active_config = 1; + + if (priv->parent_dev == NULL) { + usbi_err(ctx, "program assertion failed - HCD hub has no parent"); + return LIBUSB_ERROR_NO_DEVICE; + } + parent_priv = _device_priv(priv->parent_dev); + if (sscanf(parent_priv->path, "\\\\.\\PCI#VEN_%04x&DEV_%04x%*s", &vid, &pid) == 2) { + priv->dev_descriptor.idVendor = (uint16_t)vid; + priv->dev_descriptor.idProduct = (uint16_t)pid; + } else { + usbi_warn(ctx, "could not infer VID/PID of HCD hub from '%s'", parent_priv->path); + priv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub + priv->dev_descriptor.idProduct = 1; + } + return LIBUSB_SUCCESS; +} + +/* + * fetch and cache all the config descriptors through I/O + */ +static int cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle, char* device_id) +{ + DWORD size, ret_size; + struct libusb_context *ctx = DEVICE_CTX(dev); + struct windows_device_priv *priv = _device_priv(dev); + int r; + uint8_t i; + + USB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request + PUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL; // actual request + PUSB_CONFIGURATION_DESCRIPTOR cd_data = NULL; + + if (dev->num_configurations == 0) + return LIBUSB_ERROR_INVALID_PARAM; + + priv->config_descriptor = (unsigned char**) calloc(dev->num_configurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); + if (priv->config_descriptor == NULL) + return LIBUSB_ERROR_NO_MEM; + for (i=0; inum_configurations; i++) + priv->config_descriptor[i] = NULL; + + for (i=0, r=LIBUSB_SUCCESS; ; i++) + { + // safe loop: release all dynamic resources + safe_free(cd_buf_actual); + + // safe loop: end of loop condition + if ((i >= dev->num_configurations) || (r != LIBUSB_SUCCESS)) + break; + + size = sizeof(USB_CONFIGURATION_DESCRIPTOR_SHORT); + memset(&cd_buf_short, 0, size); + + cd_buf_short.req.ConnectionIndex = (ULONG)priv->port; + cd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_short.req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; + cd_buf_short.req.SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; + cd_buf_short.req.SetupPacket.wIndex = i; + cd_buf_short.req.SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); + + // Dummy call to get the required data size + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size, + &cd_buf_short, size, &ret_size, NULL)) { + usbi_err(ctx, "could not access configuration descriptor (dummy) for '%s': %s", device_id, windows_error_str(0)); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + if ((ret_size != size) || (cd_buf_short.data.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) { + usbi_err(ctx, "unexpected configuration descriptor size (dummy) for '%s'.", device_id); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + size = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.data.wTotalLength; + if ((cd_buf_actual = (PUSB_DESCRIPTOR_REQUEST) calloc(1, size)) == NULL) { + usbi_err(ctx, "could not allocate configuration descriptor buffer for '%s'.", device_id); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + memset(cd_buf_actual, 0, size); + + // Actual call + cd_buf_actual->ConnectionIndex = (ULONG)priv->port; + cd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_actual->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; + cd_buf_actual->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; + cd_buf_actual->SetupPacket.wIndex = i; + cd_buf_actual->SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); + + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size, + cd_buf_actual, size, &ret_size, NULL)) { + usbi_err(ctx, "could not access configuration descriptor (actual) for '%s': %s", device_id, windows_error_str(0)); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + cd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR*)cd_buf_actual+sizeof(USB_DESCRIPTOR_REQUEST)); + + if ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.data.wTotalLength)) { + usbi_err(ctx, "unexpected configuration descriptor size (actual) for '%s'.", device_id); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + if (cd_data->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE) { + usbi_err(ctx, "not a configuration descriptor for '%s'", device_id); + LOOP_BREAK(LIBUSB_ERROR_IO); + } + + usbi_dbg("cached config descriptor %d (bConfigurationValue=%d, %d bytes)", + i, cd_data->bConfigurationValue, cd_data->wTotalLength); + + // Cache the descriptor + priv->config_descriptor[i] = (unsigned char*) calloc(1, cd_data->wTotalLength); + if (priv->config_descriptor[i] == NULL) + return LIBUSB_ERROR_NO_MEM; + memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength); + } + return LIBUSB_SUCCESS; +} + +/* + * Populate a libusb device structure + */ +static int init_device(struct libusb_device* dev, struct libusb_device* parent_dev, + uint8_t port_number, char* device_id, DWORD devinst) +{ + HANDLE handle; + DWORD size; + USB_NODE_CONNECTION_INFORMATION_EX conn_info; + struct windows_device_priv *priv, *parent_priv; + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device* tmp_dev; + unsigned i; + + if ((dev == NULL) || (parent_dev == NULL)) { + return LIBUSB_ERROR_NOT_FOUND; + } + priv = _device_priv(dev); + parent_priv = _device_priv(parent_dev); + if (parent_priv->apib->id != USB_API_HUB) { + usbi_warn(ctx, "parent for device '%s' is not a hub", device_id); + return LIBUSB_ERROR_NOT_FOUND; + } + + // It is possible for the parent hub not to have been initialized yet + // If that's the case, lookup the ancestors to set the bus number + if (parent_dev->bus_number == 0) { + for (i=2; ; i++) { + tmp_dev = usbi_get_device_by_session_id(ctx, get_ancestor_session_id(devinst, i)); + if (tmp_dev == NULL) break; + if (tmp_dev->bus_number != 0) { + usbi_dbg("got bus number from ancestor #%d", i); + parent_dev->bus_number = tmp_dev->bus_number; + break; + } + } + } + if (parent_dev->bus_number == 0) { + usbi_err(ctx, "program assertion failed: unable to find ancestor bus number for '%s'", device_id); + return LIBUSB_ERROR_NOT_FOUND; + } + dev->bus_number = parent_dev->bus_number; + priv->port = port_number; + priv->depth = parent_priv->depth + 1; + priv->parent_dev = parent_dev; + + // If the device address is already set, we can stop here + if (dev->device_address != 0) { + return LIBUSB_SUCCESS; + } + memset(&conn_info, 0, sizeof(conn_info)); + if (priv->depth != 0) { // Not a HCD hub + handle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, NULL); + if (handle == INVALID_HANDLE_VALUE) { + usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + size = sizeof(conn_info); + conn_info.ConnectionIndex = (ULONG)port_number; + if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size, + &conn_info, size, &size, NULL)) { + usbi_warn(ctx, "could not get node connection information for device '%s': %s", + device_id, windows_error_str(0)); + safe_closehandle(handle); + return LIBUSB_ERROR_NO_DEVICE; + } + if (conn_info.ConnectionStatus == NoDeviceConnected) { + usbi_err(ctx, "device '%s' is no longer connected!", device_id); + safe_closehandle(handle); + return LIBUSB_ERROR_NO_DEVICE; + } + memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR)); + dev->num_configurations = priv->dev_descriptor.bNumConfigurations; + priv->active_config = conn_info.CurrentConfigurationValue; + usbi_dbg("found %d configurations (active conf: %d)", dev->num_configurations, priv->active_config); + // If we can't read the config descriptors, just set the number of confs to zero + if (cache_config_descriptors(dev, handle, device_id) != LIBUSB_SUCCESS) { + dev->num_configurations = 0; + priv->dev_descriptor.bNumConfigurations = 0; + } + safe_closehandle(handle); + + if (conn_info.DeviceAddress > UINT8_MAX) { + usbi_err(ctx, "program assertion failed: device address overflow"); + } + dev->device_address = (uint8_t)conn_info.DeviceAddress; + switch (conn_info.Speed) { + case 0: dev->speed = LIBUSB_SPEED_LOW; break; + case 1: dev->speed = LIBUSB_SPEED_FULL; break; + case 2: dev->speed = LIBUSB_SPEED_HIGH; break; + case 3: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(ctx, "Got unknown device speed %d", conn_info.Speed); + break; + } + } else { + dev->device_address = UINT8_MAX; // Hubs from HCD have a devaddr of 255 + force_hcd_device_descriptor(dev); + } + + usbi_dbg("(bus: %d, addr: %d, depth: %d, port: %d): '%s'", + dev->bus_number, dev->device_address, priv->depth, priv->port, device_id); + + return LIBUSB_SUCCESS; +} + +// Returns the api type, or 0 if not found/unsupported +static uint8_t get_api_type(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data) +{ + // Precedence for filter drivers vs driver is in the order of this array + struct driver_lookup lookup[3] = { + {"\0\0", SPDRP_SERVICE, "driver"}, + {"\0\0", SPDRP_UPPERFILTERS, "upper filter driver"}, + {"\0\0", SPDRP_LOWERFILTERS, "lower filter driver"} + }; + DWORD size, reg_type; + unsigned k, l; + uint8_t api; + + // Check the service & filter names to know the API we should use + for (k=0; k<3; k++) { + if (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop, + ®_type, (BYTE*)lookup[k].list, MAX_KEY_LENGTH, &size)) { + // Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ + if (lookup[k].reg_prop == SPDRP_SERVICE) { + // our buffers are MAX_KEY_LENGTH+1 so we can overflow if needed + lookup[k].list[safe_strlen(lookup[k].list)+1] = 0; + } + // MULTI_SZ is a pain to work with. Turn it into something much more manageable + // NB: none of the driver names we check against contain LIST_SEPARATOR, + // (currently ';'), so even if an unsuported one does, it's not an issue + for (l=0; (lookup[k].list[l] != 0) || (lookup[k].list[l+1] != 0); l++) { + if (lookup[k].list[l] == 0) { + lookup[k].list[l] = LIST_SEPARATOR; + } + } + upperize(lookup[k].list); + usbi_dbg("%s(s): %s", lookup[k].designation, lookup[k].list); + } else { + if (GetLastError() != ERROR_INVALID_DATA) { + usbi_dbg("could not access %s: %s", lookup[k].designation, windows_error_str(0)); + } + lookup[k].list[0] = 0; + } + } + + for (api=1; api= 3) continue; + return api; + } + return 0; +} + +static int set_composite_interface(struct libusb_context* ctx, struct libusb_device* dev, + char* dev_interface_path, char* device_id, uint8_t api) +{ + unsigned i; + struct windows_device_priv *priv = _device_priv(dev); + int interface_number; + + if (priv->apib->id != USB_API_COMPOSITE) { + usbi_err(ctx, "program assertion failed: '%s' is not composite", device_id); + return LIBUSB_ERROR_NO_DEVICE; + } + + // Because MI_## are not necessarily in sequential order (some composite + // devices will have only MI_00 & MI_03 for instance), we retrieve the actual + // interface number from the path's MI value + interface_number = 0; + for (i=0; device_id[i] != 0; ) { + if ( (device_id[i++] == 'M') && (device_id[i++] == 'I') + && (device_id[i++] == '_') ) { + interface_number = (device_id[i++] - '0')*10; + interface_number += device_id[i] - '0'; + break; + } + } + + if (device_id[i] == 0) { + usbi_warn(ctx, "failure to read interface number for %s. Using default value %d", + device_id, interface_number); + } + + if (priv->usb_interface[interface_number].path != NULL) { + usbi_warn(ctx, "interface[%d] already set - ignoring: %s", interface_number, device_id); + return LIBUSB_ERROR_ACCESS; + } + + usbi_dbg("interface[%d] = %s", interface_number, dev_interface_path); + priv->usb_interface[interface_number].path = dev_interface_path; + priv->usb_interface[interface_number].apib = &usb_api_backend[api]; + priv->composite_api_flags |= 1<DevicePath); + if (dev_interface_path == NULL) { + usbi_warn(ctx, "could not sanitize device interface path for '%s'", dev_interface_details->DevicePath); + continue; + } + } + } else { + // Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are + // being listed under the "NUSB3" PnP Symbolic Name rather than "USB" + while ( (class_index < 2) && + (!(b = get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i))) ) { + class_index++; + i = 0; + } + if (!b) break; + } + + // Read the Device ID path. This is what we'll use as UID + // Note that if the device is plugged in a different port or hub, the Device ID changes + if (CM_Get_Device_IDA(dev_info_data.DevInst, path, sizeof(path), 0) != CR_SUCCESS) { + usbi_warn(ctx, "could not read the device id path for devinst %X, skipping", + dev_info_data.DevInst); + continue; + } + dev_id_path = sanitize_path(path); + if (dev_id_path == NULL) { + usbi_warn(ctx, "could not sanitize device id path for devinst %X, skipping", + dev_info_data.DevInst); + continue; + } +#ifdef ENUM_DEBUG + usbi_dbg("PRO: %s", dev_id_path); +#endif + + // The SPDRP_ADDRESS for USB devices is the device port number on the hub + port_nr = 0; + if ((pass >= HUB_PASS) && (pass <= GEN_PASS)) { + if ( (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ADDRESS, + ®_type, (BYTE*)&port_nr, 4, &size)) + || (size != 4) ) { + usbi_warn(ctx, "could not retrieve port number for device '%s', skipping: %s", + dev_id_path, windows_error_str(0)); + continue; + } + } + + // Set API to use or get additional data from generic pass + api = USB_API_UNSUPPORTED; + switch (pass) { + case HCD_PASS: + break; + case GEN_PASS: + // We use the GEN pass to detect driverless devices... + size = sizeof(strbuf); + if (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_DRIVER, + ®_type, (BYTE*)strbuf, size, &size)) { + usbi_info(ctx, "The following device has no driver: '%s'", dev_id_path); + usbi_info(ctx, "libusb will not be able to access it."); + } + // ...and to add the additional device interface GUIDs + key = pSetupDiOpenDevRegKey(dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); + if (key != INVALID_HANDLE_VALUE) { + size = sizeof(guid_string_w); + s = pRegQueryValueExW(key, L"DeviceInterfaceGUIDs", NULL, ®_type, + (BYTE*)guid_string_w, &size); + pRegCloseKey(key); + if (s == ERROR_SUCCESS) { + if (nb_guids >= MAX_ENUM_GUIDS) { + // If this assert is ever reported, grow a GUID table dynamically + usbi_err(ctx, "program assertion failed: too many GUIDs"); + LOOP_BREAK(LIBUSB_ERROR_OVERFLOW); + } + if_guid = (GUID*) calloc(1, sizeof(GUID)); + pCLSIDFromString(guid_string_w, if_guid); + guid[nb_guids++] = if_guid; + usbi_dbg("extra GUID: %s", guid_to_string(if_guid)); + } + } + break; + default: + // Get the API type (after checking that the driver installation is OK) + if ( (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_INSTALL_STATE, + ®_type, (BYTE*)&install_state, 4, &size)) + || (size != 4) ){ + usbi_warn(ctx, "could not detect installation state of driver for '%s': %s", + dev_id_path, windows_error_str(0)); + } else if (install_state != 0) { + usbi_warn(ctx, "driver for device '%s' is reporting an issue (code: %d) - skipping", + dev_id_path, install_state); + continue; + } + api = get_api_type(ctx, &dev_info, &dev_info_data); + break; + } + + // Find parent device (for the passes that need it) + switch (pass) { + case HCD_PASS: + case DEV_PASS: + case HUB_PASS: + break; + default: + // Go through the ancestors until we see a face we recognize + parent_dev = NULL; + for (ancestor = 1; parent_dev == NULL; ancestor++) { + session_id = get_ancestor_session_id(dev_info_data.DevInst, ancestor); + if (session_id == 0) { + break; + } + parent_dev = usbi_get_device_by_session_id(ctx, session_id); + } + if (parent_dev == NULL) { + usbi_dbg("unlisted ancestor for '%s' (newly connected, etc.) - ignoring", dev_id_path); + continue; + } + parent_priv = _device_priv(parent_dev); + // virtual USB devices are also listed during GEN - don't process these yet + if ( (pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB) ) { + continue; + } + break; + } + + // Create new or match existing device, using the (hashed) device_id as session id + if (pass <= DEV_PASS) { // For subsequent passes, we'll lookup the parent + // These are the passes that create "new" devices + session_id = htab_hash(dev_id_path); + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + if (pass == DEV_PASS) { + // This can occur if the OS only reports a newly plugged device after we started enum + usbi_warn(ctx, "'%s' was only detected in late pass (newly connected device?)" + " - ignoring", dev_id_path); + continue; + } + usbi_dbg("allocating new device for session [%X]", session_id); + if ((dev = usbi_alloc_device(ctx, session_id)) == NULL) { + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + windows_device_priv_init(dev); + // Keep track of devices that need unref + unref_list[unref_cur++] = dev; + if (unref_cur >= unref_size) { + unref_size += 64; + unref_list = realloc(unref_list, unref_size*sizeof(libusb_device*)); + if (unref_list == NULL) { + usbi_err(ctx, "could not realloc list for unref - aborting."); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + } + } else { + usbi_dbg("found existing device for session [%X] (%d.%d)", + session_id, dev->bus_number, dev->device_address); + } + priv = _device_priv(dev); + } + + // Setup device + switch (pass) { + case HCD_PASS: + dev->bus_number = (uint8_t)(i + 1); // bus 0 is reserved for disconnected + dev->device_address = 0; + dev->num_configurations = 0; + priv->apib = &usb_api_backend[USB_API_HUB]; + priv->depth = UINT8_MAX; // Overflow to 0 for HCD Hubs + priv->path = dev_interface_path; dev_interface_path = NULL; + break; + case HUB_PASS: + case DEV_PASS: + // If the device has already been setup, don't do it again + if (priv->path != NULL) + break; + // Take care of API initialization + priv->path = dev_interface_path; dev_interface_path = NULL; + priv->apib = &usb_api_backend[api]; + switch(api) { + case USB_API_COMPOSITE: + case USB_API_HUB: + break; + default: + // For other devices, the first interface is the same as the device + priv->usb_interface[0].path = (char*) calloc(safe_strlen(priv->path)+1, 1); + if (priv->usb_interface[0].path != NULL) { + safe_strcpy(priv->usb_interface[0].path, safe_strlen(priv->path)+1, priv->path); + } else { + usbi_warn(ctx, "could not duplicate interface path '%s'", priv->path); + } + // The following is needed if we want API calls to work for both simple + // and composite devices. + for(j=0; jusb_interface[j].apib = &usb_api_backend[api]; + } + break; + } + break; + case GEN_PASS: + r = init_device(dev, parent_dev, (uint8_t)port_nr, dev_id_path, dev_info_data.DevInst); + if (r == LIBUSB_SUCCESS) { + // Append device to the list of discovered devices + discdevs = discovered_devs_append(*_discdevs, dev); + if (!discdevs) { + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + *_discdevs = discdevs; + } else if (r == LIBUSB_ERROR_NO_DEVICE) { + // This can occur if the device was disconnected but Windows hasn't + // refreshed its enumeration yet - in that case, we ignore the device + r = LIBUSB_SUCCESS; + } + break; + default: // later passes + if (parent_priv->apib->id == USB_API_COMPOSITE) { + usbi_dbg("setting composite interface for [%lX]:", parent_dev->session_data); + switch (set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id_path, api)) { + case LIBUSB_SUCCESS: + dev_interface_path = NULL; + break; + case LIBUSB_ERROR_ACCESS: + // interface has already been set => make sure dev_interface_path is freed then + break; + default: + LOOP_BREAK(r); + break; + } + } + break; + } + } + } + + // Free any additional GUIDs + for (pass = DEV_PASS+1; pass < nb_guids; pass++) { + safe_free(guid[pass]); + } + + // Unref newly allocated devs + for (i=0; i any concurent wait stalls until the semaphore release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + CloseHandle(semaphore); + return; + } + + // Only works if exits and inits are balanced exactly + if (--concurrent_usage < 0) { // Last exit + for (i=0; idev_descriptor), DEVICE_DESC_LENGTH); + *host_endian = 0; + + return LIBUSB_SUCCESS; +} + +static int windows_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_device_priv *priv = _device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + // config index is zero based + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL)) + return LIBUSB_ERROR_NOT_FOUND; + + config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[config_index]; + + size = min(config_header->wTotalLength, len); + memcpy(buffer, priv->config_descriptor[config_index], size); + + return LIBUSB_SUCCESS; +} + +/* + * return the cached copy of the active config descriptor + */ +static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_device_priv *priv = _device_priv(dev); + + if (priv->active_config == 0) + return LIBUSB_ERROR_NOT_FOUND; + + // config index is zero based + return windows_get_config_descriptor(dev, (uint8_t)(priv->active_config-1), buffer, len, host_endian); +} + +static int windows_open(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + if (priv->apib == NULL) { + usbi_err(ctx, "program assertion failed - device is not initialized"); + return LIBUSB_ERROR_NO_DEVICE; + } + + return priv->apib->open(dev_handle); +} + +static void windows_close(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + priv->apib->close(dev_handle); +} + +static int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + if (priv->active_config == 0) { + *config = 0; + return LIBUSB_ERROR_NOT_FOUND; + } + + *config = priv->active_config; + return LIBUSB_SUCCESS; +} + +/* + * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: "The port driver + * does not currently expose a service that allows higher-level drivers to set + * the configuration." + */ +static int windows_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_SUCCESS; + + if (config >= USB_MAXCONFIG) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT | + LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE, + LIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config, + 0, NULL, 0, 1000); + + if (r == LIBUSB_SUCCESS) { + priv->active_config = (uint8_t)config; + } + return r; +} + +static int windows_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + int r = LIBUSB_SUCCESS; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + if (iface >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints= 0; + + r = priv->apib->claim_interface(dev_handle, iface); + + if (r == LIBUSB_SUCCESS) { + r = windows_assign_endpoints(dev_handle, iface, 0); + } + + return r; +} + +static int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + int r = LIBUSB_SUCCESS; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints= 0; + + r = priv->apib->set_interface_altsetting(dev_handle, iface, altsetting); + + if (r == LIBUSB_SUCCESS) { + r = windows_assign_endpoints(dev_handle, iface, altsetting); + } + + return r; +} + +static int windows_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + return priv->apib->release_interface(dev_handle, iface); +} + +static int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->apib->clear_halt(dev_handle, endpoint); +} + +static int windows_reset_device(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->apib->reset_device(dev_handle); +} + +// The 3 functions below are unlikely to ever get supported on Windows +static int windows_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int windows_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void windows_destroy_device(struct libusb_device *dev) +{ + windows_device_priv_release(dev); +} + +static void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + + usbi_free_fd(transfer_priv->pollable_fd.fd); + // When auto claim is in use, attempt to release the auto-claimed interface + auto_release(itransfer); +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_bulk_transfer(itransfer); + if (r != LIBUSB_SUCCESS) { + return r; + } + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, + (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + return LIBUSB_SUCCESS; +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_iso_transfer(itransfer); + if (r != LIBUSB_SUCCESS) { + return r; + } + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, + (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + return LIBUSB_SUCCESS; +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_control_transfer(itransfer); + if (r != LIBUSB_SUCCESS) { + return r; + } + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); + + return LIBUSB_SUCCESS; + +} + +static int windows_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) + return LIBUSB_ERROR_NOT_SUPPORTED; + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int windows_abort_control(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->apib->abort_control(itransfer); +} + +static int windows_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->apib->abort_transfers(itransfer); +} + +static int windows_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return windows_abort_control(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return windows_abort_transfers(itransfer); + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int status; + + usbi_dbg("handling I/O completion with errcode %d", io_result); + + switch(io_result) { + case NO_ERROR: + status = priv->apib->copy_transfer_data(itransfer, io_size); + break; + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + } else { + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + } + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error: %s", windows_error_str(0)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + windows_clear_transfer_priv(itransfer); // Cancel polling + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); +} + +static void windows_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + windows_transfer_callback (itransfer, io_result, io_size); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + struct windows_transfer_priv* transfer_priv = NULL; + POLL_NFDS_TYPE i = 0; + bool found = false; + struct usbi_transfer *transfer; + DWORD io_size, io_result; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) { + continue; + } + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + usbi_mutex_lock(&ctx->flying_transfers_lock); + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + transfer_priv = usbi_transfer_get_os_priv(transfer); + if (transfer_priv->pollable_fd.fd == fds[i].fd) { + found = true; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found) { + // Handle async requests that completed synchronously first + if (HasOverlappedIoCompletedSync(transfer_priv->pollable_fd.overlapped)) { + io_result = NO_ERROR; + io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; + // Regular async overlapped + } else if (GetOverlappedResult(transfer_priv->pollable_fd.handle, + transfer_priv->pollable_fd.overlapped, &io_size, false)) { + io_result = NO_ERROR; + } else { + io_result = GetLastError(); + } + usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + windows_handle_callback(transfer, io_result, io_size); + } else { + usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + return LIBUSB_SUCCESS; +} + +/* + * Monotonic and real time functions + */ +unsigned __stdcall windows_clock_gettime_threaded(void* param) +{ + LARGE_INTEGER hires_counter, li_frequency; + LONG nb_responses; + int timer_index; + + // Init - find out if we have access to a monotonic (hires) timer + if (!QueryPerformanceFrequency(&li_frequency)) { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } else { + hires_frequency = li_frequency.QuadPart; + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + } + + // Main loop - wait for requests + while (1) { + timer_index = WaitForMultipleObjects(2, timer_request, FALSE, INFINITE) - WAIT_OBJECT_0; + if ( (timer_index != 0) && (timer_index != 1) ) { + usbi_dbg("failure to wait on requests: %s", windows_error_str(0)); + continue; + } + if (request_count[timer_index] == 0) { + // Request already handled + ResetEvent(timer_request[timer_index]); + // There's still a possiblity that a thread sends a request between the + // time we test request_count[] == 0 and we reset the event, in which case + // the request would be ignored. The simple solution to that is to test + // request_count again and process requests if non zero. + if (request_count[timer_index] == 0) + continue; + } + switch (timer_index) { + case 0: + WaitForSingleObject(timer_mutex, INFINITE); + // Requests to this thread are for hires always + if (QueryPerformanceCounter(&hires_counter) != 0) { + timer_tp.tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + timer_tp.tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps); + } else { + // Fallback to real-time if we can't get monotonic value + // Note that real-time clock does not wait on the mutex or this thread. + windows_clock_gettime(USBI_CLOCK_REALTIME, &timer_tp); + } + ReleaseMutex(timer_mutex); + + nb_responses = InterlockedExchange((LONG*)&request_count[0], 0); + if ( (nb_responses) + && (ReleaseSemaphore(timer_response, nb_responses, NULL) == 0) ) { + usbi_dbg("unable to release timer semaphore %d: %s", windows_error_str(0)); + } + continue; + case 1: // time to quit + usbi_dbg("timer thread quitting"); + return 0; + } + } + usbi_dbg("ERROR: broken timer thread"); + return 1; +} + +static int windows_clock_gettime(int clk_id, struct timespec *tp) +{ + FILETIME filetime; + ULARGE_INTEGER rtime; + DWORD r; + switch(clk_id) { + case USBI_CLOCK_MONOTONIC: + if (hires_frequency != 0) { + while (1) { + InterlockedIncrement((LONG*)&request_count[0]); + SetEvent(timer_request[0]); + r = WaitForSingleObject(timer_response, TIMER_REQUEST_RETRY_MS); + switch(r) { + case WAIT_OBJECT_0: + WaitForSingleObject(timer_mutex, INFINITE); + *tp = timer_tp; + ReleaseMutex(timer_mutex); + return LIBUSB_SUCCESS; + case WAIT_TIMEOUT: + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + break; // Retry until successful + default: + usbi_dbg("WaitForSingleObject failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_OTHER; + } + } + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + + +// NB: MSVC6 does not support named initializers. +const struct usbi_os_backend windows_backend = { + "Windows", + windows_init, + windows_exit, + + windows_get_device_list, + windows_open, + windows_close, + + windows_get_device_descriptor, + windows_get_active_config_descriptor, + windows_get_config_descriptor, + + windows_get_configuration, + windows_set_configuration, + windows_claim_interface, + windows_release_interface, + + windows_set_interface_altsetting, + windows_clear_halt, + windows_reset_device, + + windows_kernel_driver_active, + windows_detach_kernel_driver, + windows_attach_kernel_driver, + + windows_destroy_device, + + windows_submit_transfer, + windows_cancel_transfer, + windows_clear_transfer_priv, + + windows_handle_events, + + windows_clock_gettime, +#if defined(USBI_TIMERFD_AVAILABLE) + NULL, +#endif + sizeof(struct windows_device_priv), + sizeof(struct windows_device_handle_priv), + sizeof(struct windows_transfer_priv), + 0, +}; + + +/* + * USB API backends + */ +static int unsupported_init(struct libusb_context *ctx) { + return LIBUSB_SUCCESS; +} +static int unsupported_exit(void) { + return LIBUSB_SUCCESS; +} +static int unsupported_open(struct libusb_device_handle *dev_handle) { + PRINT_UNSUPPORTED_API(open); +} +static void unsupported_close(struct libusb_device_handle *dev_handle) { + usbi_dbg("unsupported API call for 'close'"); +} +static int unsupported_claim_interface(struct libusb_device_handle *dev_handle, int iface) { + PRINT_UNSUPPORTED_API(claim_interface); +} +static int unsupported_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) { + PRINT_UNSUPPORTED_API(set_interface_altsetting); +} +static int unsupported_release_interface(struct libusb_device_handle *dev_handle, int iface) { + PRINT_UNSUPPORTED_API(release_interface); +} +static int unsupported_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) { + PRINT_UNSUPPORTED_API(clear_halt); +} +static int unsupported_reset_device(struct libusb_device_handle *dev_handle) { + PRINT_UNSUPPORTED_API(reset_device); +} +static int unsupported_submit_bulk_transfer(struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(submit_bulk_transfer); +} +static int unsupported_submit_iso_transfer(struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(submit_iso_transfer); +} +static int unsupported_submit_control_transfer(struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(submit_control_transfer); +} +static int unsupported_abort_control(struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(abort_control); +} +static int unsupported_abort_transfers(struct usbi_transfer *itransfer) { + PRINT_UNSUPPORTED_API(abort_transfers); +} +static int unsupported_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) { + PRINT_UNSUPPORTED_API(copy_transfer_data); +} + +// These names must be uppercase +const char* hub_driver_names[] = {"USBHUB", "USBHUB3", "NUSB3HUB", "FLXHCIH", "TIHUB3", "ETRONHUB3", "VIAHUB3", "ASMTHUB3"}; +const char* composite_driver_names[] = {"USBCCGP"}; +const char* winusb_driver_names[] = {"WINUSB"}; +const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { + { + USB_API_UNSUPPORTED, + "Unsupported API", + &CLASS_GUID_UNSUPPORTED, + NULL, + 0, + unsupported_init, + unsupported_exit, + unsupported_open, + unsupported_close, + unsupported_claim_interface, + unsupported_set_interface_altsetting, + unsupported_release_interface, + unsupported_clear_halt, + unsupported_reset_device, + unsupported_submit_bulk_transfer, + unsupported_submit_iso_transfer, + unsupported_submit_control_transfer, + unsupported_abort_control, + unsupported_abort_transfers, + unsupported_copy_transfer_data, + }, { + USB_API_HUB, + "HUB API", + &CLASS_GUID_UNSUPPORTED, + hub_driver_names, + sizeof(hub_driver_names)/sizeof(hub_driver_names[0]), + unsupported_init, + unsupported_exit, + unsupported_open, + unsupported_close, + unsupported_claim_interface, + unsupported_set_interface_altsetting, + unsupported_release_interface, + unsupported_clear_halt, + unsupported_reset_device, + unsupported_submit_bulk_transfer, + unsupported_submit_iso_transfer, + unsupported_submit_control_transfer, + unsupported_abort_control, + unsupported_abort_transfers, + unsupported_copy_transfer_data, + }, { + USB_API_COMPOSITE, + "Composite API", + &CLASS_GUID_COMPOSITE, + composite_driver_names, + sizeof(composite_driver_names)/sizeof(composite_driver_names[0]), + composite_init, + composite_exit, + composite_open, + composite_close, + composite_claim_interface, + composite_set_interface_altsetting, + composite_release_interface, + composite_clear_halt, + composite_reset_device, + composite_submit_bulk_transfer, + composite_submit_iso_transfer, + composite_submit_control_transfer, + composite_abort_control, + composite_abort_transfers, + composite_copy_transfer_data, + }, { + USB_API_WINUSB, + "WinUSB API", + &CLASS_GUID_LIBUSB_WINUSB, + winusb_driver_names, + sizeof(winusb_driver_names)/sizeof(winusb_driver_names[0]), + winusb_init, + winusb_exit, + winusb_open, + winusb_close, + winusb_claim_interface, + winusb_set_interface_altsetting, + winusb_release_interface, + winusb_clear_halt, + winusb_reset_device, + winusb_submit_bulk_transfer, + unsupported_submit_iso_transfer, + winusb_submit_control_transfer, + winusb_abort_control, + winusb_abort_transfers, + winusb_copy_transfer_data, + }, +}; + + +/* + * WinUSB API functions + */ +static int winusb_init(struct libusb_context *ctx) +{ + DLL_LOAD(winusb.dll, WinUsb_Initialize, TRUE); + DLL_LOAD(winusb.dll, WinUsb_Free, TRUE); + DLL_LOAD(winusb.dll, WinUsb_GetAssociatedInterface, TRUE); + DLL_LOAD(winusb.dll, WinUsb_GetDescriptor, TRUE); + DLL_LOAD(winusb.dll, WinUsb_QueryInterfaceSettings, TRUE); + DLL_LOAD(winusb.dll, WinUsb_QueryDeviceInformation, TRUE); + DLL_LOAD(winusb.dll, WinUsb_SetCurrentAlternateSetting, TRUE); + DLL_LOAD(winusb.dll, WinUsb_GetCurrentAlternateSetting, TRUE); + DLL_LOAD(winusb.dll, WinUsb_QueryPipe, TRUE); + DLL_LOAD(winusb.dll, WinUsb_SetPipePolicy, TRUE); + DLL_LOAD(winusb.dll, WinUsb_GetPipePolicy, TRUE); + DLL_LOAD(winusb.dll, WinUsb_ReadPipe, TRUE); + DLL_LOAD(winusb.dll, WinUsb_WritePipe, TRUE); + DLL_LOAD(winusb.dll, WinUsb_ControlTransfer, TRUE); + DLL_LOAD(winusb.dll, WinUsb_ResetPipe, TRUE); + DLL_LOAD(winusb.dll, WinUsb_AbortPipe, TRUE); + DLL_LOAD(winusb.dll, WinUsb_FlushPipe, TRUE); + + api_winusb_available = true; + return LIBUSB_SUCCESS; +} + +static int winusb_exit(void) +{ + return LIBUSB_SUCCESS; +} + +// NB: open and close must ensure that they only handle interface of +// the right API type, as these functions can be called wholesale from +// composite_open(), with interfaces belonging to different APIs +static int winusb_open(struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + + HANDLE file_handle; + int i; + + CHECK_WINUSB_AVAILABLE; + + // WinUSB requires a seperate handle for each interface + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ( (priv->usb_interface[i].path != NULL) + && (priv->usb_interface[i].apib->id == USB_API_WINUSB) ) { + file_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not open device %s (interface %d): %s", priv->usb_interface[i].path, i, windows_error_str(0)); + switch(GetLastError()) { + case ERROR_FILE_NOT_FOUND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ACCESS_DENIED: + return LIBUSB_ERROR_ACCESS; + default: + return LIBUSB_ERROR_IO; + } + } + handle_priv->interface_handle[i].dev_handle = file_handle; + } + } + + return LIBUSB_SUCCESS; +} + +static void winusb_close(struct libusb_device_handle *dev_handle) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE file_handle; + int i; + + if (!api_winusb_available) + return; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (priv->usb_interface[i].apib->id == USB_API_WINUSB) { + file_handle = handle_priv->interface_handle[i].dev_handle; + if ( (file_handle != 0) && (file_handle != INVALID_HANDLE_VALUE)) { + CloseHandle(file_handle); + } + } + } +} + +static int winusb_configure_endpoints(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle; + UCHAR policy; + ULONG timeout = 0; + uint8_t endpoint_address; + int i; + + CHECK_WINUSB_AVAILABLE; + + // With handle and enpoints set (in parent), we can setup the default pipe properties + // see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx + for (i=-1; iusb_interface[iface].nb_endpoints; i++) { + endpoint_address =(i==-1)?0:priv->usb_interface[iface].endpoint[i]; + if (!WinUsb_SetPipePolicy(winusb_handle, endpoint_address, + PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout)) { + usbi_dbg("failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X", endpoint_address); + } + if (i == -1) continue; // Other policies don't apply to control endpoint + policy = false; + if (!WinUsb_SetPipePolicy(winusb_handle, endpoint_address, + SHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to disable SHORT_PACKET_TERMINATE for endpoint %02X", endpoint_address); + } + if (!WinUsb_SetPipePolicy(winusb_handle, endpoint_address, + IGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to disable IGNORE_SHORT_PACKETS for endpoint %02X", endpoint_address); + } + if (!WinUsb_SetPipePolicy(winusb_handle, endpoint_address, + ALLOW_PARTIAL_READS, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to disable ALLOW_PARTIAL_READS for endpoint %02X", endpoint_address); + } + policy = true; + if (!WinUsb_SetPipePolicy(winusb_handle, endpoint_address, + AUTO_CLEAR_STALL, sizeof(UCHAR), &policy)) { + usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address); + } + } + + return LIBUSB_SUCCESS; +} + +static int winusb_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + bool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE); + HANDLE file_handle, winusb_handle; + + CHECK_WINUSB_AVAILABLE; + + // If the device is composite, but using the default Windows composite parent driver (usbccgp) + // or if it's the first WinUSB interface, we get a handle through WinUsb_Initialize(). + if ((is_using_usbccgp) || (iface == 0)) { + // composite device (independent interfaces) or interface 0 + file_handle = handle_priv->interface_handle[iface].dev_handle; + if ((file_handle == 0) || (file_handle == INVALID_HANDLE_VALUE)) { + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!WinUsb_Initialize(file_handle, &winusb_handle)) { + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0)); + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + + switch(GetLastError()) { + case ERROR_BAD_COMMAND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + default: + usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + handle_priv->interface_handle[iface].api_handle = winusb_handle; + } else { + // For all other interfaces, use WinUsb_GetAssociatedInterface() + winusb_handle = handle_priv->interface_handle[0].api_handle; + // It is a requirement for multiple interface devices using WinUSB that you + // must first claim the first interface before you claim any other + if ((winusb_handle == 0) || (winusb_handle == INVALID_HANDLE_VALUE)) { + file_handle = handle_priv->interface_handle[0].dev_handle; + if (WinUsb_Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[0].api_handle = winusb_handle; + usbi_warn(ctx, "auto-claimed interface 0 (required to claim %d with WinUSB)", iface); + } else { + usbi_warn(ctx, "failed to auto-claim interface 0 (required to claim %d with WinUSB)", iface); + return LIBUSB_ERROR_ACCESS; + } + } + if (!WinUsb_GetAssociatedInterface(winusb_handle, (UCHAR)(iface-1), + &handle_priv->interface_handle[iface].api_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + switch(GetLastError()) { + case ERROR_NO_MORE_ITEMS: // invalid iface + return LIBUSB_ERROR_NOT_FOUND; + case ERROR_BAD_COMMAND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ALREADY_EXISTS: // already claimed + return LIBUSB_ERROR_BUSY; + default: + usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + } + usbi_dbg("claimed interface %d", iface); + handle_priv->active_interface = iface; + + return LIBUSB_SUCCESS; +} + +static int winusb_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + HANDLE winusb_handle; + + CHECK_WINUSB_AVAILABLE; + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if ((winusb_handle == 0) || (winusb_handle == INVALID_HANDLE_VALUE)) { + return LIBUSB_ERROR_NOT_FOUND; + } + + WinUsb_Free(winusb_handle); + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + + return LIBUSB_SUCCESS; +} + +/* + * Return the first valid interface (of the same API type), for control transfers + */ +static int winusb_get_valid_interface(struct libusb_device_handle *dev_handle) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + int i; + + for (i=0; iinterface_handle[i].dev_handle != 0) + && (handle_priv->interface_handle[i].dev_handle != INVALID_HANDLE_VALUE) + && (handle_priv->interface_handle[i].api_handle != 0) + && (handle_priv->interface_handle[i].api_handle != INVALID_HANDLE_VALUE) ) { + return i; + } + } + return -1; +} + +/* + * Lookup interface by endpoint address. -1 if not found + */ +static int interface_by_endpoint(struct windows_device_priv *priv, + struct windows_device_handle_priv *handle_priv, uint8_t endpoint_address) +{ + int i, j; + for (i=0; iinterface_handle[i].api_handle == INVALID_HANDLE_VALUE) + continue; + if (handle_priv->interface_handle[i].api_handle == 0) + continue; + if (priv->usb_interface[i].endpoint == NULL) + continue; + for (j=0; jusb_interface[i].nb_endpoints; j++) { + if (priv->usb_interface[i].endpoint[j] == endpoint_address) { + return i; + } + } + } + return -1; +} + +static int winusb_submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv( + transfer->dev_handle); + WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *) transfer->buffer; + ULONG size; + HANDLE winusb_handle; + int current_interface; + struct winfd wfd; + + CHECK_WINUSB_AVAILABLE; + + transfer_priv->pollable_fd = INVALID_WINFD; + size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + if (size > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + current_interface = winusb_get_valid_interface(transfer->dev_handle); + if (current_interface < 0) { + if (auto_claim(transfer, ¤t_interface, USB_API_WINUSB) != LIBUSB_SUCCESS) { + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_dbg("will use interface %d", current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + wfd = usbi_create_fd(winusb_handle, _O_RDONLY); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + // Sending of set configuration control requests from WinUSB creates issues + if ( ((setup->request_type & (0x03 << 5)) == LIBUSB_REQUEST_TYPE_STANDARD) + && (setup->request == LIBUSB_REQUEST_SET_CONFIGURATION) ) { + if (setup->value != priv->active_config) { + usbi_warn(ctx, "cannot set configuration other than the default one"); + usbi_free_fd(wfd.fd); + return LIBUSB_ERROR_INVALID_PARAM; + } + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = 0; + } else { + if (!WinUsb_ControlTransfer(wfd.handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, wfd.overlapped)) { + if(GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "WinUsb_ControlTransfer failed: %s", windows_error_str(0)); + usbi_free_fd(wfd.fd); + return LIBUSB_ERROR_IO; + } + } else { + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)size; + } + } + + // Use priv_transfer to store data needed for async polling + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusb_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + HANDLE winusb_handle; + + CHECK_WINUSB_AVAILABLE; + + if (altsetting > 255) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if ((winusb_handle == 0) || (winusb_handle == INVALID_HANDLE_VALUE)) { + usbi_err(ctx, "interface must be claimed first"); + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!WinUsb_SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) { + usbi_err(ctx, "WinUsb_SetCurrentAlternateSetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int winusb_submit_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + bool ret; + int current_interface; + struct winfd wfd; + + CHECK_WINUSB_AVAILABLE; + + transfer_priv->pollable_fd = INVALID_WINFD; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); + + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + wfd = usbi_create_fd(winusb_handle, IS_XFERIN(transfer) ? _O_RDONLY : _O_WRONLY); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + if (IS_XFERIN(transfer)) { + usbi_dbg("reading %d bytes", transfer->length); + ret = WinUsb_ReadPipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); + } else { + usbi_dbg("writing %d bytes", transfer->length); + ret = WinUsb_WritePipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); + } + if (!ret) { + if(GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "WinUsb_Pipe Transfer failed: %s", windows_error_str(0)); + usbi_free_fd(wfd.fd); + return LIBUSB_ERROR_IO; + } + } else { + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)transfer->length; + } + + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusb_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSB_AVAILABLE; + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUsb_ResetPipe(winusb_handle, endpoint)) { + usbi_err(ctx, "WinUsb_ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed + * through testing as well): + * "You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel + * the control transfer using CancelIo" + */ +static int winusb_abort_control(struct usbi_transfer *itransfer) +{ + // Cancelling of the I/O is done in the parent + return LIBUSB_SUCCESS; +} + +static int winusb_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSB_AVAILABLE; + + current_interface = transfer_priv->interface_number; + if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { + usbi_err(ctx, "program assertion failed: invalid interface_number"); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_dbg("will use interface %d", current_interface); + + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUsb_AbortPipe(winusb_handle, transfer->endpoint)) { + usbi_err(ctx, "WinUsb_AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from the "How to Use WinUSB to Communicate with a USB Device" Microsoft white paper + * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx): + * "WinUSB does not support host-initiated reset port and cycle port operations" and + * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the + * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is + * cycle the pipes (and even then, the control pipe can not be reset using WinUSB) + */ +// TODO (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?) +static int winusb_reset_device(struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct winfd wfd; + HANDLE winusb_handle; + int i, j; + + CHECK_WINUSB_AVAILABLE; + + // Reset any available pipe (except control) + for (i=0; iinterface_handle[i].api_handle; + for (wfd = handle_to_winfd(winusb_handle); wfd.fd > 0;) + { + // Cancel any pollable I/O + usbi_remove_pollfd(ctx, wfd.fd); + usbi_free_fd(wfd.fd); + wfd = handle_to_winfd(winusb_handle); + } + + if ( (winusb_handle != 0) && (winusb_handle != INVALID_HANDLE_VALUE)) { + for (j=0; jusb_interface[i].nb_endpoints; j++) { + usbi_dbg("resetting ep %02X", priv->usb_interface[i].endpoint[j]); + if (!WinUsb_AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) { + usbi_err(ctx, "WinUsb_AbortPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + // FlushPipe seems to fail on OUT pipes + if (IS_EPIN(priv->usb_interface[i].endpoint[j]) + && (!WinUsb_FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) ) { + usbi_err(ctx, "WinUsb_FlushPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + if (!WinUsb_ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) { + usbi_err(ctx, "WinUsb_ResetPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + } + } + } + + return LIBUSB_SUCCESS; +} + +static int winusb_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + + +/* + * Composite API functions + */ +static int composite_init(struct libusb_context *ctx) +{ + return LIBUSB_SUCCESS; +} + +static int composite_exit(void) +{ + return LIBUSB_SUCCESS; +} + +static int composite_open(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + unsigned api; + int r; + uint8_t flag = 1<composite_api_flags & flag) { + r = usb_api_backend[api].open(dev_handle); + if (r != LIBUSB_SUCCESS) { + return r; + } + } + flag <<= 1; + } + return LIBUSB_SUCCESS; +} + +static void composite_close(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + unsigned api; + uint8_t flag = 1<composite_api_flags & flag) { + usb_api_backend[api].close(dev_handle); + } + flag <<= 1; + } +} + +static int composite_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->usb_interface[iface].apib->claim_interface(dev_handle, iface); +} + +static int composite_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->usb_interface[iface].apib->set_interface_altsetting(dev_handle, iface, altsetting); +} + +static int composite_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->usb_interface[iface].apib->release_interface(dev_handle, iface); +} + +static int composite_submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int i; + + for (i=0; iusb_interface[i].path != NULL) { + usbi_dbg("using interface %d", i); + return priv->usb_interface[i].apib->submit_control_transfer(itransfer); + } + } + + usbi_err(ctx, "no libusb supported interfaces to complete request"); + return LIBUSB_ERROR_NOT_FOUND; +} + +static int composite_submit_bulk_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib->submit_bulk_transfer(itransfer); +} + +static int composite_submit_iso_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib->submit_iso_transfer(itransfer); +} + +static int composite_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib->clear_halt(dev_handle, endpoint); +} + +static int composite_abort_control(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib->abort_control(itransfer); +} + +static int composite_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib->abort_transfers(itransfer); +} + +static int composite_reset_device(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + unsigned api; + int r; + uint8_t flag = 1<composite_api_flags & flag) { + r = usb_api_backend[api].reset_device(dev_handle); + if (r != LIBUSB_SUCCESS) { + return r; + } + } + flag <<= 1; + } + return LIBUSB_SUCCESS; +} + +static int composite_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib->copy_transfer_data(itransfer, io_size); +} diff --git a/libusb/libusb/libusb/os/windows_usb.h b/libusb/libusb/libusb/os/windows_usb.h new file mode 100644 index 0000000..ddbd680 --- /dev/null +++ b/libusb/libusb/libusb/os/windows_usb.h @@ -0,0 +1,608 @@ +/* + * Windows backend for libusb 1.0 + * Copyright (C) 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4100) // unreferenced formal parameter +#pragma warning(disable:4214) // bit field types other than int +#pragma warning(disable:4201) // nameless struct/union +#endif + +// Windows API default is uppercase - ugh! +#if !defined(bool) +#define bool BOOL +#endif +#if !defined(true) +#define true TRUE +#endif +#if !defined(false) +#define false FALSE +#endif + +// Missing from MSVC6 setupapi.h +#if !defined(SPDRP_ADDRESS) +#define SPDRP_ADDRESS 28 +#endif +#if !defined(SPDRP_INSTALL_STATE) +#define SPDRP_INSTALL_STATE 34 +#endif + +#if defined(__CYGWIN__ ) +// cygwin produces a warning unless these prototypes are defined +extern int _snprintf(char *buffer, size_t count, const char *format, ...); +extern char *_strdup(const char *strSource); +// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread +#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, f) +#endif +#define safe_free(p) do {if (p != NULL) {free((void*)p); p = NULL;}} while(0) +#define safe_closehandle(h) do {if (h != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0) +#define safe_min(a, b) min((size_t)(a), (size_t)(b)) +#define safe_strcp(dst, dst_max, src, count) do {memcpy(dst, src, safe_min(count, dst_max)); \ + ((char*)dst)[safe_min(count, dst_max)-1] = 0;} while(0) +#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src)+1) +#define safe_strncat(dst, dst_max, src, count) strncat(dst, src, safe_min(count, dst_max - safe_strlen(dst) - 1)) +#define safe_strcat(dst, dst_max, src) safe_strncat(dst, dst_max, src, safe_strlen(src)+1) +#define safe_strcmp(str1, str2) strcmp(((str1==NULL)?"":str1), ((str2==NULL)?"":str2)) +#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"":str1), ((str2==NULL)?"":str2), count) +#define safe_strlen(str) ((str==NULL)?0:strlen(str)) +#define safe_sprintf _snprintf +#define safe_unref_device(dev) do {if (dev != NULL) {libusb_unref_device(dev); dev = NULL;}} while(0) +#define wchar_to_utf8_ms(wstr, str, strlen) WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, strlen, NULL, NULL) +static inline void upperize(char* str) { + size_t i; + if (str == NULL) return; + for (i=0; ios_priv; +} + +static inline void windows_device_priv_init(libusb_device* dev) { + struct windows_device_priv* p = _device_priv(dev); + int i; + p->depth = 0; + p->port = 0; + p->parent_dev = NULL; + p->path = NULL; + p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->composite_api_flags = 0; + p->active_config = 0; + p->config_descriptor = NULL; + memset(&(p->dev_descriptor), 0, sizeof(USB_DEVICE_DESCRIPTOR)); + for (i=0; iusb_interface[i].path = NULL; + p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->usb_interface[i].nb_endpoints = 0; + p->usb_interface[i].endpoint = NULL; + } +} + +static inline void windows_device_priv_release(libusb_device* dev) { + struct windows_device_priv* p = _device_priv(dev); + int i; + safe_free(p->path); + if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { + for (i=0; i < dev->num_configurations; i++) + safe_free(p->config_descriptor[i]); + } + safe_free(p->config_descriptor); + for (i=0; iusb_interface[i].path); + safe_free(p->usb_interface[i].endpoint); + } +} + +struct interface_handle_t { + HANDLE dev_handle; // WinUSB needs an extra handle for the file + HANDLE api_handle; // used by the API to communicate with the device +}; + +struct windows_device_handle_priv { + int active_interface; + struct interface_handle_t interface_handle[USB_MAXINTERFACES]; + int autoclaim_count[USB_MAXINTERFACES]; // For auto-release +}; + +static inline struct windows_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct windows_device_handle_priv *) handle->os_priv; +} + +// used for async polling functions +struct windows_transfer_priv { + struct winfd pollable_fd; + uint8_t interface_number; +}; + +// used to match a device driver (including filter drivers) against a supported API +struct driver_lookup { + char list[MAX_KEY_LENGTH+1];// REG_MULTI_SZ list of services (driver) names + const DWORD reg_prop; // SPDRP registry key to use to retreive list + const char* designation; // internal designation (for debug output) +}; + +/* + * API macros - from libusb-win32 1.x + */ +#define DLL_DECLARE_PREFIXNAME(api, ret, prefixname, name, args) \ + typedef ret (api * __dll_##name##_t)args; \ + static __dll_##name##_t prefixname = NULL + +#define DLL_LOAD_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ + do { \ + HMODULE h = GetModuleHandleA(#dll); \ + if (!h) \ + h = LoadLibraryA(#dll); \ + if (!h) { \ + if (ret_on_failure) { return LIBUSB_ERROR_NOT_FOUND; }\ + else { break; } \ + } \ + prefixname = (__dll_##name##_t)GetProcAddress(h, #name); \ + if (prefixname) break; \ + prefixname = (__dll_##name##_t)GetProcAddress(h, #name "A"); \ + if (prefixname) break; \ + prefixname = (__dll_##name##_t)GetProcAddress(h, #name "W"); \ + if (prefixname) break; \ + if(ret_on_failure) \ + return LIBUSB_ERROR_NOT_FOUND; \ + } while(0) + +#define DLL_DECLARE(api, ret, name, args) DLL_DECLARE_PREFIXNAME(api, ret, name, name, args) +#define DLL_LOAD(dll, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, name, name, ret_on_failure) +#define DLL_DECLARE_PREFIXED(api, ret, prefix, name, args) DLL_DECLARE_PREFIXNAME(api, ret, prefix##name, name, args) +#define DLL_LOAD_PREFIXED(dll, prefix, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, prefix##name, name, ret_on_failure) + +/* OLE32 dependency */ +DLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); + +/* SetupAPI dependencies */ +DLL_DECLARE_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, + const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, + PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); +DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, + PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); +DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); +DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); + +/* + * Windows DDK API definitions. Most of it copied from MinGW's includes + */ +typedef DWORD DEVNODE, DEVINST; +typedef DEVNODE *PDEVNODE, *PDEVINST; +typedef DWORD RETURN_TYPE; +typedef RETURN_TYPE CONFIGRET; + +#define CR_SUCCESS 0x00000000 +#define CR_NO_SUCH_DEVNODE 0x0000000D + +#define USB_DEVICE_DESCRIPTOR_TYPE LIBUSB_DT_DEVICE +#define USB_CONFIGURATION_DESCRIPTOR_TYPE LIBUSB_DT_CONFIG +#define USB_STRING_DESCRIPTOR_TYPE LIBUSB_DT_STRING +#define USB_INTERFACE_DESCRIPTOR_TYPE LIBUSB_DT_INTERFACE +#define USB_ENDPOINT_DESCRIPTOR_TYPE LIBUSB_DT_ENDPOINT + +#define USB_REQUEST_GET_STATUS LIBUSB_REQUEST_GET_STATUS +#define USB_REQUEST_CLEAR_FEATURE LIBUSB_REQUEST_CLEAR_FEATURE +#define USB_REQUEST_SET_FEATURE LIBUSB_REQUEST_SET_FEATURE +#define USB_REQUEST_SET_ADDRESS LIBUSB_REQUEST_SET_ADDRESS +#define USB_REQUEST_GET_DESCRIPTOR LIBUSB_REQUEST_GET_DESCRIPTOR +#define USB_REQUEST_SET_DESCRIPTOR LIBUSB_REQUEST_SET_DESCRIPTOR +#define USB_REQUEST_GET_CONFIGURATION LIBUSB_REQUEST_GET_CONFIGURATION +#define USB_REQUEST_SET_CONFIGURATION LIBUSB_REQUEST_SET_CONFIGURATION +#define USB_REQUEST_GET_INTERFACE LIBUSB_REQUEST_GET_INTERFACE +#define USB_REQUEST_SET_INTERFACE LIBUSB_REQUEST_SET_INTERFACE +#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME + +#define USB_GET_NODE_INFORMATION 258 +#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 +#define USB_GET_NODE_CONNECTION_NAME 261 +#define USB_GET_HUB_CAPABILITIES 271 +#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX) +#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 +#endif +#if !defined(USB_GET_HUB_CAPABILITIES_EX) +#define USB_GET_HUB_CAPABILITIES_EX 276 +#endif + +#ifndef METHOD_BUFFERED +#define METHOD_BUFFERED 0 +#endif +#ifndef FILE_ANY_ACCESS +#define FILE_ANY_ACCESS 0x00000000 +#endif +#ifndef FILE_DEVICE_UNKNOWN +#define FILE_DEVICE_UNKNOWN 0x00000022 +#endif +#ifndef FILE_DEVICE_USB +#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN +#endif + +#ifndef CTL_CODE +#define CTL_CODE(DeviceType, Function, Method, Access)( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) +#endif + +typedef enum USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +typedef enum USB_HUB_NODE { + UsbHub, + UsbMIParent +} USB_HUB_NODE; + +/* Cfgmgr32.dll interface */ +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)); + +#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ + CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_HUB_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_ROOT_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// Most of the structures below need to be packed +#pragma pack(push, 1) + +typedef struct USB_INTERFACE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; +} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; + +typedef struct USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { + struct { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; + } req; + USB_CONFIGURATION_DESCRIPTOR data; +} USB_CONFIGURATION_DESCRIPTOR_SHORT; + +typedef struct USB_ENDPOINT_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bEndpointAddress; + UCHAR bmAttributes; + USHORT wMaxPacketSize; + UCHAR bInterval; +} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; + +typedef struct USB_DESCRIPTOR_REQUEST { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; +// UCHAR Data[0]; +} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; + +typedef struct USB_HUB_DESCRIPTOR { + UCHAR bDescriptorLength; + UCHAR bDescriptorType; + UCHAR bNumberOfPorts; + USHORT wHubCharacteristics; + UCHAR bPowerOnToPowerGood; + UCHAR bHubControlCurrent; + UCHAR bRemoveAndPowerMask[64]; +} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; + +typedef struct USB_ROOT_HUB_NAME { + ULONG ActualLength; + WCHAR RootHubName[1]; +} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; + +typedef struct USB_ROOT_HUB_NAME_FIXED { + ULONG ActualLength; + WCHAR RootHubName[MAX_PATH_LENGTH]; +} USB_ROOT_HUB_NAME_FIXED; + +typedef struct USB_NODE_CONNECTION_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[1]; +} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; + +typedef struct USB_NODE_CONNECTION_NAME_FIXED { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[MAX_PATH_LENGTH]; +} USB_NODE_CONNECTION_NAME_FIXED; + +typedef struct USB_HUB_NAME_FIXED { + union { + USB_ROOT_HUB_NAME_FIXED root; + USB_NODE_CONNECTION_NAME_FIXED node; + } u; +} USB_HUB_NAME_FIXED; + +typedef struct USB_HUB_INFORMATION { + USB_HUB_DESCRIPTOR HubDescriptor; + BOOLEAN HubIsBusPowered; +} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; + +typedef struct USB_MI_PARENT_INFORMATION { + ULONG NumberOfInterfaces; +} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; + +typedef struct USB_NODE_INFORMATION { + USB_HUB_NODE NodeType; + union { + USB_HUB_INFORMATION HubInformation; + USB_MI_PARENT_INFORMATION MiParentInformation; + } u; +} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; + +typedef struct USB_PIPE_INFO { + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + ULONG ScheduleOffset; +} USB_PIPE_INFO, *PUSB_PIPE_INFO; + +typedef struct USB_NODE_CONNECTION_INFORMATION_EX { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + UCHAR Speed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; +// USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; + +typedef struct USB_HUB_CAP_FLAGS { + ULONG HubIsHighSpeedCapable:1; + ULONG HubIsHighSpeed:1; + ULONG HubIsMultiTtCapable:1; + ULONG HubIsMultiTt:1; + ULONG HubIsRoot:1; + ULONG HubIsArmedWakeOnConnect:1; + ULONG ReservedMBZ:26; +} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; + +typedef struct USB_HUB_CAPABILITIES { + ULONG HubIs2xCapable : 1; +} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; + +typedef struct USB_HUB_CAPABILITIES_EX { + USB_HUB_CAP_FLAGS CapabilityFlags; +} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; + +#pragma pack(pop) + +/* winusb.dll interface */ + +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 +#define AUTO_SUSPEND 0x81 +#define SUSPEND_DELAY 0x83 +#define DEVICE_SPEED 0x01 +#define LowSpeed 0x01 +#define FullSpeed 0x02 +#define HighSpeed 0x03 + +typedef enum USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +typedef struct { + USBD_PIPE_TYPE PipeType; + UCHAR PipeId; + USHORT MaximumPacketSize; + UCHAR Interval; +} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION; + +#pragma pack(1) +typedef struct { + UCHAR request_type; + UCHAR request; + USHORT value; + USHORT index; + USHORT length; +} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; +#pragma pack() + +typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; + +DLL_DECLARE(WINAPI, BOOL, WinUsb_Initialize, (HANDLE, PWINUSB_INTERFACE_HANDLE)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_Free, (WINUSB_INTERFACE_HANDLE)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_GetAssociatedInterface, (WINUSB_INTERFACE_HANDLE, UCHAR, PWINUSB_INTERFACE_HANDLE)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_GetDescriptor, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, USHORT, PUCHAR, ULONG, PULONG)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_QueryInterfaceSettings, (WINUSB_INTERFACE_HANDLE, UCHAR, PUSB_INTERFACE_DESCRIPTOR)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_QueryDeviceInformation, (WINUSB_INTERFACE_HANDLE, ULONG, PULONG, PVOID)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_SetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, UCHAR)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_GetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, PUCHAR)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_QueryPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, PWINUSB_PIPE_INFORMATION)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_SetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, ULONG, PVOID)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_GetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, PULONG, PVOID)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_ReadPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_WritePipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_ControlTransfer, (WINUSB_INTERFACE_HANDLE, WINUSB_SETUP_PACKET, PUCHAR, ULONG, PULONG, LPOVERLAPPED)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_ResetPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_AbortPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); +DLL_DECLARE(WINAPI, BOOL, WinUsb_FlushPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); diff --git a/libusb/libusb/libusb/sync.c b/libusb/libusb/libusb/sync.c new file mode 100644 index 0000000..8eed47b --- /dev/null +++ b/libusb/libusb/libusb/sync.c @@ -0,0 +1,314 @@ +/* + * Synchronous I/O functions for libusb + * Copyright (C) 2007-2008 Daniel Drake + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +#include "libusbi.h" + +/** + * @defgroup syncio Synchronous device I/O + * + * This page documents libusb's synchronous (blocking) API for USB device I/O. + * This interface is easy to use but has some limitations. More advanced users + * may wish to consider using the \ref asyncio "asynchronous I/O API" instead. + */ + +static void LIBUSB_CALL ctrl_transfer_cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; + usbi_dbg("actual_length=%d", transfer->actual_length); + /* caller interprets result and frees transfer */ +} + +/** \ingroup syncio + * Perform a USB control transfer. + * + * The direction of the transfer is inferred from the bmRequestType field of + * the setup packet. + * + * The wValue, wIndex and wLength fields values should be given in host-endian + * byte order. + * + * \param dev_handle a handle for the device to communicate with + * \param bmRequestType the request type field for the setup packet + * \param bRequest the request field for the setup packet + * \param wValue the value field for the setup packet + * \param wIndex the index field for the setup packet + * \param data a suitably-sized data buffer for either input or output + * (depending on direction bits within bmRequestType) + * \param wLength the length field for the setup packet. The data buffer should + * be at least this size. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * \returns on success, the number of bytes actually transferred + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out + * \returns LIBUSB_ERROR_PIPE if the control request was not supported by the + * device + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failures + */ +int API_EXPORTED libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout) +{ + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + unsigned char *buffer; + int completed = 0; + int r; + + if (!transfer) + return LIBUSB_ERROR_NO_MEM; + + buffer = malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength); + if (!buffer) { + libusb_free_transfer(transfer); + return LIBUSB_ERROR_NO_MEM; + } + + libusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, + wLength); + if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) + memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength); + + libusb_fill_control_transfer(transfer, dev_handle, buffer, + ctrl_transfer_cb, &completed, timeout); + transfer->flags = LIBUSB_TRANSFER_FREE_BUFFER; + r = libusb_submit_transfer(transfer); + if (r < 0) { + libusb_free_transfer(transfer); + return r; + } + + while (!completed) { + r = libusb_handle_events_completed(HANDLE_CTX(dev_handle), &completed); + if (r < 0) { + if (r == LIBUSB_ERROR_INTERRUPTED) + continue; + libusb_cancel_transfer(transfer); + while (!completed) + if (libusb_handle_events_completed(HANDLE_CTX(dev_handle), &completed) < 0) + break; + libusb_free_transfer(transfer); + return r; + } + } + + if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) + memcpy(data, libusb_control_transfer_get_data(transfer), + transfer->actual_length); + + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + r = transfer->actual_length; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + r = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + r = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + r = LIBUSB_ERROR_NO_DEVICE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + r = LIBUSB_ERROR_OVERFLOW; + break; + default: + usbi_warn(HANDLE_CTX(dev_handle), + "unrecognised status code %d", transfer->status); + r = LIBUSB_ERROR_OTHER; + } + + libusb_free_transfer(transfer); + return r; +} + +static void LIBUSB_CALL bulk_transfer_cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; + usbi_dbg("actual_length=%d", transfer->actual_length); + /* caller interprets results and frees transfer */ +} + +static int do_sync_bulk_transfer(struct libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + int *transferred, unsigned int timeout, unsigned char type) +{ + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + int completed = 0; + int r; + + if (!transfer) + return LIBUSB_ERROR_NO_MEM; + + libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, length, + bulk_transfer_cb, &completed, timeout); + transfer->type = type; + + r = libusb_submit_transfer(transfer); + if (r < 0) { + libusb_free_transfer(transfer); + return r; + } + + while (!completed) { + r = libusb_handle_events_completed(HANDLE_CTX(dev_handle), &completed); + if (r < 0) { + if (r == LIBUSB_ERROR_INTERRUPTED) + continue; + libusb_cancel_transfer(transfer); + while (!completed) + if (libusb_handle_events_completed(HANDLE_CTX(dev_handle), &completed) < 0) + break; + libusb_free_transfer(transfer); + return r; + } + } + + *transferred = transfer->actual_length; + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + r = 0; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + r = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + r = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + r = LIBUSB_ERROR_OVERFLOW; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + r = LIBUSB_ERROR_NO_DEVICE; + break; + default: + usbi_warn(HANDLE_CTX(dev_handle), + "unrecognised status code %d", transfer->status); + r = LIBUSB_ERROR_OTHER; + } + + libusb_free_transfer(transfer); + return r; +} + +/** \ingroup syncio + * Perform a USB bulk transfer. The direction of the transfer is inferred from + * the direction bits of the endpoint address. + * + * For bulk reads, the length field indicates the maximum length of + * data you are expecting to receive. If less data arrives than expected, + * this function will return that data, so be sure to check the + * transferred output parameter. + * + * You should also check the transferred parameter for bulk writes. + * Not all of the data may have been written. + * + * Also check transferred when dealing with a timeout error code. + * libusb may have to split your transfer into a number of chunks to satisfy + * underlying O/S requirements, meaning that the timeout may expire after + * the first few chunks have completed. libusb is careful not to lose any data + * that may have been transferred; do not assume that timeout conditions + * indicate a complete lack of I/O. + * + * \param dev_handle a handle for the device to communicate with + * \param endpoint the address of a valid endpoint to communicate with + * \param data a suitably-sized data buffer for either input or output + * (depending on endpoint) + * \param length for bulk writes, the number of bytes from data to be sent. for + * bulk reads, the maximum number of bytes to receive into the data buffer. + * \param transferred output location for the number of bytes actually + * transferred. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * + * \returns 0 on success (and populates transferred) + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out (and populates + * transferred) + * \returns LIBUSB_ERROR_PIPE if the endpoint halted + * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see + * \ref packetoverflow + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failures + */ +int API_EXPORTED libusb_bulk_transfer(struct libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, int *transferred, + unsigned int timeout) +{ + return do_sync_bulk_transfer(dev_handle, endpoint, data, length, + transferred, timeout, LIBUSB_TRANSFER_TYPE_BULK); +} + +/** \ingroup syncio + * Perform a USB interrupt transfer. The direction of the transfer is inferred + * from the direction bits of the endpoint address. + * + * For interrupt reads, the length field indicates the maximum length + * of data you are expecting to receive. If less data arrives than expected, + * this function will return that data, so be sure to check the + * transferred output parameter. + * + * You should also check the transferred parameter for interrupt + * writes. Not all of the data may have been written. + * + * Also check transferred when dealing with a timeout error code. + * libusb may have to split your transfer into a number of chunks to satisfy + * underlying O/S requirements, meaning that the timeout may expire after + * the first few chunks have completed. libusb is careful not to lose any data + * that may have been transferred; do not assume that timeout conditions + * indicate a complete lack of I/O. + * + * The default endpoint bInterval value is used as the polling interval. + * + * \param dev_handle a handle for the device to communicate with + * \param endpoint the address of a valid endpoint to communicate with + * \param data a suitably-sized data buffer for either input or output + * (depending on endpoint) + * \param length for bulk writes, the number of bytes from data to be sent. for + * bulk reads, the maximum number of bytes to receive into the data buffer. + * \param transferred output location for the number of bytes actually + * transferred. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * + * \returns 0 on success (and populates transferred) + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out + * \returns LIBUSB_ERROR_PIPE if the endpoint halted + * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see + * \ref packetoverflow + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other error + */ +int API_EXPORTED libusb_interrupt_transfer( + struct libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *data, int length, int *transferred, unsigned int timeout) +{ + return do_sync_bulk_transfer(dev_handle, endpoint, data, length, + transferred, timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT); +} + diff --git a/libusb/libusb/libusb/version.h b/libusb/libusb/libusb/version.h new file mode 100644 index 0000000..62446da --- /dev/null +++ b/libusb/libusb/libusb/version.h @@ -0,0 +1,18 @@ +/* This file is parsed by m4 and windres and RC.EXE so please keep it simple. */ +#ifndef LIBUSB_MAJOR +#define LIBUSB_MAJOR 1 +#endif +#ifndef LIBUSB_MINOR +#define LIBUSB_MINOR 0 +#endif +#ifndef LIBUSB_MICRO +#define LIBUSB_MICRO 9 +#endif +/* LIBUSB_NANO may be used for Windows internal versioning. 0 means unused. */ +#ifndef LIBUSB_NANO +#define LIBUSB_NANO 0 +#endif +/* LIBUSB_RC is the release candidate suffix. Should normally be empty. */ +#ifndef LIBUSB_RC +#define LIBUSB_RC "" +#endif diff --git a/libusb/libusb/linux.c b/libusb/libusb/linux.c deleted file mode 100644 index 3a1ce0c..0000000 --- a/libusb/libusb/linux.c +++ /dev/null @@ -1,733 +0,0 @@ -/* - * Linux USB support - * - * Copyright (c) 2000-2003 Johannes Erdfelt - * - * This library is covered by the LGPL, read LICENSE for details. - */ - -#include /* getenv, etc */ -#include -#include -#include -#include -#include -#include -#include - -#include "linux.h" -#include "usbi.h" - -static char usb_path[PATH_MAX + 1] = ""; - -static int device_open(struct usb_device *dev) -{ - char filename[PATH_MAX + 1]; - int fd; - - snprintf(filename, sizeof(filename) - 1, "%s/%s/%s", - usb_path, dev->bus->dirname, dev->filename); - - fd = open(filename, O_RDWR); - if (fd < 0) { - fd = open(filename, O_RDONLY); - if (fd < 0) - USB_ERROR_STR(-errno, "failed to open %s: %s", - filename, strerror(errno)); - } - - return fd; -} - -int usb_os_open(usb_dev_handle *dev) -{ - dev->fd = device_open(dev->device); - - return 0; -} - -int usb_os_close(usb_dev_handle *dev) -{ - if (dev->fd < 0) - return 0; - - if (close(dev->fd) == -1) - /* Failing trying to close a file really isn't an error, so return 0 */ - USB_ERROR_STR(0, "tried to close device fd %d: %s", dev->fd, - strerror(errno)); - - return 0; -} - -int usb_set_configuration(usb_dev_handle *dev, int configuration) -{ - int ret; - - ret = ioctl(dev->fd, IOCTL_USB_SETCONFIG, &configuration); - if (ret < 0) - USB_ERROR_STR(-errno, "could not set config %d: %s", configuration, - strerror(errno)); - - dev->config = configuration; - - return 0; -} - -int usb_claim_interface(usb_dev_handle *dev, int interface) -{ - int ret; - - ret = ioctl(dev->fd, IOCTL_USB_CLAIMINTF, &interface); - if (ret < 0) { - if (errno == EBUSY && usb_debug > 0) - fprintf(stderr, "Check that you have permissions to write to %s/%s and, if you don't, that you set up hotplug (http://linux-hotplug.sourceforge.net/) correctly.\n", dev->bus->dirname, dev->device->filename); - - USB_ERROR_STR(-errno, "could not claim interface %d: %s", interface, - strerror(errno)); - } - - dev->interface = interface; - - return 0; -} - -int usb_release_interface(usb_dev_handle *dev, int interface) -{ - int ret; - - ret = ioctl(dev->fd, IOCTL_USB_RELEASEINTF, &interface); - if (ret < 0) - USB_ERROR_STR(-errno, "could not release intf %d: %s", interface, - strerror(errno)); - - dev->interface = -1; - - return 0; -} - -int usb_set_altinterface(usb_dev_handle *dev, int alternate) -{ - int ret; - struct usb_setinterface setintf; - - if (dev->interface < 0) - USB_ERROR(-EINVAL); - - setintf.interface = dev->interface; - setintf.altsetting = alternate; - - ret = ioctl(dev->fd, IOCTL_USB_SETINTF, &setintf); - if (ret < 0) - USB_ERROR_STR(-errno, "could not set alt intf %d/%d: %s", - dev->interface, alternate, strerror(errno)); - - dev->altsetting = alternate; - - return 0; -} - -/* - * Linux usbfs has a limit of one page size for synchronous bulk read/write. - * 4096 is the most portable maximum we can do for now. - * Linux usbfs has a limit of 16KB for the URB interface. We use this now - * to get better performance for USB 2.0 devices. - */ -#define MAX_READ_WRITE (16 * 1024) - -int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, - int value, int index, char *bytes, int size, int timeout) -{ - struct usb_ctrltransfer ctrl; - int ret; - - ctrl.bRequestType = requesttype; - ctrl.bRequest = request; - ctrl.wValue = value; - ctrl.wIndex = index; - ctrl.wLength = size; - - ctrl.data = bytes; - ctrl.timeout = timeout; - - ret = ioctl(dev->fd, IOCTL_USB_CONTROL, &ctrl); - if (ret < 0) - USB_ERROR_STR(-errno, "error sending control message: %s", strerror(errno)); - - return ret; -} - -#define URB_USERCONTEXT_COOKIE ((void *)0x1) - -/* Reading and writing are the same except for the endpoint */ -static int usb_urb_transfer(usb_dev_handle *dev, int ep, int urbtype, - char *bytes, int size, int timeout) -{ - struct usb_urb urb; - int bytesdone = 0, requested; - struct timeval tv, tv_ref, tv_now; - struct usb_urb *context; - int ret, waiting; - - /* - * HACK: The use of urb.usercontext is a hack to get threaded applications - * sort of working again. Threaded support is still not recommended, but - * this should allow applications to work in the common cases. Basically, - * if we get the completion for an URB we're not waiting for, then we update - * the usercontext pointer to 1 for the other threads URB and it will see - * the change after it wakes up from the the timeout. Ugly, but it works. - */ - - /* - * Get actual time, and add the timeout value. The result is the absolute - * time where we have to quit waiting for an message. - */ - gettimeofday(&tv_ref, NULL); - tv_ref.tv_sec = tv_ref.tv_sec + timeout / 1000; - tv_ref.tv_usec = tv_ref.tv_usec + (timeout % 1000) * 1000; - - if (tv_ref.tv_usec > 1000000) { - tv_ref.tv_usec -= 1000000; - tv_ref.tv_sec++; - } - - do { - fd_set writefds; - - requested = size - bytesdone; - if (requested > MAX_READ_WRITE) - requested = MAX_READ_WRITE; - - urb.type = urbtype; - urb.endpoint = ep; - urb.flags = 0; - urb.buffer = bytes + bytesdone; - urb.buffer_length = requested; - urb.signr = 0; - urb.actual_length = 0; - urb.number_of_packets = 0; /* don't do isochronous yet */ - urb.usercontext = NULL; - - ret = ioctl(dev->fd, IOCTL_USB_SUBMITURB, &urb); - if (ret < 0) { - USB_ERROR_STR(-errno, "error submitting URB: %s", strerror(errno)); - return ret; - } - - FD_ZERO(&writefds); - FD_SET(dev->fd, &writefds); - -restart: - waiting = 1; - context = NULL; - while (!urb.usercontext && ((ret = ioctl(dev->fd, IOCTL_USB_REAPURBNDELAY, &context)) == -1) && waiting) { - tv.tv_sec = 0; - tv.tv_usec = 1000; // 1 msec - select(dev->fd + 1, NULL, &writefds, NULL, &tv); //sub second wait - - if (timeout) { - /* compare with actual time, as the select timeout is not that precise */ - gettimeofday(&tv_now, NULL); - - if ((tv_now.tv_sec > tv_ref.tv_sec) || - ((tv_now.tv_sec == tv_ref.tv_sec) && (tv_now.tv_usec >= tv_ref.tv_usec))) - waiting = 0; - } - } - - if (context && context != &urb) { - context->usercontext = URB_USERCONTEXT_COOKIE; - /* We need to restart since we got a successful URB, but not ours */ - goto restart; - } - - /* - * If there was an error, that wasn't EAGAIN (no completion), then - * something happened during the reaping and we should return that - * error now - */ - if (ret < 0 && !urb.usercontext && errno != EAGAIN) - USB_ERROR_STR(-errno, "error reaping URB: %s", strerror(errno)); - - bytesdone += urb.actual_length; - } while ((ret == 0 || urb.usercontext) && bytesdone < size && urb.actual_length == requested); - - /* If the URB didn't complete in success or error, then let's unlink it */ - if (ret < 0 && !urb.usercontext) { - int rc; - - if (!waiting) - rc = -ETIMEDOUT; - else - rc = urb.status; - - ret = ioctl(dev->fd, IOCTL_USB_DISCARDURB, &urb); - if (ret < 0 && errno != EINVAL && usb_debug >= 1) - fprintf(stderr, "error discarding URB: %s", strerror(errno)); - - /* - * When the URB is unlinked, it gets moved to the completed list and - * then we need to reap it or else the next time we call this function, - * we'll get the previous completion and exit early - */ - ioctl(dev->fd, IOCTL_USB_REAPURB, &context); - - return rc; - } - - return bytesdone; -} - -int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout) -{ - /* Ensure the endpoint address is correct */ - return usb_urb_transfer(dev, ep, USB_URB_TYPE_BULK, bytes, size, - timeout); -} - -int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout) -{ - /* Ensure the endpoint address is correct */ - ep |= USB_ENDPOINT_IN; - return usb_urb_transfer(dev, ep, USB_URB_TYPE_BULK, bytes, size, - timeout); -} - -/* - * FIXME: Packetize large buffers here. 2.4 HCDs (atleast, haven't checked - * 2.5 HCDs yet) don't handle multi-packet Interrupt transfers. So we need - * to lookup the endpoint packet size and packetize appropriately here. - */ -int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout) -{ - /* Ensure the endpoint address is correct */ - return usb_urb_transfer(dev, ep, USB_URB_TYPE_INTERRUPT, bytes, size, - timeout); -} - -int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout) -{ - /* Ensure the endpoint address is correct */ - ep |= USB_ENDPOINT_IN; - return usb_urb_transfer(dev, ep, USB_URB_TYPE_INTERRUPT, bytes, size, - timeout); -} - -int usb_os_find_busses(struct usb_bus **busses) -{ - struct usb_bus *fbus = NULL; - DIR *dir; - struct dirent *entry; - - dir = opendir(usb_path); - if (!dir) - USB_ERROR_STR(-errno, "couldn't opendir(%s): %s", usb_path, - strerror(errno)); - - while ((entry = readdir(dir)) != NULL) { - struct usb_bus *bus; - - /* Skip anything starting with a . */ - if (entry->d_name[0] == '.') - continue; - - if (!strchr("0123456789", entry->d_name[strlen(entry->d_name) - 1])) { - if (usb_debug >= 2) - fprintf(stderr, "usb_os_find_busses: Skipping non bus directory %s\n", - entry->d_name); - continue; - } - - bus = malloc(sizeof(*bus)); - if (!bus) - USB_ERROR(-ENOMEM); - - memset((void *)bus, 0, sizeof(*bus)); - - strncpy(bus->dirname, entry->d_name, sizeof(bus->dirname) - 1); - bus->dirname[sizeof(bus->dirname) - 1] = 0; - - LIST_ADD(fbus, bus); - - if (usb_debug >= 2) - fprintf(stderr, "usb_os_find_busses: Found %s\n", bus->dirname); - } - - closedir(dir); - - *busses = fbus; - - return 0; -} - -int usb_os_find_devices(struct usb_bus *bus, struct usb_device **devices) -{ - struct usb_device *fdev = NULL; - DIR *dir; - struct dirent *entry; - char dirpath[PATH_MAX + 1]; - - snprintf(dirpath, PATH_MAX, "%s/%s", usb_path, bus->dirname); - - dir = opendir(dirpath); - if (!dir) - USB_ERROR_STR(-errno, "couldn't opendir(%s): %s", dirpath, - strerror(errno)); - - while ((entry = readdir(dir)) != NULL) { - unsigned char device_desc[DEVICE_DESC_LENGTH]; - char filename[PATH_MAX + 1]; - struct usb_device *dev; - struct usb_connectinfo connectinfo; - int i, fd, ret; - - /* Skip anything starting with a . */ - if (entry->d_name[0] == '.') - continue; - - dev = malloc(sizeof(*dev)); - if (!dev) - USB_ERROR(-ENOMEM); - - memset((void *)dev, 0, sizeof(*dev)); - - dev->bus = bus; - - strncpy(dev->filename, entry->d_name, sizeof(dev->filename) - 1); - dev->filename[sizeof(dev->filename) - 1] = 0; - - snprintf(filename, sizeof(filename) - 1, "%s/%s", dirpath, entry->d_name); - fd = open(filename, O_RDWR); - if (fd < 0) { - fd = open(filename, O_RDONLY); - if (fd < 0) { - if (usb_debug >= 2) - fprintf(stderr, "usb_os_find_devices: Couldn't open %s\n", - filename); - - free(dev); - continue; - } - } - - /* Get the device number */ - ret = ioctl(fd, IOCTL_USB_CONNECTINFO, &connectinfo); - if (ret < 0) { - if (usb_debug) - fprintf(stderr, "usb_os_find_devices: couldn't get connect info\n"); - } else - dev->devnum = connectinfo.devnum; - - ret = read(fd, (void *)device_desc, DEVICE_DESC_LENGTH); - if (ret < 0) { - if (usb_debug) - fprintf(stderr, "usb_os_find_devices: Couldn't read descriptor\n"); - - free(dev); - - goto err; - } - - /* - * Linux kernel converts the words in this descriptor to CPU endian, so - * we use the undocumented W character for usb_parse_descriptor() that - * doesn't convert endianess when parsing the descriptor - */ - usb_parse_descriptor(device_desc, "bbWbbbbWWWbbbb", &dev->descriptor); - - LIST_ADD(fdev, dev); - - if (usb_debug >= 2) - fprintf(stderr, "usb_os_find_devices: Found %s on %s\n", - dev->filename, bus->dirname); - - /* Now try to fetch the rest of the descriptors */ - if (dev->descriptor.bNumConfigurations > USB_MAXCONFIG) - /* Silent since we'll try again later */ - goto err; - - if (dev->descriptor.bNumConfigurations < 1) - /* Silent since we'll try again later */ - goto err; - - dev->config = (struct usb_config_descriptor *)malloc(dev->descriptor.bNumConfigurations * sizeof(struct usb_config_descriptor)); - if (!dev->config) - /* Silent since we'll try again later */ - goto err; - - memset(dev->config, 0, dev->descriptor.bNumConfigurations * - sizeof(struct usb_config_descriptor)); - - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { - unsigned char buffer[8], *bigbuffer; - struct usb_config_descriptor config; - - /* Get the first 8 bytes so we can figure out what the total length is */ - ret = read(fd, (void *)buffer, 8); - if (ret < 8) { - if (usb_debug >= 1) { - if (ret < 0) - fprintf(stderr, "Unable to get descriptor (%d)\n", ret); - else - fprintf(stderr, "Config descriptor too short (expected %d, got %d)\n", 8, ret); - } - - goto err; - } - - usb_parse_descriptor(buffer, "bbw", &config); - - bigbuffer = malloc(config.wTotalLength); - if (!bigbuffer) { - if (usb_debug >= 1) - fprintf(stderr, "Unable to allocate memory for descriptors\n"); - goto err; - } - - /* Read the rest of the config descriptor */ - memcpy(bigbuffer, buffer, 8); - - ret = read(fd, (void *)(bigbuffer + 8), config.wTotalLength - 8); - if (ret < config.wTotalLength - 8) { - if (usb_debug >= 1) { - if (ret < 0) - fprintf(stderr, "Unable to get descriptor (%d)\n", ret); - else - fprintf(stderr, "Config descriptor too short (expected %d, got %d)\n", config.wTotalLength, ret); - } - - free(bigbuffer); - goto err; - } - - ret = usb_parse_configuration(&dev->config[i], bigbuffer); - if (usb_debug >= 2) { - if (ret > 0) - fprintf(stderr, "Descriptor data still left\n"); - else if (ret < 0) - fprintf(stderr, "Unable to parse descriptors\n"); - } - - free(bigbuffer); - } - -err: - close(fd); - } - - closedir(dir); - - *devices = fdev; - - return 0; -} - -int usb_os_determine_children(struct usb_bus *bus) -{ - struct usb_device *dev, *devices[256]; - struct usb_ioctl command; - int ret, i, i1; - - /* Create a list of devices first */ - memset(devices, 0, sizeof(devices)); - for (dev = bus->devices; dev; dev = dev->next) - if (dev->devnum) - devices[dev->devnum] = dev; - - /* Now fetch the children for each device */ - for (dev = bus->devices; dev; dev = dev->next) { - struct usb_hub_portinfo portinfo; - int fd; - - fd = device_open(dev); - if (fd < 0) - continue; - - /* Query the hub driver for the children of this device */ - if (dev->config && dev->config->interface && dev->config->interface->altsetting) - command.ifno = dev->config->interface->altsetting->bInterfaceNumber; - else - command.ifno = 0; - command.ioctl_code = IOCTL_USB_HUB_PORTINFO; - command.data = &portinfo; - ret = ioctl(fd, IOCTL_USB_IOCTL, &command); - if (ret < 0) { - /* errno == ENOSYS means the device probably wasn't a hub */ - if (errno != ENOSYS && usb_debug > 1) - fprintf(stderr, "error obtaining child information: %s\n", - strerror(errno)); - - close(fd); - continue; - } - - dev->num_children = 0; - for (i = 0; i < portinfo.numports; i++) - if (portinfo.port[i]) - dev->num_children++; - - /* Free any old children first */ - free(dev->children); - - dev->children = malloc(sizeof(struct usb_device *) * dev->num_children); - if (!dev->children) { - if (usb_debug > 1) - fprintf(stderr, "error allocating %zu bytes memory for dev->children\n", - sizeof(struct usb_device *) * dev->num_children); - - dev->num_children = 0; - close(fd); - continue; - } - - for (i = 0, i1 = 0; i < portinfo.numports; i++) { - if (!portinfo.port[i]) - continue; - - dev->children[i1++] = devices[portinfo.port[i]]; - - devices[portinfo.port[i]] = NULL; - } - - close(fd); - } - - /* - * There should be one device left in the devices list and that should be - * the root device - */ - for (i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) { - if (devices[i]) - bus->root_dev = devices[i]; - } - - return 0; -} - -static int check_usb_vfs(const char *dirname) -{ - DIR *dir; - struct dirent *entry; - int found = 0; - - dir = opendir(dirname); - if (!dir) - return 0; - - while ((entry = readdir(dir)) != NULL) { - /* Skip anything starting with a . */ - if (entry->d_name[0] == '.') - continue; - - /* We assume if we find any files that it must be the right place */ - found = 1; - break; - } - - closedir(dir); - - return found; -} - -void usb_os_init(void) -{ - /* Find the path to the virtual filesystem */ - if (getenv("USB_DEVFS_PATH")) { - if (check_usb_vfs(getenv("USB_DEVFS_PATH"))) { - strncpy(usb_path, getenv("USB_DEVFS_PATH"), sizeof(usb_path) - 1); - usb_path[sizeof(usb_path) - 1] = 0; - } else if (usb_debug) - fprintf(stderr, "usb_os_init: couldn't find USB VFS in USB_DEVFS_PATH\n"); - } - - if (!usb_path[0]) { - if (check_usb_vfs("/dev/bus/usb")) { - strncpy(usb_path, "/dev/bus/usb", sizeof(usb_path) - 1); - usb_path[sizeof(usb_path) - 1] = 0; - } else if (check_usb_vfs("/proc/bus/usb")) { - strncpy(usb_path, "/proc/bus/usb", sizeof(usb_path) - 1); - usb_path[sizeof(usb_path) - 1] = 0; - } else - usb_path[0] = 0; /* No path, no USB support */ - } - - if (usb_debug) { - if (usb_path[0]) - fprintf(stderr, "usb_os_init: Found USB VFS at %s\n", usb_path); - else - fprintf(stderr, "usb_os_init: No USB VFS found, is it mounted?\n"); - } -} - -int usb_resetep(usb_dev_handle *dev, unsigned int ep) -{ - int ret; - - ret = ioctl(dev->fd, IOCTL_USB_RESETEP, &ep); - if (ret) - USB_ERROR_STR(-errno, "could not reset ep %d: %s", ep, - strerror(errno)); - - return 0; -} - -int usb_clear_halt(usb_dev_handle *dev, unsigned int ep) -{ - int ret; - - ret = ioctl(dev->fd, IOCTL_USB_CLEAR_HALT, &ep); - if (ret) - USB_ERROR_STR(-errno, "could not clear/halt ep %d: %s", ep, - strerror(errno)); - - return 0; -} - -int usb_reset(usb_dev_handle *dev) -{ - int ret; - - ret = ioctl(dev->fd, IOCTL_USB_RESET, NULL); - if (ret) - USB_ERROR_STR(-errno, "could not reset: %s", strerror(errno)); - - return 0; -} - -int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, - unsigned int namelen) -{ - struct usb_getdriver getdrv; - int ret; - - getdrv.interface = interface; - ret = ioctl(dev->fd, IOCTL_USB_GETDRIVER, &getdrv); - if (ret) - USB_ERROR_STR(-errno, "could not get bound driver: %s", strerror(errno)); - - strncpy(name, getdrv.driver, namelen - 1); - name[namelen - 1] = 0; - - return 0; -} - -int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface) -{ - struct usb_ioctl command; - int ret; - - command.ifno = interface; - command.ioctl_code = IOCTL_USB_DISCONNECT; - command.data = NULL; - - ret = ioctl(dev->fd, IOCTL_USB_IOCTL, &command); - if (ret) - USB_ERROR_STR(-errno, "could not detach kernel driver from interface %d: %s", - interface, strerror(errno)); - - return 0; -} - diff --git a/libusb/libusb/linux.h b/libusb/libusb/linux.h deleted file mode 100644 index 8f20ef3..0000000 --- a/libusb/libusb/linux.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef __LINUX_H__ -#define __LINUX_H__ - -#include -#include -#include - -struct usb_ctrltransfer { - /* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */ - u_int8_t bRequestType; - u_int8_t bRequest; - u_int16_t wValue; - u_int16_t wIndex; - u_int16_t wLength; - - u_int32_t timeout; /* in milliseconds */ - - /* pointer to data */ - void *data; -}; - -struct usb_bulktransfer { - /* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */ - unsigned int ep; - unsigned int len; - unsigned int timeout; /* in milliseconds */ - - /* pointer to data */ - void *data; -}; - -struct usb_setinterface { - /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */ - unsigned int interface; - unsigned int altsetting; -}; - -#define USB_MAXDRIVERNAME 255 - -struct usb_getdriver { - unsigned int interface; - char driver[USB_MAXDRIVERNAME + 1]; -}; - -#define USB_URB_DISABLE_SPD 1 -#define USB_URB_ISO_ASAP 2 -#define USB_URB_QUEUE_BULK 0x10 - -#define USB_URB_TYPE_ISO 0 -#define USB_URB_TYPE_INTERRUPT 1 -#define USB_URB_TYPE_CONTROL 2 -#define USB_URB_TYPE_BULK 3 - -struct usb_iso_packet_desc { - unsigned int length; - unsigned int actual_length; - unsigned int status; -}; - -struct usb_urb { - unsigned char type; - unsigned char endpoint; - int status; - unsigned int flags; - void *buffer; - int buffer_length; - int actual_length; - int start_frame; - int number_of_packets; - int error_count; - unsigned int signr; /* signal to be sent on error, -1 if none should be sent */ - void *usercontext; - struct usb_iso_packet_desc iso_frame_desc[0]; -}; - -struct usb_connectinfo { - unsigned int devnum; - unsigned char slow; -}; - -struct usb_ioctl { - int ifno; /* interface 0..N ; negative numbers reserved */ - int ioctl_code; /* MUST encode size + direction of data so the - * macros in give correct values */ - void *data; /* param buffer (in, or out) */ -}; - -struct usb_hub_portinfo { - unsigned char numports; - unsigned char port[127]; /* port to device num mapping */ -}; - -#define IOCTL_USB_CONTROL _IOWR('U', 0, struct usb_ctrltransfer) -#define IOCTL_USB_BULK _IOWR('U', 2, struct usb_bulktransfer) -#define IOCTL_USB_RESETEP _IOR('U', 3, unsigned int) -#define IOCTL_USB_SETINTF _IOR('U', 4, struct usb_setinterface) -#define IOCTL_USB_SETCONFIG _IOR('U', 5, unsigned int) -#define IOCTL_USB_GETDRIVER _IOW('U', 8, struct usb_getdriver) -#define IOCTL_USB_SUBMITURB _IOR('U', 10, struct usb_urb) -#define IOCTL_USB_DISCARDURB _IO('U', 11) -#define IOCTL_USB_REAPURB _IOW('U', 12, void *) -#define IOCTL_USB_REAPURBNDELAY _IOW('U', 13, void *) -#define IOCTL_USB_CLAIMINTF _IOR('U', 15, unsigned int) -#define IOCTL_USB_RELEASEINTF _IOR('U', 16, unsigned int) -#define IOCTL_USB_CONNECTINFO _IOW('U', 17, struct usb_connectinfo) -#define IOCTL_USB_IOCTL _IOWR('U', 18, struct usb_ioctl) -#define IOCTL_USB_HUB_PORTINFO _IOR('U', 19, struct usb_hub_portinfo) -#define IOCTL_USB_RESET _IO('U', 20) -#define IOCTL_USB_CLEAR_HALT _IOR('U', 21, unsigned int) -#define IOCTL_USB_DISCONNECT _IO('U', 22) -#define IOCTL_USB_CONNECT _IO('U', 23) - -/* - * IOCTL_USB_HUB_PORTINFO, IOCTL_USB_DISCONNECT and IOCTL_USB_CONNECT - * all work via IOCTL_USB_IOCTL - */ - -#endif - diff --git a/libusb/libusb/ltmain.sh b/libusb/libusb/ltmain.sh index 3061e3c..04eaea4 100755 --- a/libusb/libusb/ltmain.sh +++ b/libusb/libusb/ltmain.sh @@ -1,5 +1,6 @@ +# Generated from ltmain.m4sh. -# libtool (GNU libtool) 2.4 +# libtool (GNU libtool) 2.2.10 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, @@ -69,19 +70,17 @@ # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4 +# $progname: (GNU libtool) 2.2.10 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . PROGRAM=libtool PACKAGE=libtool -VERSION=2.4 +VERSION=2.2.10 TIMESTAMP="" -package_revision=1.3293 +package_revision=1.3175 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then @@ -164,27 +163,6 @@ IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: @@ -199,31 +177,17 @@ func_basename () # those functions but instead duplicate the functionality here. func_dirname_and_basename () { - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} +# Generated shell functions inserted here. # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' @@ -406,15 +370,6 @@ sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. @@ -443,7 +398,7 @@ opt_warning=: # name if it has been set yet. func_echo () { - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" + $ECHO "$progname${mode+: }$mode: $*" } # func_verbose arg... @@ -469,14 +424,14 @@ func_echo_all () # Echo program name prefixed message to standard error. func_error () { - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 # bash bug again: : @@ -695,30 +650,11 @@ func_show_eval_locale () fi } -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - # func_version # Echo version message to standard output and exit. func_version () { - $opt_debug - $SED -n '/(C)/!b go :more /\./!{ @@ -740,8 +676,6 @@ func_version () # Echo short help message to standard output and exit. func_usage () { - $opt_debug - $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// @@ -758,10 +692,7 @@ func_usage () # unless 'noexit' is passed as argument. func_help () { - $opt_debug - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print s/^# // s/^# *$// s*\$progname*'$progname'* @@ -774,11 +705,7 @@ func_help () s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" + }' < "$progpath" ret=$? if test -z "$1"; then exit $ret @@ -790,106 +717,40 @@ func_help () # exit_cmd. func_missing_arg () { - $opt_debug - func_error "missing argument for $1." exit_cmd=exit } - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - exit_cmd=: + magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. +# $mode is unset nonopt= +execute_dlfiles= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 +opt_dry_run=false +opt_duplicate_deps=false +opt_silent=false +opt_debug=: + # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. @@ -979,204 +840,129 @@ func_enable_tag () esac } -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. { - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_verbose=: -opt_silent=false -opt_verbose=false + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do + # Parse non-mode specific arguments: + while test "$#" -gt 0; do opt="$1" shift + case $opt in - --debug|-x) opt_debug='set -x' + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" func_echo "enabling shell trace mode" + opt_debug='set -x' $opt_debug ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" shift ;; + --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + opt_verbose=false ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift + + --no-quiet|--no-silent) + preserve_args="$preserve_args $opt" + opt_silent=false ;; - --no-silent|--no-quiet) + + --verbose| -v) preserve_args="$preserve_args $opt" opt_silent=false -func_append preserve_args " $opt" + opt_verbose=: ;; - --no-verbose) + + --no-verbose) preserve_args="$preserve_args $opt" opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here shift ;; - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} shift ;; - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --help-all) opt_help=': help-all' ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; + *) nonopt="$opt" + break + ;; esac done - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) @@ -1184,44 +970,82 @@ func_enable_tag "$optarg" opt_duplicate_compiler_generated_deps=: ;; *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps ;; esac - $opt_help || { - # Sanity checks first: - func_check_version_match + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF fi - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" + exit $EXIT_MISMATCH + fi +} - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } +## ----------- ## +## Main. ## +## ----------- ## +$opt_help || { + # Sanity checks first: + func_check_version_match - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} -## ----------- ## -## Main. ## -## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. @@ -1286,9 +1110,12 @@ func_ltwrapper_executable_p () # temporary ltwrapper_script. func_ltwrapper_scriptname () { - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi } # func_ltwrapper_p file @@ -1334,37 +1161,6 @@ func_source () } -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. @@ -1377,7 +1173,8 @@ func_infer_tag () if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do - func_append_quoted CC_quoted "$arg" + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` @@ -1396,7 +1193,8 @@ func_infer_tag () CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` @@ -1415,535 +1213,55 @@ func_infer_tag () # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi } -# end func_convert_path_noop - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () { - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + $opt_dry_run || { + cat >${write_libobj}T < "$lockfile" fi $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" + removelist="$removelist $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result @@ -2194,7 +1515,7 @@ compiler." if test -z "$output_obj"; then # Place PIC objects in $objdir - func_append command " -o $lobj" + command="$command -o $lobj" fi func_show_eval_locale "$command" \ @@ -2241,11 +1562,11 @@ compiler." command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then - func_append command " -o $obj" + command="$command -o $obj" fi # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" + command="$command$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' @@ -2290,13 +1611,13 @@ compiler." } $opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} + test "$mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. - case $opt_mode in + case $mode in "") # Generic help is extracted from the usage comments # at the start of this file. @@ -2472,7 +1793,7 @@ Otherwise, only FILE itself is deleted using RM." ;; *) - func_fatal_help "invalid operation mode \`$opt_mode'" + func_fatal_help "invalid operation mode \`$mode'" ;; esac @@ -2487,13 +1808,13 @@ if $opt_help; then else { func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do + for mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do + for mode in compile link execute install finish uninstall clean; do echo func_mode_help done @@ -2522,16 +1843,13 @@ func_mode_execute () func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. - for file in $opt_dlopen; do + for file in $execute_dlfiles; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" @@ -2553,7 +1871,7 @@ func_mode_execute () dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" + dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" @@ -2610,7 +1928,8 @@ func_mode_execute () ;; esac # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" done if test "X$opt_dry_run" = Xfalse; then @@ -2642,59 +1961,22 @@ func_mode_execute () fi } -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} +test "$mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug - libs= - libdirs= + libdirs="$nonopt" admincmds= - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "\`$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument \`$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. @@ -2704,7 +1986,7 @@ func_mode_finish () if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " + $opt_dry_run || eval "$cmds" || admincmds="$admincmds $cmds" fi done @@ -2713,55 +1995,53 @@ func_mode_finish () # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" exit $EXIT_SUCCESS } -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} +test "$mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... @@ -2786,7 +2066,7 @@ func_mode_install () # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" + install_prog="$install_prog$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; @@ -2806,7 +2086,7 @@ func_mode_install () do arg2= if test -n "$dest"; then - func_append files " $dest" + files="$files $dest" dest=$arg continue fi @@ -2844,11 +2124,11 @@ func_mode_install () # Aesthetically quote the argument. func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" + install_prog="$install_prog $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi - func_append install_shared_prog " $func_quote_for_eval_result" + install_shared_prog="$install_shared_prog $func_quote_for_eval_result" done test -z "$install_prog" && \ @@ -2860,7 +2140,7 @@ func_mode_install () if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" + install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result" fi fi @@ -2918,13 +2198,10 @@ func_mode_install () case $file in *.$libext) # Do the static libraries later. - func_append staticlibs " $file" + staticlibs="$staticlibs $file" ;; *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" @@ -2938,19 +2215,19 @@ func_mode_install () if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; + *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; + *) future_libdirs="$future_libdirs $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" - func_append dir "$objdir" + dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. @@ -3027,7 +2304,7 @@ func_mode_install () func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) @@ -3224,7 +2501,7 @@ func_mode_install () fi } -test "$opt_mode" = install && func_mode_install ${1+"$@"} +test "$mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p @@ -3271,18 +2548,6 @@ extern \"C\" { #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - /* External symbol declarations for the compiler. */\ " @@ -3294,9 +2559,8 @@ extern \"C\" { # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then @@ -3345,52 +2609,10 @@ extern \"C\" { func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } done $opt_dry_run || { @@ -3428,9 +2650,26 @@ typedef struct { const char *name; void *address; } lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + echo >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + echo >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist +$lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," @@ -3486,7 +2725,7 @@ static const void *lt_preloaded_setup() { for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; + *) symtab_cflags="$symtab_cflags $arg" ;; esac done @@ -3549,8 +2788,7 @@ func_win32_libid () # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + win32_nmres=`eval $NM -f posix -A $1 | $SED -n -e ' 1,100{ / I /{ @@ -3579,131 +2817,6 @@ func_win32_libid () $ECHO "$win32_libid_type" } -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} # func_extract_an_archive dir oldlib @@ -4082,18 +3195,6 @@ func_exec_program () if test -f \"\$progdir/\$program\"; then" - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ @@ -4108,6 +3209,14 @@ func_exec_program () " fi + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. @@ -4125,6 +3234,166 @@ fi\ } +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1"; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_result=`cygpath -w "$1" | + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" | + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result= + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1"; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_pathlist_tmp1=$func_stripname_result + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + func_to_host_pathlist_result=` + ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" | + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_append func_to_host_pathlist_result ";$func_to_host_path_result" + fi + fi + fi + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result"; then + func_error "Could not determine the host path(s) corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_append func_to_host_pathlist_result ";" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because @@ -4294,14 +3563,14 @@ void lt_dump_script (FILE *f); EOF cat </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | @@ -7812,7 +6999,7 @@ EOF if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" + newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi @@ -7837,7 +7024,7 @@ EOF ;; *) # Add a -L argument. - func_append newdeplibs " $a_deplib" + newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. @@ -7853,7 +7040,7 @@ EOF if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) - func_append newdeplibs " $a_deplib" + newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac @@ -7866,7 +7053,7 @@ EOF potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" + newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi @@ -7891,7 +7078,7 @@ EOF ;; *) # Add a -L argument. - func_append newdeplibs " $a_deplib" + newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. @@ -7995,7 +7182,7 @@ EOF *) case " $deplibs " in *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; + new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac @@ -8005,10 +7192,10 @@ EOF -L*) case " $new_libs " in *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" @@ -8025,12 +7212,10 @@ EOF hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else @@ -8039,18 +7224,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" + dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) func_apped perm_rpath " $libdir" ;; + *) perm_rpath="$perm_rpath $libdir" ;; esac fi done @@ -8068,7 +7253,7 @@ EOF # We should set the runpath_var. rpath= for dir in $perm_rpath; do - func_append rpath "$dir:" + rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi @@ -8076,7 +7261,7 @@ EOF fi shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi @@ -8102,7 +7287,7 @@ EOF linknames= for link do - func_append linknames " $link" + linknames="$linknames $link" done # Use standard objects if they are pic @@ -8113,7 +7298,7 @@ EOF if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" + delfiles="$delfiles $export_symbols" fi orig_export_symbols= @@ -8144,45 +7329,13 @@ EOF $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do + for cmd in $cmds; do IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. @@ -8216,7 +7369,7 @@ EOF # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi @@ -8226,7 +7379,7 @@ EOF case " $convenience " in *" $test_deplib "*) ;; *) - func_append tmp_deplibs " $test_deplib" + tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done @@ -8246,21 +7399,21 @@ EOF test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" + libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" + linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then + if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi @@ -8322,13 +7475,10 @@ EOF echo 'INPUT (' > $output for obj in $save_libobjs do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output + $ECHO "$obj" >> $output done echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result + delfiles="$delfiles $output" elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" @@ -8342,12 +7492,10 @@ EOF fi for obj do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output + $ECHO "$obj" >> $output done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." @@ -8398,7 +7546,7 @@ EOF if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi - func_append delfiles " $output" + delfiles="$delfiles $output" else output= @@ -8432,7 +7580,7 @@ EOF lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -8465,7 +7613,7 @@ EOF # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi @@ -8506,10 +7654,10 @@ EOF # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" + libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi @@ -8525,7 +7673,7 @@ EOF lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -8537,7 +7685,7 @@ EOF IFS="$save_ifs" # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then @@ -8621,16 +7769,13 @@ EOF reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test @@ -8704,8 +7849,8 @@ EOF if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" ;; esac fi @@ -8725,7 +7870,7 @@ EOF *) case " $compile_deplibs " in *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; + new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac @@ -8735,17 +7880,17 @@ EOF -L*) case " $new_libs " in *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. @@ -8753,7 +7898,7 @@ EOF # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi @@ -8772,18 +7917,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" + rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; + *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in @@ -8792,12 +7937,12 @@ EOF case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; + *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; + *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac @@ -8823,18 +7968,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" + rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done @@ -8885,12 +8030,6 @@ EOF exit_status=0 func_show_eval "$link_command" 'exit_status=$?' - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' @@ -8913,7 +8052,7 @@ EOF # We should set the runpath_var. rpath= for dir in $perm_rpath; do - func_append rpath "$dir:" + rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi @@ -8921,7 +8060,7 @@ EOF # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" + rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi @@ -8936,13 +8075,6 @@ EOF $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - exit $EXIT_SUCCESS fi @@ -8976,12 +8108,6 @@ EOF func_show_eval "$link_command" 'exit $?' - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - # Now create the wrapper script. func_verbose "creating $output" @@ -9079,7 +8205,7 @@ EOF else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" + oldobjs="$oldobjs $symfileobj" fi fi addlibs="$old_convenience" @@ -9087,10 +8213,10 @@ EOF if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" + oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. @@ -9101,10 +8227,10 @@ EOF # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" + oldobjs="$oldobjs $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have @@ -9122,7 +8248,7 @@ EOF else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= @@ -9146,9 +8272,9 @@ EOF esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" ;; - *) func_append oldobjs " $obj" ;; + *) oldobjs="$oldobjs $obj" ;; esac done fi @@ -9158,16 +8284,6 @@ EOF len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." @@ -9264,19 +8380,9 @@ EOF eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" + newdependency_libs="$newdependency_libs $libdir/$name" ;; - *) func_append newdependency_libs " $deplib" ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" @@ -9290,9 +8396,9 @@ EOF eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + newdlfiles="$newdlfiles $libdir/$name" ;; - *) func_append newdlfiles " $lib" ;; + *) newdlfiles="$newdlfiles $lib" ;; esac done dlfiles="$newdlfiles" @@ -9309,7 +8415,7 @@ EOF eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + newdlprefiles="$newdlprefiles $libdir/$name" ;; esac done @@ -9321,7 +8427,7 @@ EOF [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac - func_append newdlfiles " $abs" + newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= @@ -9330,7 +8436,7 @@ EOF [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac - func_append newdlprefiles " $abs" + newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi @@ -9415,7 +8521,7 @@ relink_command=\"$relink_command\"" exit $EXIT_SUCCESS } -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && +{ test "$mode" = link || test "$mode" = relink; } && func_mode_link ${1+"$@"} @@ -9435,9 +8541,9 @@ func_mode_uninstall () for arg do case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; esac done @@ -9446,23 +8552,24 @@ func_mode_uninstall () rmdirs= + origobjdir="$objdir" for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then - odir="$objdir" + objdir="$origobjdir" else - odir="$dir/$objdir" + objdir="$dir/$origobjdir" fi func_basename "$file" name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" + test "$mode" = uninstall && objdir="$dir" - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; esac fi @@ -9488,17 +8595,18 @@ func_mode_uninstall () # Delete the libtool libraries and symlinks. for n in $library_names; do - func_append rmfiles " $odir/$n" + rmfiles="$rmfiles $objdir/$n" done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - case "$opt_mode" in + case "$mode" in clean) - case " $library_names " in + case " $library_names " in + # " " in the beginning catches empty $dlname *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then @@ -9526,19 +8634,19 @@ func_mode_uninstall () # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then - func_append rmfiles " $dir/$pic_object" + rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then - func_append rmfiles " $dir/$non_pic_object" + rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) - if test "$opt_mode" = clean ; then + if test "$mode" = clean ; then noexename=$name case $file in *.exe) @@ -9548,7 +8656,7 @@ func_mode_uninstall () noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe - func_append rmfiles " $file" + rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. @@ -9557,7 +8665,7 @@ func_mode_uninstall () func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename @@ -9565,12 +8673,12 @@ func_mode_uninstall () # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" + rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" + rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi @@ -9578,6 +8686,7 @@ func_mode_uninstall () esac func_show_eval "$RM $rmfiles" 'exit_status=1' done + objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do @@ -9589,16 +8698,16 @@ func_mode_uninstall () exit $exit_status } -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && +{ test "$mode" = uninstall || test "$mode" = clean; } && func_mode_uninstall ${1+"$@"} -test -z "$opt_mode" && { +test -z "$mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" + func_fatal_help "invalid operation mode \`$mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" diff --git a/libusb/libusb/msvc/config.h b/libusb/libusb/msvc/config.h new file mode 100644 index 0000000..43aa1f7 --- /dev/null +++ b/libusb/libusb/msvc/config.h @@ -0,0 +1,24 @@ +/* config.h. Manual config for MSVC. */ + +#ifndef _MSC_VER +#warn "msvc/config.h shouldn't be included for your development environment." +#error "Please make sure the msvc/ directory is removed from your build path." +#endif + +/* Default visibility */ +#define DEFAULT_VISIBILITY /**/ + +/* Debug message logging */ +//#define ENABLE_DEBUG_LOGGING 1 + +/* Message logging */ +#define ENABLE_LOGGING 1 + +/* Windows backend */ +#define OS_WINDOWS 1 + +/* type of second poll() argument */ +#define POLL_NFDS_TYPE unsigned int + +/* no way to run git describe from MSVC? */ +#define LIBUSB_DESCRIBE "" diff --git a/libusb/libusb/msvc/ddk_build.cmd b/libusb/libusb/msvc/ddk_build.cmd new file mode 100644 index 0000000..ed9b8a8 --- /dev/null +++ b/libusb/libusb/msvc/ddk_build.cmd @@ -0,0 +1,106 @@ +@rem default builds static library. +@rem you can pass the following arguments (case insensitive): +@rem - "DLL" to build a DLL instead of a static library +@rem - "/MT" to build a static library compatible with MSVC's /MT option (LIBCMT vs MSVCRT) +@echo off + +if Test%BUILD_ALT_DIR%==Test goto usage + +rem process commandline parameters +set TARGET=LIBRARY +set STATIC_LIBC= +set version=1.0 + +if "%1" == "" goto no_more_args +rem /I for case insensitive +if /I Test%1==TestDLL set TARGET=DYNLINK +if /I Test%1==Test/MT set STATIC_LIBC=1 +:no_more_args + +cd ..\libusb\os +echo TARGETTYPE=%TARGET% > target +copy target+..\..\msvc\libusb_sources sources >NUL 2>&1 +del target +@echo on +build -cwgZ +@echo off +if errorlevel 1 goto builderror +cd ..\.. + +set cpudir=i386 +set destType=Win32 +if %_BUILDARCH%==x86 goto isI386 +set cpudir=amd64 +set destType=x64 +:isI386 + +set srcPath=libusb\os\obj%BUILD_ALT_DIR%\%cpudir% + +set dstPath=%destType%\Debug +if %DDKBUILDENV%==chk goto isDebug +set dstPath=%destType%\Release +:isDebug + +if exist %destType% goto md2 +mkdir %destType% +:md2 +if exist %dstPath% goto md3 +mkdir %dstPath% +:md3 +if exist %dstPath%\dll goto md4 +mkdir %dstPath%\dll +:md4 +if exist %dstPath%\lib goto md5 +md %dstPath%\lib +:md5 +if exist %dstPath%\examples goto md6 +md %dstPath%\examples +:md6 +@echo on + +@if /I NOT Test%1==TestDLL goto copylib +copy %srcPath%\libusb-%version%.dll %dstPath%\dll +copy %srcPath%\libusb-%version%.pdb %dstPath%\dll +:copylib +copy %srcPath%\libusb-%version%.lib %dstPath%\lib + +@echo off + +if exist examples\listdevs_ddkbuild goto md7 +md examples\listdevs_ddkbuild +:md7 + +cd examples\listdevs_ddkbuild +copy ..\..\msvc\listdevs_sources sources >NUL 2>&1 +@echo on +build -cwgZ +@echo off +if errorlevel 1 goto buildlistdevserror +cd ..\.. + +set srcPath=examples\listdevs_ddkbuild\obj%BUILD_ALT_DIR%\%cpudir% +@echo on + +copy %srcPath%\listdevs.exe %dstPath%\examples +copy %srcPath%\listdevs.pdb %dstPath%\examples + +cd msvc +goto done + + +:builderror +cd ..\..\msvc +echo Build failed +goto done + +:buildlistdevserror +cd ..\..\msvc +echo listdevs build failed +goto done + +:usage +echo ddk_build must be run in a WDK build environment +pause +goto done + +:done diff --git a/libusb/libusb/msvc/inttypes.h b/libusb/libusb/msvc/inttypes.h new file mode 100644 index 0000000..289bb50 --- /dev/null +++ b/libusb/libusb/msvc/inttypes.h @@ -0,0 +1,295 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file was original part of the w64 mingw-runtime package. + */ + +/* + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * Modified for libusb/MSVC: Pete Batard + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Date: 2010-04-02 + */ + +#ifndef _MSC_VER +#error This header should only be used with Microsoft compilers +#endif + +/* 7.8 Format conversion of integer types */ + +#ifndef _INTTYPES_H_ +#define _INTTYPES_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + intmax_t quot; + intmax_t rem; + } imaxdiv_t; + + +/* 7.8.1 Macros for format specifiers + * + * MS runtime does not yet understand C9x standard "ll" + * length specifier. It appears to treat "ll" as "l". + * The non-standard I64 length specifier causes warning in GCC, + * but understood by MS runtime functions. + */ + +/* fprintf macros for signed types */ +#define PRId8 "d" +#define PRId16 "d" +#define PRId32 "d" +#define PRId64 "I64d" + +#define PRIdLEAST8 "d" +#define PRIdLEAST16 "d" +#define PRIdLEAST32 "d" +#define PRIdLEAST64 "I64d" + +#define PRIdFAST8 "d" +#define PRIdFAST16 "d" +#define PRIdFAST32 "d" +#define PRIdFAST64 "I64d" + +#define PRIdMAX "I64d" + +#define PRIi8 "i" +#define PRIi16 "i" +#define PRIi32 "i" +#define PRIi64 "I64i" + +#define PRIiLEAST8 "i" +#define PRIiLEAST16 "i" +#define PRIiLEAST32 "i" +#define PRIiLEAST64 "I64i" + +#define PRIiFAST8 "i" +#define PRIiFAST16 "i" +#define PRIiFAST32 "i" +#define PRIiFAST64 "I64i" + +#define PRIiMAX "I64i" + +#define PRIo8 "o" +#define PRIo16 "o" +#define PRIo32 "o" +#define PRIo64 "I64o" + +#define PRIoLEAST8 "o" +#define PRIoLEAST16 "o" +#define PRIoLEAST32 "o" +#define PRIoLEAST64 "I64o" + +#define PRIoFAST8 "o" +#define PRIoFAST16 "o" +#define PRIoFAST32 "o" +#define PRIoFAST64 "I64o" + +#define PRIoMAX "I64o" + +/* fprintf macros for unsigned types */ +#define PRIu8 "u" +#define PRIu16 "u" +#define PRIu32 "u" +#define PRIu64 "I64u" + + +#define PRIuLEAST8 "u" +#define PRIuLEAST16 "u" +#define PRIuLEAST32 "u" +#define PRIuLEAST64 "I64u" + +#define PRIuFAST8 "u" +#define PRIuFAST16 "u" +#define PRIuFAST32 "u" +#define PRIuFAST64 "I64u" + +#define PRIuMAX "I64u" + +#define PRIx8 "x" +#define PRIx16 "x" +#define PRIx32 "x" +#define PRIx64 "I64x" + +#define PRIxLEAST8 "x" +#define PRIxLEAST16 "x" +#define PRIxLEAST32 "x" +#define PRIxLEAST64 "I64x" + +#define PRIxFAST8 "x" +#define PRIxFAST16 "x" +#define PRIxFAST32 "x" +#define PRIxFAST64 "I64x" + +#define PRIxMAX "I64x" + +#define PRIX8 "X" +#define PRIX16 "X" +#define PRIX32 "X" +#define PRIX64 "I64X" + +#define PRIXLEAST8 "X" +#define PRIXLEAST16 "X" +#define PRIXLEAST32 "X" +#define PRIXLEAST64 "I64X" + +#define PRIXFAST8 "X" +#define PRIXFAST16 "X" +#define PRIXFAST32 "X" +#define PRIXFAST64 "I64X" + +#define PRIXMAX "I64X" + +/* + * fscanf macros for signed int types + * NOTE: if 32-bit int is used for int_fast8_t and int_fast16_t + * (see stdint.h, 7.18.1.3), FAST8 and FAST16 should have + * no length identifiers + */ + +#define SCNd16 "hd" +#define SCNd32 "d" +#define SCNd64 "I64d" + +#define SCNdLEAST16 "hd" +#define SCNdLEAST32 "d" +#define SCNdLEAST64 "I64d" + +#define SCNdFAST16 "hd" +#define SCNdFAST32 "d" +#define SCNdFAST64 "I64d" + +#define SCNdMAX "I64d" + +#define SCNi16 "hi" +#define SCNi32 "i" +#define SCNi64 "I64i" + +#define SCNiLEAST16 "hi" +#define SCNiLEAST32 "i" +#define SCNiLEAST64 "I64i" + +#define SCNiFAST16 "hi" +#define SCNiFAST32 "i" +#define SCNiFAST64 "I64i" + +#define SCNiMAX "I64i" + +#define SCNo16 "ho" +#define SCNo32 "o" +#define SCNo64 "I64o" + +#define SCNoLEAST16 "ho" +#define SCNoLEAST32 "o" +#define SCNoLEAST64 "I64o" + +#define SCNoFAST16 "ho" +#define SCNoFAST32 "o" +#define SCNoFAST64 "I64o" + +#define SCNoMAX "I64o" + +#define SCNx16 "hx" +#define SCNx32 "x" +#define SCNx64 "I64x" + +#define SCNxLEAST16 "hx" +#define SCNxLEAST32 "x" +#define SCNxLEAST64 "I64x" + +#define SCNxFAST16 "hx" +#define SCNxFAST32 "x" +#define SCNxFAST64 "I64x" + +#define SCNxMAX "I64x" + +/* fscanf macros for unsigned int types */ + +#define SCNu16 "hu" +#define SCNu32 "u" +#define SCNu64 "I64u" + +#define SCNuLEAST16 "hu" +#define SCNuLEAST32 "u" +#define SCNuLEAST64 "I64u" + +#define SCNuFAST16 "hu" +#define SCNuFAST32 "u" +#define SCNuFAST64 "I64u" + +#define SCNuMAX "I64u" + +#ifdef _WIN64 +#define PRIdPTR "I64d" +#define PRIiPTR "I64i" +#define PRIoPTR "I64o" +#define PRIuPTR "I64u" +#define PRIxPTR "I64x" +#define PRIXPTR "I64X" +#define SCNdPTR "I64d" +#define SCNiPTR "I64i" +#define SCNoPTR "I64o" +#define SCNxPTR "I64x" +#define SCNuPTR "I64u" +#else +#define PRIdPTR "d" +#define PRIiPTR "i" +#define PRIoPTR "o" +#define PRIuPTR "u" +#define PRIxPTR "x" +#define PRIXPTR "X" +#define SCNdPTR "d" +#define SCNiPTR "i" +#define SCNoPTR "o" +#define SCNxPTR "x" + #define SCNuPTR "u" +#endif + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +/* + * no length modifier for char types prior to C9x + * MS runtime scanf appears to treat "hh" as "h" + */ + +/* signed char */ +#define SCNd8 "hhd" +#define SCNdLEAST8 "hhd" +#define SCNdFAST8 "hhd" + +#define SCNi8 "hhi" +#define SCNiLEAST8 "hhi" +#define SCNiFAST8 "hhi" + +#define SCNo8 "hho" +#define SCNoLEAST8 "hho" +#define SCNoFAST8 "hho" + +#define SCNx8 "hhx" +#define SCNxLEAST8 "hhx" +#define SCNxFAST8 "hhx" + +/* unsigned char */ +#define SCNu8 "hhu" +#define SCNuLEAST8 "hhu" +#define SCNuFAST8 "hhu" +#endif /* __STDC_VERSION__ >= 199901 */ + + +#ifdef __cplusplus +} +#endif + +#endif /* ndef _INTTYPES_H */ diff --git a/libusb/libusb/msvc/libusb.dsw b/libusb/libusb/msvc/libusb.dsw new file mode 100644 index 0000000..8926e67 --- /dev/null +++ b/libusb/libusb/msvc/libusb.dsw @@ -0,0 +1,56 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "libusb_dll"=".\libusb_dll.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libusb_static"=".\libusb_static.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "listdevs"=".\listdevs.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libusb_static + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/libusb/libusb/msvc/libusb_dll.dsp b/libusb/libusb/msvc/libusb_dll.dsp new file mode 100644 index 0000000..96a011e --- /dev/null +++ b/libusb/libusb/msvc/libusb_dll.dsp @@ -0,0 +1,190 @@ +# Microsoft Developer Studio Project File - Name="libusb_dll" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libusb_dll - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libusb_dll.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libusb_dll.mak" CFG="libusb_dll - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libusb_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libusb_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libusb_dll - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../Win32/Release/dll" +# PROP Intermediate_Dir "../Win32/Release/dll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "LIBUSB_DLL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../libusb" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /D "_USRDLL" /FR /FD /EHsc /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Win32/Release/dll/libusb-1.0.dll" + +!ELSEIF "$(CFG)" == "libusb_dll - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../Win32/Debug/dll" +# PROP Intermediate_Dir "../Win32/Debug/dll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "LIBUSB_DLL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../libusb" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /D "_USRDLL" /FR /FD /EHsc /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo /n +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Win32/Debug/dll/libusb-1.0.dll" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "libusb_dll - Win32 Release" +# Name "libusb_dll - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\libusb\core.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\darwin_usb.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\libusb\descriptor.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\io.c +# End Source File +# Begin Source File + +SOURCE="..\libusb\libusb-1.0.rc" +# End Source File +# Begin Source File + +SOURCE="..\libusb\libusb-1.0.def" +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\linux_usbfs.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_windows.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\sync.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_windows.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_usb.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\config.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\darwin_usb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\libusb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\libusbi.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\linux_usbfs.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_posix.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_windows.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_posix.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_windows.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_usb.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/libusb/libusb/msvc/libusb_dll.vcproj b/libusb/libusb/msvc/libusb_dll.vcproj new file mode 100644 index 0000000..242898b --- /dev/null +++ b/libusb/libusb/msvc/libusb_dll.vcproj @@ -0,0 +1,421 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libusb/libusb/msvc/libusb_dll.vcxproj b/libusb/libusb/msvc/libusb_dll.vcxproj new file mode 100644 index 0000000..fe02056 --- /dev/null +++ b/libusb/libusb/msvc/libusb_dll.vcxproj @@ -0,0 +1,166 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libusb-1.0 (dll) + {349EE8FA-7D25-4909-AAF5-FF3FADE72187} + libusbdll + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\ + $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0\ + libusb-1.0 + libusb-1.0 + libusb-1.0 + libusb-1.0 + + + + Disabled + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + + + $(OutDir)libusb-1.0.dll + ..\libusb\libusb-1.0.def + libusb-1.0.rc;%(EmbedManagedResourceFile) + true + + + + + X64 + + + Disabled + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + + + $(OutDir)libusb-1.0.dll + ..\libusb\libusb-1.0.def + libusb-1.0.rc;%(EmbedManagedResourceFile) + true + + + + + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + + + $(OutDir)libusb-1.0.dll + ..\libusb\libusb-1.0.def + libusb-1.0.rc;%(EmbedManagedResourceFile) + + + + + X64 + + + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + + + $(OutDir)libusb-1.0.dll + ..\libusb\libusb-1.0.def + libusb-1.0.rc;%(EmbedManagedResourceFile) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libusb/libusb/msvc/libusb_dll.vcxproj.filters b/libusb/libusb/msvc/libusb_dll.vcxproj.filters new file mode 100644 index 0000000..1078ae1 --- /dev/null +++ b/libusb/libusb/msvc/libusb_dll.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {d81e81ca-b13e-4a15-b54b-b12b41361e6b} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + + diff --git a/libusb/libusb/msvc/libusb_sources b/libusb/libusb/msvc/libusb_sources new file mode 100644 index 0000000..8e8e65c --- /dev/null +++ b/libusb/libusb/msvc/libusb_sources @@ -0,0 +1,36 @@ +#TARGETTYPE is not defined, to allow selection between static lib or DLL with ddk_build +TARGETNAME=libusb-1.0 +DLLDEF=..\libusb-1.0.def + +!IFNDEF MSC_WARNING_LEVEL +MSC_WARNING_LEVEL=/W3 +!ENDIF + +!IFDEF STATIC_LIBC +USE_LIBCMT=1 +!ELSE +USE_MSVCRT=1 +!ENDIF + +INCLUDES=..;..\..\msvc;$(DDK_INC_PATH) +C_DEFINES= $(C_DEFINES) $(LIBUSB_DEFINES) /DDDKBUILD + +# http://jpassing.com/2009/10/21/ltcg-issues-with-the-win7amd64-environment-of-wdk-7600/ +# prevents the following error when using the 64 bit static lib with Visual Studio 2010: +# "fatal error C1001: An internal error has occurred in the compiler. +# (compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 1823)" +# and the following with Visual Studio 2010: +# "fatal error C1047: The object or library file 'libusb-1.0.lib' was created with +# an older compiler than other objects; rebuild old objects and libraries" +USER_C_FLAGS=/GL- + +TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib + +SOURCES=..\core.c \ + ..\descriptor.c \ + ..\io.c \ + ..\sync.c \ + threads_windows.c \ + poll_windows.c \ + windows_usb.c \ + ..\libusb-1.0.rc diff --git a/libusb/libusb/msvc/libusb_static.dsp b/libusb/libusb/msvc/libusb_static.dsp new file mode 100644 index 0000000..007fcc7 --- /dev/null +++ b/libusb/libusb/msvc/libusb_static.dsp @@ -0,0 +1,170 @@ +# Microsoft Developer Studio Project File - Name="libusb_static" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libusb_static - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libusb_static.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libusb_static.mak" CFG="libusb_static - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libusb_static - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libusb_static - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libusb_static - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../Win32/Release/lib" +# PROP Intermediate_Dir "../Win32/Release/lib" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../libusb" /D "WIN32" /D "NDEBUG" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /D "_LIB" /FR /FD /EHsc /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"../Win32/Release/lib/libusb-1.0.lib" + +!ELSEIF "$(CFG)" == "libusb_static - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../Win32/Debug/lib" +# PROP Intermediate_Dir "../Win32/Debug/lib" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "../libusb" /D "WIN32" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /D "_LIB" /FR /FD /GZ /EHsc /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo /n +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"../Win32/Debug/lib/libusb-1.0.lib" + +!ENDIF + +# Begin Target + +# Name "libusb_static - Win32 Release" +# Name "libusb_static - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\libusb\core.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\darwin_usb.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\libusb\descriptor.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\io.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\linux_usbfs.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_windows.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\sync.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_windows.c +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_usb.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\config.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\darwin_usb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\libusb.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\libusbi.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\linux_usbfs.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_posix.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\poll_windows.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_posix.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\threads_windows.h +# End Source File +# Begin Source File + +SOURCE=..\libusb\os\windows_usb.h +# End Source File +# End Group +# End Target +# End Project diff --git a/libusb/libusb/msvc/libusb_static.vcproj b/libusb/libusb/msvc/libusb_static.vcproj new file mode 100644 index 0000000..bd0ca52 --- /dev/null +++ b/libusb/libusb/msvc/libusb_static.vcproj @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libusb/libusb/msvc/libusb_static.vcxproj b/libusb/libusb/msvc/libusb_static.vcxproj new file mode 100644 index 0000000..63fb20b --- /dev/null +++ b/libusb/libusb/msvc/libusb_static.vcxproj @@ -0,0 +1,150 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libusb-1.0 (static) + {349EE8F9-7D25-4909-AAF5-FF3FADE72187} + libusb + + + + StaticLibrary + Unicode + true + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + true + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-1.0\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-1.0\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-1.0\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\ + $(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-1.0\ + libusb-1.0 + libusb-1.0 + libusb-1.0 + libusb-1.0 + + + + Disabled + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebug + Level3 + ProgramDatabase + + + $(OutDir)libusb-1.0.lib + + + + + X64 + + + Disabled + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebug + Level3 + ProgramDatabase + + + $(OutDir)libusb-1.0.lib + + + + + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + Level3 + + + $(OutDir)libusb-1.0.lib + + + + + X64 + + + .;..\libusb;%(AdditionalIncludeDirectories) + _WIN32;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + Level3 + + + $(OutDir)libusb-1.0.lib + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libusb/libusb/msvc/libusb_static.vcxproj.filters b/libusb/libusb/msvc/libusb_static.vcxproj.filters new file mode 100644 index 0000000..11fe1fb --- /dev/null +++ b/libusb/libusb/msvc/libusb_static.vcxproj.filters @@ -0,0 +1,56 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + diff --git a/libusb/libusb/msvc/libusb_vs2005.sln b/libusb/libusb/msvc/libusb_vs2005.sln new file mode 100644 index 0000000..6ebb5e6 --- /dev/null +++ b/libusb/libusb/msvc/libusb_vs2005.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (static)", "libusb_static.vcproj", "{5AB6B770-1925-48D5-ABC2-930F3259C020}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (dll)", "libusb_dll.vcproj", "{8224C054-5968-4238-832C-167155E7ECC3}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "listdevs", "listdevs.vcproj", "{98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection + ProjectSection(ProjectDependencies) = postProject + {5AB6B770-1925-48D5-ABC2-930F3259C020} = {5AB6B770-1925-48D5-ABC2-930F3259C020} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Debug|Win32.ActiveCfg = Debug|Win32 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Debug|Win32.Build.0 = Debug|Win32 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Debug|x64.ActiveCfg = Debug|x64 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Debug|x64.Build.0 = Debug|x64 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Release|Win32.ActiveCfg = Release|Win32 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Release|Win32.Build.0 = Release|Win32 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Release|x64.ActiveCfg = Release|x64 + {5AB6B770-1925-48D5-ABC2-930F3259C020}.Release|x64.Build.0 = Release|x64 + {8224C054-5968-4238-832C-167155E7ECC3}.Debug|Win32.ActiveCfg = Debug|Win32 + {8224C054-5968-4238-832C-167155E7ECC3}.Debug|Win32.Build.0 = Debug|Win32 + {8224C054-5968-4238-832C-167155E7ECC3}.Debug|x64.ActiveCfg = Debug|x64 + {8224C054-5968-4238-832C-167155E7ECC3}.Debug|x64.Build.0 = Debug|x64 + {8224C054-5968-4238-832C-167155E7ECC3}.Release|Win32.ActiveCfg = Release|Win32 + {8224C054-5968-4238-832C-167155E7ECC3}.Release|Win32.Build.0 = Release|Win32 + {8224C054-5968-4238-832C-167155E7ECC3}.Release|x64.ActiveCfg = Release|x64 + {8224C054-5968-4238-832C-167155E7ECC3}.Release|x64.Build.0 = Release|x64 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Debug|Win32.ActiveCfg = Debug|Win32 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Debug|Win32.Build.0 = Debug|Win32 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Debug|x64.ActiveCfg = Debug|x64 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Debug|x64.Build.0 = Debug|x64 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Release|Win32.ActiveCfg = Release|Win32 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Release|Win32.Build.0 = Release|Win32 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Release|x64.ActiveCfg = Release|x64 + {98CFD8FA-EE20-40D5-AF13-F8C4856D6CA5}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/libusb/libusb/msvc/libusb_vs2010.sln b/libusb/libusb/msvc/libusb_vs2010.sln new file mode 100644 index 0000000..1160f52 --- /dev/null +++ b/libusb/libusb/msvc/libusb_vs2010.sln @@ -0,0 +1,49 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (static)", "libusb_static.vcxproj", "{349EE8F9-7D25-4909-AAF5-FF3FADE72187}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (dll)", "libusb_dll.vcxproj", "{349EE8FA-7D25-4909-AAF5-FF3FADE72187}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "listdevs", "listdevs.vcxproj", "{F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.ActiveCfg = Debug|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.Build.0 = Debug|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.Build.0 = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.ActiveCfg = Release|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.Build.0 = Release|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.Build.0 = Release|x64 + {349EE8FA-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.ActiveCfg = Debug|Win32 + {349EE8FA-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64 + {349EE8FA-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.ActiveCfg = Release|Win32 + {349EE8FA-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Debug|Win32.ActiveCfg = Debug|Win32 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Debug|Win32.Build.0 = Debug|Win32 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Debug|x64.ActiveCfg = Debug|x64 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Debug|x64.Build.0 = Debug|x64 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Release|Win32.ActiveCfg = Release|Win32 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Release|Win32.Build.0 = Release|Win32 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Release|x64.ActiveCfg = Release|x64 + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87}.Release|x64.Build.0 = Release|x64 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Debug|Win32.ActiveCfg = Debug|Win32 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Debug|Win32.Build.0 = Debug|Win32 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Debug|x64.ActiveCfg = Debug|x64 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Debug|x64.Build.0 = Debug|x64 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Release|Win32.ActiveCfg = Release|Win32 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Release|Win32.Build.0 = Release|Win32 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Release|x64.ActiveCfg = Release|x64 + {3F3138D0-7AB7-4268-9BF3-1A3EA5503A11}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/libusb/libusb/msvc/listdevs.dsp b/libusb/libusb/msvc/listdevs.dsp new file mode 100644 index 0000000..2ed8aec --- /dev/null +++ b/libusb/libusb/msvc/listdevs.dsp @@ -0,0 +1,103 @@ +# Microsoft Developer Studio Project File - Name="listdevs" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=listdevs - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "listdevs.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "listdevs.mak" CFG="listdevs - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "listdevs - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "listdevs - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "listdevs - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../Win32/Release/examples" +# PROP Intermediate_Dir "../Win32/Release/examples/listdevs" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "../libusb" /I "." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /FR /FD /EHsc /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "listdevs - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../Win32/Debug/examples" +# PROP Intermediate_Dir "../Win32/Debug/examples/listdevs" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../libusb" /I "." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /U "_MBCS" /FR /FD /GZ /EHsc /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo /n "../Win32/Debug/dll/core.sbr" "../Win32/Debug/dll/descriptor.sbr" "../Win32/Debug/dll/io.sbr" "../Win32/Debug/dll/sync.sbr" "../Win32/Debug/dll/poll_windows.sbr" "../Win32/Debug/dll/threads_windows.sbr" "../Win32/Debug/dll/windows_usb.sbr" +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "listdevs - Win32 Release" +# Name "listdevs - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\examples\listdevs.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/libusb/libusb/msvc/listdevs.vcproj b/libusb/libusb/msvc/listdevs.vcproj new file mode 100644 index 0000000..cff754e --- /dev/null +++ b/libusb/libusb/msvc/listdevs.vcproj @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libusb/libusb/msvc/listdevs.vcxproj b/libusb/libusb/msvc/listdevs.vcxproj new file mode 100644 index 0000000..b0164bb --- /dev/null +++ b/libusb/libusb/msvc/listdevs.vcxproj @@ -0,0 +1,165 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + listdevs + {F4938DB0-3DE7-4737-9C5A-EAD1BE819F87} + examples + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\$(ProjectName)\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\$(ProjectName)\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\$(ProjectName)\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\ + $(SolutionDir)..\$(Platform)\$(Configuration)\examples\$(ProjectName)\ + + + + $(IntDir)$(ProjectName).htm + + + Disabled + ..\libusb;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + Level3 + ProgramDatabase + + + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(ProjectName).pdb + Console + MachineX86 + + + + + $(IntDir)$(ProjectName).htm + + + X64 + + + Disabled + ..\libusb;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + Level3 + ProgramDatabase + + + %(AdditionalLibraryDirectories) + true + $(TargetDir)$(ProjectName).pdb + Console + MachineX64 + + + + + $(IntDir)$(ProjectName).htm + + + ..\libusb;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + Level3 + + + %(AdditionalLibraryDirectories) + $(TargetDir)$(ProjectName).pdb + Console + MachineX86 + + + + + $(IntDir)$(ProjectName).htm + + + X64 + + + ..\libusb;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + Level3 + + + %(AdditionalLibraryDirectories) + $(TargetDir)$(ProjectName).pdb + Console + MachineX64 + + + + + + + + {349ee8f9-7d25-4909-aaf5-ff3fade72187} + false + + + + + + diff --git a/libusb/libusb/msvc/listdevs.vcxproj.filters b/libusb/libusb/msvc/listdevs.vcxproj.filters new file mode 100644 index 0000000..856fc1c --- /dev/null +++ b/libusb/libusb/msvc/listdevs.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + diff --git a/libusb/libusb/msvc/listdevs_sources b/libusb/libusb/msvc/listdevs_sources new file mode 100644 index 0000000..97a5723 --- /dev/null +++ b/libusb/libusb/msvc/listdevs_sources @@ -0,0 +1,19 @@ +TARGETNAME=listdevs +TARGETTYPE=PROGRAM +386_STDCALL=0 + +_NT_TARGET_VERSION= $(_NT_TARGET_VERSION_WINXP) +!IFNDEF MSC_WARNING_LEVEL +MSC_WARNING_LEVEL=/W3 +!ENDIF + +!IFDEF STATIC_LIBC +USE_LIBCMT=1 +!ELSE +USE_MSVCRT=1 +!ENDIF + +UMTYPE=console +INCLUDES=..\..\libusb;$(DDK_INC_PATH) +UMLIBS=..\..\libusb\os\obj$(BUILD_ALT_DIR)\*\libusb-1.0.lib +SOURCES=..\listdevs.c diff --git a/libusb/libusb/msvc/stdint.h b/libusb/libusb/msvc/stdint.h new file mode 100644 index 0000000..00988d9 --- /dev/null +++ b/libusb/libusb/msvc/stdint.h @@ -0,0 +1,256 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file was originally part of the w64 mingw-runtime package. + */ + +/* ISO C9x 7.18 Integer types + * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794) + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * Contributor: Danny Smith + * Modified for libusb/MSVC: Pete Batard + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Date: 2010-04-02 + */ + +#ifndef _MSC_VER +#error This header should only be used with Microsoft compilers +#endif + +#ifndef _STDINT_H +#define _STDINT_H + +#ifndef _INTPTR_T_DEFINED +#define _INTPTR_T_DEFINED +#ifndef __intptr_t_defined +#define __intptr_t_defined +#undef intptr_t +#ifdef _WIN64 + typedef __int64 intptr_t; +#else + typedef int intptr_t; +#endif /* _WIN64 */ +#endif /* __intptr_t_defined */ +#endif /* _INTPTR_T_DEFINED */ + +#ifndef _UINTPTR_T_DEFINED +#define _UINTPTR_T_DEFINED +#ifndef __uintptr_t_defined +#define __uintptr_t_defined +#undef uintptr_t +#ifdef _WIN64 + typedef unsigned __int64 uintptr_t; +#else + typedef unsigned int uintptr_t; +#endif /* _WIN64 */ +#endif /* __uintptr_t_defined */ +#endif /* _UINTPTR_T_DEFINED */ + +#ifndef _PTRDIFF_T_DEFINED +#define _PTRDIFF_T_DEFINED +#ifndef _PTRDIFF_T_ +#define _PTRDIFF_T_ +#undef ptrdiff_t +#ifdef _WIN64 + typedef __int64 ptrdiff_t; +#else + typedef int ptrdiff_t; +#endif /* _WIN64 */ +#endif /* _PTRDIFF_T_ */ +#endif /* _PTRDIFF_T_DEFINED */ + +#ifndef _WCHAR_T_DEFINED +#define _WCHAR_T_DEFINED +#ifndef __cplusplus + typedef unsigned short wchar_t; +#endif /* C++ */ +#endif /* _WCHAR_T_DEFINED */ + +#ifndef _WCTYPE_T_DEFINED +#define _WCTYPE_T_DEFINED +#ifndef _WINT_T +#define _WINT_T + typedef unsigned short wint_t; + typedef unsigned short wctype_t; +#endif /* _WINT_T */ +#endif /* _WCTYPE_T_DEFINED */ + +/* 7.18.1.1 Exact-width integer types */ +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +/* 7.18.1.2 Minimum-width integer types */ +typedef signed char int_least8_t; +typedef unsigned char uint_least8_t; +typedef short int_least16_t; +typedef unsigned short uint_least16_t; +typedef int int_least32_t; +typedef unsigned uint_least32_t; +typedef __int64 int_least64_t; +typedef unsigned __int64 uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types + * Not actually guaranteed to be fastest for all purposes + * Here we use the exact-width types for 8 and 16-bit ints. + */ +typedef __int8 int_fast8_t; +typedef unsigned __int8 uint_fast8_t; +typedef __int16 int_fast16_t; +typedef unsigned __int16 uint_fast16_t; +typedef __int32 int_fast32_t; +typedef unsigned __int32 uint_fast32_t; +typedef __int64 int_fast64_t; +typedef unsigned __int64 uint_fast64_t; + +/* 7.18.1.5 Greatest-width integer types */ +typedef __int64 intmax_t; +typedef unsigned __int64 uintmax_t; + +/* 7.18.2 Limits of specified-width integer types */ + +/* 7.18.2.1 Limits of exact-width integer types */ +#define INT8_MIN (-128) +#define INT16_MIN (-32768) +#define INT32_MIN (-2147483647 - 1) +#define INT64_MIN (-9223372036854775807LL - 1) + +#define INT8_MAX 127 +#define INT16_MAX 32767 +#define INT32_MAX 2147483647 +#define INT64_MAX 9223372036854775807LL + +#define UINT8_MAX 255 +#define UINT16_MAX 65535 +#define UINT32_MAX 0xffffffffU /* 4294967295U */ +#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */ + +/* 7.18.2.2 Limits of minimum-width integer types */ +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST64_MIN INT64_MIN + +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MAX INT64_MAX + +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST64_MIN INT64_MIN + +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MAX INT64_MAX + +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +/* 7.18.2.4 Limits of integer types capable of holding + object pointers */ +#ifdef _WIN64 +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX +#else +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX +#endif + +/* 7.18.2.5 Limits of greatest-width integer types */ +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +/* 7.18.3 Limits of other integer types */ +#ifdef _WIN64 +#define PTRDIFF_MIN INT64_MIN +#define PTRDIFF_MAX INT64_MAX +#else +#define PTRDIFF_MIN INT32_MIN +#define PTRDIFF_MAX INT32_MAX +#endif + +#define SIG_ATOMIC_MIN INT32_MIN +#define SIG_ATOMIC_MAX INT32_MAX + +#ifndef SIZE_MAX +#ifdef _WIN64 +#define SIZE_MAX UINT64_MAX +#else +#define SIZE_MAX UINT32_MAX +#endif +#endif + +#ifndef WCHAR_MIN /* also in wchar.h */ +#define WCHAR_MIN 0U +#define WCHAR_MAX 0xffffU +#endif + +/* + * wint_t is unsigned short for compatibility with MS runtime + */ +#define WINT_MIN 0U +#define WINT_MAX 0xffffU + + +/* 7.18.4 Macros for integer constants */ + +/* 7.18.4.1 Macros for minimum-width integer constants + + Accoding to Douglas Gwyn : + "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC + 9899:1999 as initially published, the expansion was required + to be an integer constant of precisely matching type, which + is impossible to accomplish for the shorter types on most + platforms, because C99 provides no standard way to designate + an integer constant with width less than that of type int. + TC1 changed this to require just an integer constant + *expression* with *promoted* type." + + The trick used here is from Clive D W Feather. +*/ + +#define INT8_C(val) (INT_LEAST8_MAX-INT_LEAST8_MAX+(val)) +#define INT16_C(val) (INT_LEAST16_MAX-INT_LEAST16_MAX+(val)) +#define INT32_C(val) (INT_LEAST32_MAX-INT_LEAST32_MAX+(val)) +/* The 'trick' doesn't work in C89 for long long because, without + suffix, (val) will be evaluated as int, not intmax_t */ +#define INT64_C(val) val##i64 + +#define UINT8_C(val) (val) +#define UINT16_C(val) (val) +#define UINT32_C(val) (val##i32) +#define UINT64_C(val) val##ui64 + +/* 7.18.4.2 Macros for greatest-width integer constants */ +#define INTMAX_C(val) val##i64 +#define UINTMAX_C(val) val##ui64 + +#endif diff --git a/libusb/libusb/tests/Makefile.am b/libusb/libusb/tests/Makefile.am deleted file mode 100644 index d9d6102..0000000 --- a/libusb/libusb/tests/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) $(all_includes) - -if LINUX_API -OS_SPECIFIC = driver_name -OS_SPECIFIC_XFAIL = driver_name -endif - -noinst_PROGRAMS = testlibusb descriptor_test id_test find_hubs find_mice \ - get_resolution hub_strings $(OS_SPECIFIC) - -testlibusb_LDADD = $(top_builddir)/libusb.la @OSLIBS@ - -descriptor_test_SOURCES = descriptor_test.cpp -descriptor_test_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -id_test_SOURCES = id_test.cpp -id_test_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -find_hubs_SOURCES = find_hubs.cpp -find_hubs_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -find_mice_SOURCES = find_mice.cpp -find_mice_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -get_resolution_SOURCES = get_resolution.cpp -get_resolution_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -hub_strings_SOURCES = hub_strings.cpp -hub_strings_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -driver_name_SOURCES = driver_name.cpp -driver_name_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ - -TESTS = testlibusb descriptor_test id_test find_hubs find_mice \ - get_resolution hub_strings $(OS_SPECIFIC) -XFAIL_TESTS = get_resolution hub_strings $(OS_SPECIFIC_XFAIL) - diff --git a/libusb/libusb/tests/Makefile.in b/libusb/libusb/tests/Makefile.in deleted file mode 100644 index 9964f0c..0000000 --- a/libusb/libusb/tests/Makefile.in +++ /dev/null @@ -1,707 +0,0 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -noinst_PROGRAMS = testlibusb$(EXEEXT) descriptor_test$(EXEEXT) \ - id_test$(EXEEXT) find_hubs$(EXEEXT) find_mice$(EXEEXT) \ - get_resolution$(EXEEXT) hub_strings$(EXEEXT) $(am__EXEEXT_1) -TESTS = testlibusb$(EXEEXT) descriptor_test$(EXEEXT) id_test$(EXEEXT) \ - find_hubs$(EXEEXT) find_mice$(EXEEXT) get_resolution$(EXEEXT) \ - hub_strings$(EXEEXT) $(am__EXEEXT_1) -XFAIL_TESTS = get_resolution$(EXEEXT) hub_strings$(EXEEXT) \ - $(am__EXEEXT_1) -subdir = tests -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -@LINUX_API_TRUE@am__EXEEXT_1 = driver_name$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) -am_descriptor_test_OBJECTS = descriptor_test.$(OBJEXT) -descriptor_test_OBJECTS = $(am_descriptor_test_OBJECTS) -descriptor_test_DEPENDENCIES = $(top_builddir)/libusbpp.la -am_driver_name_OBJECTS = driver_name.$(OBJEXT) -driver_name_OBJECTS = $(am_driver_name_OBJECTS) -driver_name_DEPENDENCIES = $(top_builddir)/libusbpp.la -am_find_hubs_OBJECTS = find_hubs.$(OBJEXT) -find_hubs_OBJECTS = $(am_find_hubs_OBJECTS) -find_hubs_DEPENDENCIES = $(top_builddir)/libusbpp.la -am_find_mice_OBJECTS = find_mice.$(OBJEXT) -find_mice_OBJECTS = $(am_find_mice_OBJECTS) -find_mice_DEPENDENCIES = $(top_builddir)/libusbpp.la -am_get_resolution_OBJECTS = get_resolution.$(OBJEXT) -get_resolution_OBJECTS = $(am_get_resolution_OBJECTS) -get_resolution_DEPENDENCIES = $(top_builddir)/libusbpp.la -am_hub_strings_OBJECTS = hub_strings.$(OBJEXT) -hub_strings_OBJECTS = $(am_hub_strings_OBJECTS) -hub_strings_DEPENDENCIES = $(top_builddir)/libusbpp.la -am_id_test_OBJECTS = id_test.$(OBJEXT) -id_test_OBJECTS = $(am_id_test_OBJECTS) -id_test_DEPENDENCIES = $(top_builddir)/libusbpp.la -testlibusb_SOURCES = testlibusb.c -testlibusb_OBJECTS = testlibusb.$(OBJEXT) -testlibusb_DEPENDENCIES = $(top_builddir)/libusb.la -DEFAULT_INCLUDES = -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(descriptor_test_SOURCES) $(driver_name_SOURCES) \ - $(find_hubs_SOURCES) $(find_mice_SOURCES) \ - $(get_resolution_SOURCES) $(hub_strings_SOURCES) \ - $(id_test_SOURCES) testlibusb.c -DIST_SOURCES = $(descriptor_test_SOURCES) $(driver_name_SOURCES) \ - $(find_hubs_SOURCES) $(find_mice_SOURCES) \ - $(get_resolution_SOURCES) $(hub_strings_SOURCES) \ - $(id_test_SOURCES) testlibusb.c -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BIGENDIAN = @BIGENDIAN@ -BSD_API = @BSD_API@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DARWIN_API = @DARWIN_API@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DOXYGEN = @DOXYGEN@ -DOXYGEN_PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ -DOXYGEN_PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -JADE = @JADE@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIBUSB_BINARY_AGE = @LIBUSB_BINARY_AGE@ -LIBUSB_HAS_DOXYGEN = @LIBUSB_HAS_DOXYGEN@ -LIBUSB_HAVE_DOT = @LIBUSB_HAVE_DOT@ -LIBUSB_INTERFACE_AGE = @LIBUSB_INTERFACE_AGE@ -LIBUSB_MAJOR_VERSION = @LIBUSB_MAJOR_VERSION@ -LIBUSB_MICRO_VERSION = @LIBUSB_MICRO_VERSION@ -LIBUSB_MINOR_VERSION = @LIBUSB_MINOR_VERSION@ -LIBUSB_VERSION = @LIBUSB_VERSION@ -LINUX_API = @LINUX_API@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -LT_AGE = @LT_AGE@ -LT_CURRENT = @LT_CURRENT@ -LT_RELEASE = @LT_RELEASE@ -LT_REVISION = @LT_REVISION@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OSLIBS = @OSLIBS@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -pkgconfigdir = @pkgconfigdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) $(all_includes) -@LINUX_API_TRUE@OS_SPECIFIC = driver_name -@LINUX_API_TRUE@OS_SPECIFIC_XFAIL = driver_name -testlibusb_LDADD = $(top_builddir)/libusb.la @OSLIBS@ -descriptor_test_SOURCES = descriptor_test.cpp -descriptor_test_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -id_test_SOURCES = id_test.cpp -id_test_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -find_hubs_SOURCES = find_hubs.cpp -find_hubs_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -find_mice_SOURCES = find_mice.cpp -find_mice_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -get_resolution_SOURCES = get_resolution.cpp -get_resolution_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -hub_strings_SOURCES = hub_strings.cpp -hub_strings_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -driver_name_SOURCES = driver_name.cpp -driver_name_LDADD = $(top_builddir)/libusbpp.la @OSLIBS@ -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .cpp .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu tests/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -descriptor_test$(EXEEXT): $(descriptor_test_OBJECTS) $(descriptor_test_DEPENDENCIES) - @rm -f descriptor_test$(EXEEXT) - $(CXXLINK) $(descriptor_test_OBJECTS) $(descriptor_test_LDADD) $(LIBS) -driver_name$(EXEEXT): $(driver_name_OBJECTS) $(driver_name_DEPENDENCIES) - @rm -f driver_name$(EXEEXT) - $(CXXLINK) $(driver_name_OBJECTS) $(driver_name_LDADD) $(LIBS) -find_hubs$(EXEEXT): $(find_hubs_OBJECTS) $(find_hubs_DEPENDENCIES) - @rm -f find_hubs$(EXEEXT) - $(CXXLINK) $(find_hubs_OBJECTS) $(find_hubs_LDADD) $(LIBS) -find_mice$(EXEEXT): $(find_mice_OBJECTS) $(find_mice_DEPENDENCIES) - @rm -f find_mice$(EXEEXT) - $(CXXLINK) $(find_mice_OBJECTS) $(find_mice_LDADD) $(LIBS) -get_resolution$(EXEEXT): $(get_resolution_OBJECTS) $(get_resolution_DEPENDENCIES) - @rm -f get_resolution$(EXEEXT) - $(CXXLINK) $(get_resolution_OBJECTS) $(get_resolution_LDADD) $(LIBS) -hub_strings$(EXEEXT): $(hub_strings_OBJECTS) $(hub_strings_DEPENDENCIES) - @rm -f hub_strings$(EXEEXT) - $(CXXLINK) $(hub_strings_OBJECTS) $(hub_strings_LDADD) $(LIBS) -id_test$(EXEEXT): $(id_test_OBJECTS) $(id_test_DEPENDENCIES) - @rm -f id_test$(EXEEXT) - $(CXXLINK) $(id_test_OBJECTS) $(id_test_LDADD) $(LIBS) -testlibusb$(EXEEXT): $(testlibusb_OBJECTS) $(testlibusb_DEPENDENCIES) - @rm -f testlibusb$(EXEEXT) - $(LINK) $(testlibusb_OBJECTS) $(testlibusb_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/descriptor_test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver_name.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/find_hubs.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/find_mice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_resolution.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hub_strings.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id_test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testlibusb.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< - -.c.obj: -@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -.cpp.o: -@am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cpp.lo: -@am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ - fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ - else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: check-am install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-generic clean-libtool clean-noinstPROGRAMS ctags \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libusb/libusb/tests/descriptor_test.cpp b/libusb/libusb/tests/descriptor_test.cpp deleted file mode 100644 index bb1b23b..0000000 --- a/libusb/libusb/tests/descriptor_test.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * descriptor_test.cpp - * - * Test suite program for C++ bindings - */ - -#include -#include -#include "usbpp.h" - -using namespace std; - -int main(void) -{ - - USB::Busses buslist; - - cout << "bus/device idVendor/idProduct" << endl; - - // buslist.init(); - - USB::Bus *bus; - list::const_iterator biter; - USB::Device *device; - list::const_iterator diter; - int i, j, k, l; - - for (biter = buslist.begin(); biter != buslist.end(); biter++) { - bus = *biter; - - for (diter = bus->begin(); diter != bus->end(); diter++) { - device = *diter; - - cout << bus->directoryName() << "/" - << device->fileName() << " " - << ios::uppercase << hex << setw(4) << setfill('0') - << device->idVendor() << "/" - << ios::uppercase << hex << setw(4) << setfill('0') - << device->idProduct() << endl; - if (device->Vendor() != "") { - cout << "- Manufacturer : " << device->Vendor() << endl; - } else { - cout << "- Unable to fetch manufacturer string" << endl; - } - if (device->Product() != "") { - cout << "- Product : " << device->Product() << endl; - } else { - cout << "- Unable to fetch product string" << endl; - } - if (device->SerialNumber() != "") { - cout << "- Serial Number: " << device->SerialNumber() << endl; - } - - USB::Configuration *this_Configuration; - this_Configuration = device->firstConfiguration(); - for (i=0; i < device->numConfigurations(); i++) { - this_Configuration->dumpDescriptor(); - USB::Interface *this_Interface; - this_Interface = this_Configuration->firstInterface(); - for (j=0; j < this_Configuration->numInterfaces(); j++) { - USB::AltSetting *this_AltSetting; - this_AltSetting = this_Interface->firstAltSetting(); - for (k=0; k < this_Interface->numAltSettings(); k++) { - this_AltSetting->dumpDescriptor(); - USB::Endpoint *this_Endpoint; - this_Endpoint = this_AltSetting->firstEndpoint(); - for (l=0; l < this_AltSetting->numEndpoints(); l++) { - this_Endpoint->dumpDescriptor(); - this_Endpoint = this_AltSetting->nextEndpoint(); - } - this_AltSetting = this_Interface->nextAltSetting(); - } - this_Interface = this_Configuration->nextInterface(); - } - this_Configuration = device->nextConfiguration(); - } - } - } - - return 0; -} diff --git a/libusb/libusb/tests/driver_name.cpp b/libusb/libusb/tests/driver_name.cpp deleted file mode 100644 index a797b04..0000000 --- a/libusb/libusb/tests/driver_name.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * driver_name.cpp - * - * Test suite program for C++ bindings - */ - -#include -#include -#include - -using namespace std; - -int main(void) -{ - USB::Busses buslist; - - cout << "bus/device idVendor/idProduct" << endl; - - // buslist.init(); - - USB::Bus *bus; - list::const_iterator biter; - USB::Device *device; - list::const_iterator diter; - int i, j; - int retval; - string driver; - - for (biter = buslist.begin(); biter != buslist.end(); biter++) { - bus = *biter; - - for (diter = bus->begin(); diter != bus->end(); diter++) { - device = *diter; - - USB::Configuration *this_Configuration; - this_Configuration = device->firstConfiguration(); - for (i=0; i < device->numConfigurations(); i++) { - USB::Interface *this_Interface; - this_Interface = this_Configuration->firstInterface(); - for (j=0; j < this_Configuration->numInterfaces(); j++) { - retval = this_Interface->driverName(driver); - if (0 == retval) { - cout << bus->directoryName() << "/" - << device->fileName() << " " - << ios::uppercase << hex << setw(4) << setfill('0') - << device->idVendor() << "/" - << ios::uppercase << hex << setw(4) << setfill('0') - << device->idProduct() << " " - << "driver: " << driver << endl; - } else { - cout << "fetching driver string failed (" << retval << "): " << usb_strerror() << endl; - return EXIT_FAILURE; - } - this_Interface = this_Configuration->nextInterface(); - } - this_Configuration = device->nextConfiguration(); - } - } - } - - return 0; -} diff --git a/libusb/libusb/tests/find_hubs.cpp b/libusb/libusb/tests/find_hubs.cpp deleted file mode 100644 index e05d486..0000000 --- a/libusb/libusb/tests/find_hubs.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * find_hubs.cpp - * - * Test suite program for C++ bindings - */ - -#include -#include -#include - -using namespace std; - -int main(void) -{ - - USB::Busses buslist; - USB::Device *device; - list hubList; - list::const_iterator iter; - - cout << "Class/SubClass/Protocol" << endl; - - hubList = buslist.match(0x9); - - for (iter = hubList.begin(); iter != hubList.end(); iter++) { - device = *iter; - cout << hex << setw(2) << setfill('0') - << int(device->devClass()) << " " - << hex << setw(2) << setfill('0') - << int(device->devSubClass()) << " " - << hex << setw(2) << setfill('0') - << int(device->devProtocol()) << endl; - } - - return 0; -} diff --git a/libusb/libusb/tests/find_mice.cpp b/libusb/libusb/tests/find_mice.cpp deleted file mode 100644 index ce91b4d..0000000 --- a/libusb/libusb/tests/find_mice.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * find_mice.cpp - * - * Test suite program for C++ bindings - */ - -#include -#include -#include - -#define VENDOR_LOGITECH 0x046D - -using namespace std; - -int main(void) -{ - - USB::Busses buslist; - USB::Device *device; - list miceFound; - list::const_iterator iter; - - cout << "idVendor/idProduct/bcdDevice" << endl; - - USB::DeviceIDList mouseList; - - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC00E)); // Wheel Mouse Optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC012)); // MouseMan Dual Optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC00F)); // MouseMan Traveler - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC024)); // MX300 Optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC025)); // MX500 Optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC503)); // Logitech Dual receiver - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC506)); // MX700 Optical Mouse - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC031)); // iFeel Mouse (silver) - - - miceFound = buslist.match(mouseList); - - for (iter = miceFound.begin(); iter != miceFound.end(); iter++) { - device = *iter; - - cout << hex << setw(4) << setfill('0') - << device->idVendor() << " / " - << hex << setw(4) << setfill('0') - << device->idProduct() << " / " - << hex << setw(4) << setfill('0') - << device->idRevision() << " " - << endl; - } - - return 0; -} diff --git a/libusb/libusb/tests/get_resolution.cpp b/libusb/libusb/tests/get_resolution.cpp deleted file mode 100644 index ddf2d87..0000000 --- a/libusb/libusb/tests/get_resolution.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * get_resolution.cpp - * - * Note that this testcase fails if not run as root - * - * Test suite program for C++ bindings - */ - -#include -#include -#include - -#define VENDOR_LOGITECH 0x046D - -using namespace std; - -int main(void) -{ - USB::Busses buslist; - USB::Device *device; - list miceFound; - list::const_iterator iter; - unsigned char resolution[1]; - - resolution[0] = 'Z'; - - cout << "idVendor/idProduct/bcdDevice" << endl; - - USB::DeviceIDList mouseList; - - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC00E)); // Wheel Mouse Optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC012)); // MouseMan Dual Optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC00F)); // MouseMan Traveler - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC024)); // MX300 optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC025)); // MX500 optical - mouseList.push_back(USB::DeviceID(VENDOR_LOGITECH, 0xC031)); // iFeel Mouse (silver) - - miceFound = buslist.match(mouseList); - - for (iter = miceFound.begin(); iter != miceFound.end(); iter++) { - device = *iter; - cout << hex << setw(4) << setfill('0') - << device->idVendor() << " / " - << hex << setw(4) << setfill('0') - << device->idProduct() << " / " - << hex << setw(4) << setfill('0') - << device->idRevision() << " " - << endl; - - if ( 0 > device->controlTransfer(USB_TYPE_VENDOR | USB_ENDPOINT_IN, - 0x01, - 0x000E, - 0x0000, - 0x0001, - resolution) ) { - cout << "control transfer test failed: " << usb_strerror() << endl; - return EXIT_FAILURE; - } - - if (3 == resolution[0]) { - cout << "Resolution is 400cpi" << endl; - } else if (4 == resolution[0]) { - cout << "Resolution is 800cpi" << endl; - } else { - cout << "Unexpected resolution result" << endl; - } - } - - return 0; -} diff --git a/libusb/libusb/tests/hub_strings.cpp b/libusb/libusb/tests/hub_strings.cpp deleted file mode 100644 index 1eaaa3b..0000000 --- a/libusb/libusb/tests/hub_strings.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * hub_strings.cpp - * - * Test suite program for C++ bindings - */ - -#include -#include -#include -#include - -using namespace std; - -int main(void) -{ - USB::Busses buslist; - USB::Device *device; - list hubList; - list::const_iterator iter; - string manufString, prodString, serialString1, serialString2; - int retval; - - cout << "Class/SubClass/Protocol" << endl; - - hubList = buslist.match(0x9); - - for (iter = hubList.begin(); iter != hubList.end(); iter++) { - device = *iter; - - cout << hex << setw(2) << setfill('0') - << int(device->devClass()) << " " - << hex << setw(2) << setfill('0') - << int(device->devSubClass()) << " " - << hex << setw(2) << setfill('0') - << int(device->devProtocol()) << endl; - retval = device->string(manufString, 3); - if ( 0 < retval ) { - cout << "3: " << manufString << endl; - } else { - if (-EPIPE != retval) { // we ignore EPIPE, because some hubs don't have strings - cout << "fetching string 3 failed: " << usb_strerror() << endl; - return EXIT_FAILURE; - } - } - retval = device->string(prodString, 2); - if ( 0 < retval ) { - cout << "2: " << prodString << endl; - } else { - if (-EPIPE != retval) { // we ignore EPIPE, because some hubs don't have strings - cout << "fetching string 2 failed: " << usb_strerror() << endl; - return EXIT_FAILURE; - } - } - - retval = device->string(serialString1, 1); - if ( 0 < retval ) { - cout << "1a: " << serialString1 << endl; - } else { - if (-EPIPE != retval) { // we ignore EPIPE, because some hubs don't have strings - cout << "fetching string 1a failed: " << usb_strerror() << endl; - return EXIT_FAILURE; - } - } - - retval = device->string(serialString2, 1, 0x0409); - if ( 0 < retval ) { - cout << "1b: " << serialString2 << endl; - if (serialString2 != serialString1) { - cout << "String fetch with explicit language ID produced different result" << endl; - } - } else { - if (-EPIPE != retval) { // we ignore EPIPE, because some hubs don't have strings - cout << "fetching string 1b failed: " << usb_strerror() << endl; - return EXIT_FAILURE; - } - } - - cout << endl; - } - - return EXIT_SUCCESS; -} diff --git a/libusb/libusb/tests/id_test.cpp b/libusb/libusb/tests/id_test.cpp deleted file mode 100644 index 4b5c9fe..0000000 --- a/libusb/libusb/tests/id_test.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * id_test.cpp - * - * Test suite program for C++ bindings - */ - -#include -#include -#include - -using namespace std; - -int main(void) -{ - - USB::Busses buslist; - - cout << "bus/device idVendor/idProduct/bcdDevice Class/SubClass/Protocol" << endl; - - USB::Bus *bus; - list::const_iterator biter; - USB::Device *device; - list::const_iterator diter; - - for (biter = buslist.begin(); biter != buslist.end(); biter++) { - bus = *biter; - - for (diter = bus->begin(); diter != bus->end(); diter++) { - device = *diter; - - cout << bus->directoryName() << "/" - << device->fileName() << " " - << hex << setw(4) << setfill('0') - << device->idVendor() << " / " - << hex << setw(4) << setfill('0') - << device->idProduct() << " / " - << hex << setw(4) << setfill('0') - << device->idRevision() << " " - << hex << setw(2) << setfill('0') - << int(device->devClass()) << " " - << hex << setw(2) << setfill('0') - << int(device->devSubClass()) << " " - << hex << setw(2) << setfill('0') - << int(device->devProtocol()) << endl; - } - } - - return 0; -} diff --git a/libusb/libusb/tests/testlibusb.c b/libusb/libusb/tests/testlibusb.c deleted file mode 100644 index 4ca0b59..0000000 --- a/libusb/libusb/tests/testlibusb.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * testlibusb.c - * - * Test suite program - */ - -#include -#include -#include - -int verbose = 0; - -void print_endpoint(struct usb_endpoint_descriptor *endpoint) -{ - printf(" bEndpointAddress: %02xh\n", endpoint->bEndpointAddress); - printf(" bmAttributes: %02xh\n", endpoint->bmAttributes); - printf(" wMaxPacketSize: %d\n", endpoint->wMaxPacketSize); - printf(" bInterval: %d\n", endpoint->bInterval); - printf(" bRefresh: %d\n", endpoint->bRefresh); - printf(" bSynchAddress: %d\n", endpoint->bSynchAddress); -} - -void print_altsetting(struct usb_interface_descriptor *interface) -{ - int i; - - printf(" bInterfaceNumber: %d\n", interface->bInterfaceNumber); - printf(" bAlternateSetting: %d\n", interface->bAlternateSetting); - printf(" bNumEndpoints: %d\n", interface->bNumEndpoints); - printf(" bInterfaceClass: %d\n", interface->bInterfaceClass); - printf(" bInterfaceSubClass: %d\n", interface->bInterfaceSubClass); - printf(" bInterfaceProtocol: %d\n", interface->bInterfaceProtocol); - printf(" iInterface: %d\n", interface->iInterface); - - for (i = 0; i < interface->bNumEndpoints; i++) - print_endpoint(&interface->endpoint[i]); -} - -void print_interface(struct usb_interface *interface) -{ - int i; - - for (i = 0; i < interface->num_altsetting; i++) - print_altsetting(&interface->altsetting[i]); -} - -void print_configuration(struct usb_config_descriptor *config) -{ - int i; - - printf(" wTotalLength: %d\n", config->wTotalLength); - printf(" bNumInterfaces: %d\n", config->bNumInterfaces); - printf(" bConfigurationValue: %d\n", config->bConfigurationValue); - printf(" iConfiguration: %d\n", config->iConfiguration); - printf(" bmAttributes: %02xh\n", config->bmAttributes); - printf(" MaxPower: %d\n", config->MaxPower); - - for (i = 0; i < config->bNumInterfaces; i++) - print_interface(&config->interface[i]); -} - -int print_device(struct usb_device *dev, int level) -{ - usb_dev_handle *udev; - char description[256]; - char string[256]; - int ret, i; - - udev = usb_open(dev); - if (udev) { - if (dev->descriptor.iManufacturer) { - ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer, string, sizeof(string)); - if (ret > 0) - snprintf(description, sizeof(description), "%s - ", string); - else - snprintf(description, sizeof(description), "%04X - ", - dev->descriptor.idVendor); - } else - snprintf(description, sizeof(description), "%04X - ", - dev->descriptor.idVendor); - - if (dev->descriptor.iProduct) { - ret = usb_get_string_simple(udev, dev->descriptor.iProduct, string, sizeof(string)); - if (ret > 0) - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%s", string); - else - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%04X", dev->descriptor.idProduct); - } else - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%04X", dev->descriptor.idProduct); - - } else - snprintf(description, sizeof(description), "%04X - %04X", - dev->descriptor.idVendor, dev->descriptor.idProduct); - - printf("%.*sDev #%d: %s\n", level * 2, " ", dev->devnum, - description); - - if (udev && verbose) { - if (dev->descriptor.iSerialNumber) { - ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); - if (ret > 0) - printf("%.*s - Serial Number: %s\n", level * 2, - " ", string); - } - } - - if (udev) - usb_close(udev); - - if (verbose) { - if (!dev->config) { - printf(" Couldn't retrieve descriptors\n"); - return 0; - } - - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) - print_configuration(&dev->config[i]); - } else { - for (i = 0; i < dev->num_children; i++) - print_device(dev->children[i], level + 1); - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - struct usb_bus *bus; - - if (argc > 1 && !strcmp(argv[1], "-v")) - verbose = 1; - - usb_init(); - - usb_find_busses(); - usb_find_devices(); - - for (bus = usb_busses; bus; bus = bus->next) { - if (bus->root_dev && !verbose) - print_device(bus->root_dev, 0); - else { - struct usb_device *dev; - - for (dev = bus->devices; dev; dev = dev->next) - print_device(dev, 0); - } - } - - return 0; -} - diff --git a/libusb/libusb/usb.c b/libusb/libusb/usb.c deleted file mode 100644 index 9b8773e..0000000 --- a/libusb/libusb/usb.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Main API entry point - * - * Copyright (c) 2000-2003 Johannes Erdfelt - * - * This library is covered by the LGPL, read LICENSE for details. - */ - -#include /* getenv */ -#include /* stderr */ -#include /* strcmp */ -#include - -#include "usbi.h" - -int usb_debug = 0; -struct usb_bus *usb_busses = NULL; - -int usb_find_busses(void) -{ - struct usb_bus *busses, *bus; - int ret, changes = 0; - - ret = usb_os_find_busses(&busses); - if (ret < 0) - return ret; - - /* - * Now walk through all of the busses we know about and compare against - * this new list. Any duplicates will be removed from the new list. - * If we don't find it in the new list, the bus was removed. Any - * busses still in the new list, are new to us. - */ - bus = usb_busses; - while (bus) { - int found = 0; - struct usb_bus *nbus, *tbus = bus->next; - - nbus = busses; - while (nbus) { - struct usb_bus *tnbus = nbus->next; - - if (!strcmp(bus->dirname, nbus->dirname)) { - /* Remove it from the new busses list */ - LIST_DEL(busses, nbus); - - usb_free_bus(nbus); - found = 1; - break; - } - - nbus = tnbus; - } - - if (!found) { - /* The bus was removed from the system */ - LIST_DEL(usb_busses, bus); - usb_free_bus(bus); - changes++; - } - - bus = tbus; - } - - /* - * Anything on the *busses list is new. So add them to usb_busses and - * process them like the new bus it is. - */ - bus = busses; - while (bus) { - struct usb_bus *tbus = bus->next; - - /* - * Remove it from the temporary list first and add it to the real - * usb_busses list. - */ - LIST_DEL(busses, bus); - - LIST_ADD(usb_busses, bus); - - changes++; - - bus = tbus; - } - - return changes; -} - -int usb_find_devices(void) -{ - struct usb_bus *bus; - int ret, changes = 0; - - for (bus = usb_busses; bus; bus = bus->next) { - struct usb_device *devices, *dev; - - /* Find all of the devices and put them into a temporary list */ - ret = usb_os_find_devices(bus, &devices); - if (ret < 0) - return ret; - - /* - * Now walk through all of the devices we know about and compare - * against this new list. Any duplicates will be removed from the new - * list. If we don't find it in the new list, the device was removed. - * Any devices still in the new list, are new to us. - */ - dev = bus->devices; - while (dev) { - int found = 0; - struct usb_device *ndev, *tdev = dev->next; - - ndev = devices; - while (ndev) { - struct usb_device *tndev = ndev->next; - - if (!strcmp(dev->filename, ndev->filename)) { - /* Remove it from the new devices list */ - LIST_DEL(devices, ndev); - - usb_free_dev(ndev); - found = 1; - break; - } - - ndev = tndev; - } - - if (!found) { - /* The device was removed from the system */ - LIST_DEL(bus->devices, dev); - usb_free_dev(dev); - changes++; - } - - dev = tdev; - } - - /* - * Anything on the *devices list is new. So add them to bus->devices and - * process them like the new device it is. - */ - dev = devices; - while (dev) { - struct usb_device *tdev = dev->next; - - /* - * Remove it from the temporary list first and add it to the real - * bus->devices list. - */ - LIST_DEL(devices, dev); - - LIST_ADD(bus->devices, dev); - - /* - * Some ports fetch the descriptors on scanning (like Linux) so we don't - * need to fetch them again. - */ - if (!dev->config) { - usb_dev_handle *udev; - - udev = usb_open(dev); - if (udev) { - usb_fetch_and_parse_descriptors(udev); - - usb_close(udev); - } - } - - changes++; - - dev = tdev; - } - - usb_os_determine_children(bus); - } - - return changes; -} - -void usb_set_debug(int level) -{ - if (usb_debug || level) - fprintf(stderr, "usb_set_debug: Setting debugging level to %d (%s)\n", - level, level ? "on" : "off"); - - usb_debug = level; -} - -void usb_init(void) -{ - if (getenv("USB_DEBUG")) - usb_set_debug(atoi(getenv("USB_DEBUG"))); - - usb_os_init(); -} - -usb_dev_handle *usb_open(struct usb_device *dev) -{ - usb_dev_handle *udev; - - udev = malloc(sizeof(*udev)); - if (!udev) - return NULL; - - udev->fd = -1; - udev->device = dev; - udev->bus = dev->bus; - udev->config = udev->interface = udev->altsetting = -1; - - if (usb_os_open(udev) < 0) { - free(udev); - return NULL; - } - - return udev; -} - -int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, - size_t buflen) -{ - /* - * We can't use usb_get_descriptor() because it's lacking the index - * parameter. This will be fixed in libusb 1.0 - */ - return usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, - (USB_DT_STRING << 8) + index, langid, buf, buflen, 1000); -} - -int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen) -{ - char tbuf[255]; /* Some devices choke on size > 255 */ - int ret, langid, si, di; - - /* - * Asking for the zero'th index is special - it returns a string - * descriptor that contains all the language IDs supported by the - * device. Typically there aren't many - often only one. The - * language IDs are 16 bit numbers, and they start at the third byte - * in the descriptor. See USB 2.0 specification, section 9.6.7, for - * more information on this. */ - ret = usb_get_string(dev, 0, 0, tbuf, sizeof(tbuf)); - if (ret < 0) - return ret; - - if (ret < 4) - return -EIO; - - langid = tbuf[2] | (tbuf[3] << 8); - - ret = usb_get_string(dev, index, langid, tbuf, sizeof(tbuf)); - if (ret < 0) - return ret; - - if (tbuf[1] != USB_DT_STRING) - return -EIO; - - if (tbuf[0] > ret) - return -EFBIG; - - for (di = 0, si = 2; si < tbuf[0]; si += 2) { - if (di >= (buflen - 1)) - break; - - if (tbuf[si + 1]) /* high byte */ - buf[di++] = '?'; - else - buf[di++] = tbuf[si]; - } - - buf[di] = 0; - - return di; -} - -int usb_close(usb_dev_handle *dev) -{ - int ret; - - ret = usb_os_close(dev); - free(dev); - - return ret; -} - -struct usb_device *usb_device(usb_dev_handle *dev) -{ - return dev->device; -} - -void usb_free_dev(struct usb_device *dev) -{ - usb_destroy_configuration(dev); - free(dev->children); - free(dev); -} - -struct usb_bus *usb_get_busses(void) -{ - return usb_busses; -} - -void usb_free_bus(struct usb_bus *bus) -{ - free(bus); -} - diff --git a/libusb/libusb/usb.h.in b/libusb/libusb/usb.h.in deleted file mode 100644 index 443c7c0..0000000 --- a/libusb/libusb/usb.h.in +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Prototypes, structure definitions and macros. - * - * Copyright (c) 2000-2003 Johannes Erdfelt - * - * This library is covered by the LGPL, read LICENSE for details. - * - * This file (and only this file) may alternatively be licensed under the - * BSD license as well, read LICENSE for details. - */ -#ifndef __USB_H__ -#define __USB_H__ - -#include -#include -#include - -#include - -/* - * USB spec information - * - * This is all stuff grabbed from various USB specs and is pretty much - * not subject to change - */ - -/* - * Device and/or Interface Class codes - */ -#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ -#define USB_CLASS_AUDIO 1 -#define USB_CLASS_COMM 2 -#define USB_CLASS_HID 3 -#define USB_CLASS_PRINTER 7 -#define USB_CLASS_PTP 6 -#define USB_CLASS_MASS_STORAGE 8 -#define USB_CLASS_HUB 9 -#define USB_CLASS_DATA 10 -#define USB_CLASS_VENDOR_SPEC 0xff - -/* - * Descriptor types - */ -#define USB_DT_DEVICE 0x01 -#define USB_DT_CONFIG 0x02 -#define USB_DT_STRING 0x03 -#define USB_DT_INTERFACE 0x04 -#define USB_DT_ENDPOINT 0x05 - -#define USB_DT_HID 0x21 -#define USB_DT_REPORT 0x22 -#define USB_DT_PHYSICAL 0x23 -#define USB_DT_HUB 0x29 - -/* - * Descriptor sizes per descriptor type - */ -#define USB_DT_DEVICE_SIZE 18 -#define USB_DT_CONFIG_SIZE 9 -#define USB_DT_INTERFACE_SIZE 9 -#define USB_DT_ENDPOINT_SIZE 7 -#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ -#define USB_DT_HUB_NONVAR_SIZE 7 - -/* All standard descriptors have these 2 fields in common */ -struct usb_descriptor_header { - u_int8_t bLength; - u_int8_t bDescriptorType; -}; - -/* String descriptor */ -struct usb_string_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int16_t wData[1]; -}; - -/* HID descriptor */ -struct usb_hid_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int16_t bcdHID; - u_int8_t bCountryCode; - u_int8_t bNumDescriptors; - /* u_int8_t bReportDescriptorType; */ - /* u_int16_t wDescriptorLength; */ - /* ... */ -}; - -/* Endpoint descriptor */ -#define USB_MAXENDPOINTS 32 -struct usb_endpoint_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int8_t bEndpointAddress; - u_int8_t bmAttributes; - u_int16_t wMaxPacketSize; - u_int8_t bInterval; - u_int8_t bRefresh; - u_int8_t bSynchAddress; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -#define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 - -#define USB_ENDPOINT_TYPE_MASK 0x03 /* in bmAttributes */ -#define USB_ENDPOINT_TYPE_CONTROL 0 -#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 -#define USB_ENDPOINT_TYPE_BULK 2 -#define USB_ENDPOINT_TYPE_INTERRUPT 3 - -/* Interface descriptor */ -#define USB_MAXINTERFACES 32 -struct usb_interface_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int8_t bInterfaceNumber; - u_int8_t bAlternateSetting; - u_int8_t bNumEndpoints; - u_int8_t bInterfaceClass; - u_int8_t bInterfaceSubClass; - u_int8_t bInterfaceProtocol; - u_int8_t iInterface; - - struct usb_endpoint_descriptor *endpoint; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -#define USB_MAXALTSETTING 128 /* Hard limit */ -struct usb_interface { - struct usb_interface_descriptor *altsetting; - - int num_altsetting; -}; - -/* Configuration descriptor information.. */ -#define USB_MAXCONFIG 8 -struct usb_config_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int16_t wTotalLength; - u_int8_t bNumInterfaces; - u_int8_t bConfigurationValue; - u_int8_t iConfiguration; - u_int8_t bmAttributes; - u_int8_t MaxPower; - - struct usb_interface *interface; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -/* Device descriptor */ -struct usb_device_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int16_t bcdUSB; - u_int8_t bDeviceClass; - u_int8_t bDeviceSubClass; - u_int8_t bDeviceProtocol; - u_int8_t bMaxPacketSize0; - u_int16_t idVendor; - u_int16_t idProduct; - u_int16_t bcdDevice; - u_int8_t iManufacturer; - u_int8_t iProduct; - u_int8_t iSerialNumber; - u_int8_t bNumConfigurations; -}; - -struct usb_ctrl_setup { - u_int8_t bRequestType; - u_int8_t bRequest; - u_int16_t wValue; - u_int16_t wIndex; - u_int16_t wLength; -}; - -/* - * Standard requests - */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -/* 0x02 is reserved */ -#define USB_REQ_SET_FEATURE 0x03 -/* 0x04 is reserved */ -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -#define USB_TYPE_STANDARD (0x00 << 5) -#define USB_TYPE_CLASS (0x01 << 5) -#define USB_TYPE_VENDOR (0x02 << 5) -#define USB_TYPE_RESERVED (0x03 << 5) - -#define USB_RECIP_DEVICE 0x00 -#define USB_RECIP_INTERFACE 0x01 -#define USB_RECIP_ENDPOINT 0x02 -#define USB_RECIP_OTHER 0x03 - -/* - * Various libusb API related stuff - */ - -#define USB_ENDPOINT_IN 0x80 -#define USB_ENDPOINT_OUT 0x00 - -/* Error codes */ -#define USB_ERROR_BEGIN 500000 - -/* - * This is supposed to look weird. This file is generated from autoconf - * and I didn't want to make this too complicated. - */ -#if @BIGENDIAN@ -#define USB_LE16_TO_CPU(x) do { x = ((x & 0xff) << 8) | ((x & 0xff00) >> 8); } while(0) -#else -#define USB_LE16_TO_CPU(x) -#endif - -/* Data types */ -struct usb_device; -struct usb_bus; - -/* - * To maintain compatibility with applications already built with libusb, - * we must only add entries to the end of this structure. NEVER delete or - * move members and only change types if you really know what you're doing. - */ -struct usb_device { - struct usb_device *next, *prev; - - char filename[PATH_MAX + 1]; - - struct usb_bus *bus; - - struct usb_device_descriptor descriptor; - struct usb_config_descriptor *config; - - void *dev; /* Darwin support */ - - u_int8_t devnum; - - unsigned char num_children; - struct usb_device **children; -}; - -struct usb_bus { - struct usb_bus *next, *prev; - - char dirname[PATH_MAX + 1]; - - struct usb_device *devices; - u_int32_t location; - - struct usb_device *root_dev; -}; - -struct usb_dev_handle; -typedef struct usb_dev_handle usb_dev_handle; - -/* Variables */ -extern struct usb_bus *usb_busses; - -#ifdef __cplusplus -extern "C" { -#endif - -/* Function prototypes */ - -/* usb.c */ -usb_dev_handle *usb_open(struct usb_device *dev); -int usb_close(usb_dev_handle *dev); -int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, - size_t buflen); -int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, - size_t buflen); - -/* descriptors.c */ -int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, - unsigned char type, unsigned char index, void *buf, int size); -int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, - unsigned char index, void *buf, int size); - -/* .c */ -int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); -int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); -int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); -int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); -int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, - int value, int index, char *bytes, int size, int timeout); -int usb_set_configuration(usb_dev_handle *dev, int configuration); -int usb_claim_interface(usb_dev_handle *dev, int interface); -int usb_release_interface(usb_dev_handle *dev, int interface); -int usb_set_altinterface(usb_dev_handle *dev, int alternate); -int usb_resetep(usb_dev_handle *dev, unsigned int ep); -int usb_clear_halt(usb_dev_handle *dev, unsigned int ep); -int usb_reset(usb_dev_handle *dev); - -#if @LINUX_API@ -#define LIBUSB_HAS_GET_DRIVER_NP 1 -int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, - unsigned int namelen); -#define LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP 1 -int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface); -#endif - -char *usb_strerror(void); - -void usb_init(void); -void usb_set_debug(int level); -int usb_find_busses(void); -int usb_find_devices(void); -struct usb_device *usb_device(usb_dev_handle *dev); -struct usb_bus *usb_get_busses(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_H__ */ - diff --git a/libusb/libusb/usbi.h b/libusb/libusb/usbi.h deleted file mode 100644 index 5fe8c8e..0000000 --- a/libusb/libusb/usbi.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _USBI_H_ -#define _USBI_H_ - -#include "usb.h" - -#include "error.h" - -extern int usb_debug; - -/* Some quick and generic macros for the simple kind of lists we use */ -#define LIST_ADD(begin, ent) \ - do { \ - if (begin) { \ - ent->next = begin; \ - ent->next->prev = ent; \ - } else \ - ent->next = NULL; \ - ent->prev = NULL; \ - begin = ent; \ - } while(0) - -#define LIST_DEL(begin, ent) \ - do { \ - if (ent->prev) \ - ent->prev->next = ent->next; \ - else \ - begin = ent->next; \ - if (ent->next) \ - ent->next->prev = ent->prev; \ - ent->prev = NULL; \ - ent->next = NULL; \ - } while (0) - -#define DESC_HEADER_LENGTH 2 -#define DEVICE_DESC_LENGTH 18 -#define CONFIG_DESC_LENGTH 9 -#define INTERFACE_DESC_LENGTH 9 -#define ENDPOINT_DESC_LENGTH 7 -#define ENDPOINT_AUDIO_DESC_LENGTH 9 - -struct usb_dev_handle { - int fd; - - struct usb_bus *bus; - struct usb_device *device; - - int config; - int interface; - int altsetting; - - /* Added by RMT so implementations can store other per-open-device data */ - void *impl_info; -}; - -/* descriptors.c */ -int usb_parse_descriptor(unsigned char *source, char *description, void *dest); -int usb_parse_configuration(struct usb_config_descriptor *config, - unsigned char *buffer); -void usb_fetch_and_parse_descriptors(usb_dev_handle *udev); -void usb_destroy_configuration(struct usb_device *dev); - -/* OS specific routines */ -int usb_os_find_busses(struct usb_bus **busses); -int usb_os_find_devices(struct usb_bus *bus, struct usb_device **devices); -int usb_os_determine_children(struct usb_bus *bus); -void usb_os_init(void); -int usb_os_open(usb_dev_handle *dev); -int usb_os_close(usb_dev_handle *dev); - -void usb_free_dev(struct usb_device *dev); -void usb_free_bus(struct usb_bus *bus); - -#endif /* _USBI_H_ */ - diff --git a/libusb/libusb/usbpp.cpp b/libusb/libusb/usbpp.cpp deleted file mode 100644 index 7286ed7..0000000 --- a/libusb/libusb/usbpp.cpp +++ /dev/null @@ -1,581 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -/* - * USB C++ bindings - * - * Copyright (C) 2003 Brad Hards - * - * This library is covered by the LGPL, read LICENSE for details. - */ - -#include -#include -#include - -//remove after debugging -#include - -#include "usbpp.h" - -namespace USB { - Busses::Busses(void) - { - usb_init(); - rescan(); - } - - void Busses::rescan(void) - { - struct usb_bus *bus; - struct usb_device *dev; - Bus *this_Bus; - Device *this_Device; - Configuration *this_Configuration; - Interface *this_Interface; - AltSetting *this_AltSetting; - Endpoint *this_Endpoint; - int i, j, k, l; - - usb_find_busses(); - usb_find_devices(); - - for (bus = usb_get_busses(); bus; bus = bus->next) { - std::string dirName(bus->dirname); - - this_Bus = new Bus; - this_Bus->setDirectoryName(dirName); - push_back(this_Bus); - - for (dev = bus->devices; dev; dev = dev->next) { - std::string buf, fileName(dev->filename); - usb_dev_handle *dev_handle; - int ret; - - this_Device = new Device; - this_Device->setFileName(fileName); - this_Device->setDescriptor(dev->descriptor); - - dev_handle = usb_open(dev); - - if (dev_handle) { - this_Device->setDevHandle(dev_handle); - - if (dev->descriptor.iManufacturer) { - ret = this_Device->string(buf, dev->descriptor.iManufacturer); - if (ret > 0) - this_Device->setVendor(buf); - } - - if (dev->descriptor.iProduct) { - ret = this_Device->string(buf, dev->descriptor.iProduct); - if (ret > 0) - this_Device->setProduct(buf); - } - - if (dev->descriptor.iSerialNumber) { - ret = this_Device->string(buf, dev->descriptor.iSerialNumber); - if (ret > 0) - this_Device->setSerialNumber(buf); - } - } - - this_Bus->push_back(this_Device); - - for (i = 0; i < this_Device->numConfigurations(); i++) { - this_Configuration = new Configuration; - this_Configuration->setDescriptor(dev->config[i]); - this_Device->push_back(this_Configuration); - - for (j = 0; j < this_Configuration->numInterfaces(); j ++) { - this_Interface = new Interface; - this_Interface->setNumAltSettings(dev->config[i].interface[j].num_altsetting); - this_Interface->setParent(this_Device); - this_Interface->setInterfaceNumber(j); - this_Configuration->push_back(this_Interface); - - for (k = 0; k < this_Interface->numAltSettings(); k ++) { - this_AltSetting = new AltSetting; - this_AltSetting->setDescriptor(dev->config[i].interface[j].altsetting[k]); - this_Interface->push_back(this_AltSetting); - - for (l = 0; l < this_AltSetting->numEndpoints(); l++) { - this_Endpoint = new Endpoint; - this_Endpoint->setDescriptor(dev->config[i].interface[j].altsetting[k].endpoint[l]); - this_Endpoint->setParent(this_Device); - this_AltSetting->push_back(this_Endpoint); - } - } - } - } - } - } - } - - std::list Busses::match(u_int8_t class_code) - { - std::list match_list; - USB::Bus *bus; - std::list::const_iterator biter; - - for (biter = begin(); biter != end(); biter++) { - USB::Device *device; - std::list::const_iterator diter; - bus = *biter; - - for (diter = bus->begin(); diter != bus->end(); diter++) { - device = *diter; - if (device->devClass() == class_code) - match_list.push_back(device); - } - } - return match_list; - } - - std::list Busses::match(DeviceIDList devList) - { - std::list match_list; - USB::Bus *bus; - std::list::const_iterator biter; - - for (biter = begin(); biter != end(); biter++) { - USB::Device *device; - std::list::const_iterator diter; - - bus = *biter; - for (diter = bus->begin(); diter != bus->end(); diter++) { - DeviceIDList::iterator it; - - device = *diter; - - for (it = devList.begin(); it != devList.end(); it++) { - if (device->idVendor() == (*it).vendor() && - device->idProduct() == (*it).product()) - match_list.push_back(device); - } - } - } - return match_list; - } - - std::string Bus::directoryName(void) - { - return m_directoryName; - } - - void Bus::setDirectoryName(std::string directoryName) - { - m_directoryName = directoryName; - } - - Device::~Device(void) - { - usb_close(m_handle); - } - - std::string Device::fileName(void) - { - return m_fileName; - } - - int Device::string(std::string &buf, int index, u_int16_t langID) - { - int retval; - char tmpBuff[256]; - - if (0 == langID) { - /* we want the first lang ID available, so find out what it is */ - retval = usb_get_string(m_handle, 0, 0, tmpBuff, sizeof(tmpBuff)); - if (retval < 0) - return retval; - - if (retval < 4 || tmpBuff[1] != USB_DT_STRING) - return -EIO; - - langID = tmpBuff[2] | (tmpBuff[3] << 8); - } - - retval = usb_get_string(m_handle, index, langID, tmpBuff, sizeof(tmpBuff)); - - if (retval < 0) - return retval; - - if (tmpBuff[1] != USB_DT_STRING) - return -EIO; - - if (tmpBuff[0] > retval) - return -EFBIG; - - /* FIXME: Handle unicode? */ -#if 0 - if (retval > 0) { - std::string.setUnicode((unsigned char *)&tmpBuff[2], tmpBuff[0] / 2 - 1); - } -#endif - return retval; - } - - struct usb_dev_handle *Device::handle(void) - { - return m_handle; - } - -#ifdef USE_UNTESTED_LIBUSBPP_METHODS - int Device::reset(void) - { - return usb_reset(handle()); - } - - int Device::setConfiguration(int configurationNumber) - { - return usb_set_configuration(handle(), configurationNumber); - } -#endif /* USE_UNTESTED_LIBUSBPP_METHODS */ - - u_int16_t Device::idVendor(void) - { - return m_descriptor.idVendor; - } - - u_int16_t Device::idProduct(void) - { - return m_descriptor.idProduct; - } - - u_int16_t Device::idRevision(void) - { - return m_descriptor.bcdDevice; - } - - u_int8_t Device::devClass(void) - { - return m_descriptor.bDeviceClass; - } - - u_int8_t Device::devSubClass(void) - { - return m_descriptor.bDeviceSubClass; - } - - u_int8_t Device::devProtocol(void) - { - return m_descriptor.bDeviceProtocol; - } - - std::string Device::Vendor(void) - { - return m_Vendor; - } - - std::string Device::Product(void) - { - return m_Product; - } - - std::string Device::SerialNumber(void) - { - return m_SerialNumber; - } - - void Device::setVendor(std::string vendor) - { - m_Vendor = vendor; - } - - void Device::setDevHandle(struct usb_dev_handle *device) - { - m_handle = device; - } - - void Device::setProduct(std::string product) - { - m_Product = product; - } - - void Device::setSerialNumber(std::string serialnumber) - { - m_SerialNumber = serialnumber; - } - - u_int8_t Device::numConfigurations(void) - { - return m_descriptor.bNumConfigurations; - } - - void Device::setFileName(std::string fileName) - { - m_fileName = fileName; - } - - void Device::setDescriptor(struct usb_device_descriptor descriptor) - { - m_descriptor = descriptor; - } - - Configuration *Device::firstConfiguration(void) - { - iter = begin(); - return *iter++; - } - - Configuration *Device::nextConfiguration(void) - { - if (iter == end()) - return NULL; - - return *iter++; - } - - Configuration *Device::lastConfiguration(void) - { - return back(); - } - - int Device::controlTransfer(u_int8_t requestType, u_int8_t request, - u_int16_t value, u_int16_t index, u_int16_t length, - unsigned char *payload, int timeout) - { - return usb_control_msg(m_handle, requestType, request, value, index, (char *)payload, length, timeout); - } - - u_int8_t Configuration::numInterfaces(void) - { - return m_NumInterfaces; - } - - void Configuration::setDescriptor(struct usb_config_descriptor descriptor) - { - m_Length = descriptor.bLength; - m_DescriptorType = descriptor.bDescriptorType; - m_TotalLength = descriptor.wTotalLength; - m_NumInterfaces = descriptor.bNumInterfaces; - m_ConfigurationValue = descriptor.bConfigurationValue; - m_Configuration = descriptor.iConfiguration; - m_Attributes = descriptor.bmAttributes; - m_MaxPower = descriptor.MaxPower; - } - - void Configuration::dumpDescriptor(void) - { - printf(" wTotalLength: %d\n", m_TotalLength); - printf(" bNumInterfaces: %d\n", m_NumInterfaces); - printf(" bConfigurationValue: %d\n", m_ConfigurationValue); - printf(" iConfiguration: %d\n", m_Configuration); - printf(" bmAttributes: %02xh\n", m_Attributes); - printf(" MaxPower: %d\n", m_MaxPower); - } - - Interface *Configuration::firstInterface(void) - { - iter = begin(); - return *iter++; - } - - Interface *Configuration::nextInterface(void) - { - if (iter == end()) - return NULL; - - return *iter++; - } - - Interface *Configuration::lastInterface(void) - { - return back(); - } - -#ifdef LIBUSB_HAS_GET_DRIVER_NP - int Interface::driverName(std::string &driver) - { - int retval; - char tmpString[256]; - - retval = usb_get_driver_np(m_parent->handle(), m_interfaceNumber, tmpString, sizeof(tmpString)); - if (retval == 0) { - std::string buf(tmpString); - - driver = buf; - } - return retval; - } -#endif - -#ifdef USE_UNTESTED_LIBUSBPP_METHODS - int Interface::claim(void) - { - return usb_claim_interface(m_parent->handle(), m_interfaceNumber); - } - - int Interface::release(void) - { - return usb_claim_interface(m_parent->handle(), m_interfaceNumber); - } - - int Interface::setAltSetting(int altSettingNumber) - { - return usb_set_altinterface(m_parent->handle(), altSettingNumber); - } -#endif /* USE_UNTESTED_LIBUSBPP_METHODS */ - - u_int8_t Interface::numAltSettings(void) - { - return m_numAltSettings; - } - - void Interface::setNumAltSettings(u_int8_t num_altsetting) - { - m_numAltSettings = num_altsetting; - } - - void Interface::setInterfaceNumber(int interfaceNumber) - { - m_interfaceNumber = interfaceNumber; - } - - void Interface::setParent(Device *parent) - { - m_parent = parent; - } - - AltSetting *Interface::firstAltSetting(void) - { - iter = begin(); - return *iter++; - } - - AltSetting *Interface::nextAltSetting(void) - { - if (iter == end()) - return NULL; - - return *iter++; - } - - AltSetting *Interface::lastAltSetting(void) - { - return back(); - } - - void AltSetting::setDescriptor(struct usb_interface_descriptor descriptor) - { - m_Length = descriptor.bLength; - m_DescriptorType = descriptor.bDescriptorType; - m_InterfaceNumber = descriptor.bInterfaceNumber; - m_AlternateSetting = descriptor.bAlternateSetting; - m_NumEndpoints = descriptor.bNumEndpoints; - m_InterfaceClass = descriptor.bInterfaceClass; - m_InterfaceSubClass = descriptor.bInterfaceSubClass; - m_InterfaceProtocol = descriptor.bInterfaceProtocol; - m_Interface = descriptor.iInterface; - } - - void AltSetting::dumpDescriptor(void) - { - printf(" bInterfaceNumber: %d\n", m_InterfaceNumber); - printf(" bAlternateSetting: %d\n", m_AlternateSetting); - printf(" bNumEndpoints: %d\n", m_NumEndpoints); - printf(" bInterfaceClass: %d\n", m_InterfaceClass); - printf(" bInterfaceSubClass: %d\n", m_InterfaceSubClass); - printf(" bInterfaceProtocol: %d\n", m_InterfaceProtocol); - printf(" iInterface: %d\n", m_Interface); - } - - Endpoint *AltSetting::firstEndpoint(void) - { - iter = begin(); - return *iter++; - } - - Endpoint *AltSetting::nextEndpoint(void) - { - if (iter == end()) - return NULL; - - return *iter++; - } - - Endpoint *AltSetting::lastEndpoint(void) - { - return back(); - } - - u_int8_t AltSetting::numEndpoints(void) - { - return m_NumEndpoints; - } - - void Endpoint::setDescriptor(struct usb_endpoint_descriptor descriptor) - { - m_EndpointAddress = descriptor.bEndpointAddress; - m_Attributes = descriptor.bmAttributes; - m_MaxPacketSize = descriptor.wMaxPacketSize; - m_Interval = descriptor.bInterval; - m_Refresh = descriptor.bRefresh; - m_SynchAddress = descriptor.bSynchAddress; - } - - void Endpoint::setParent(Device *parent) - { - m_parent = parent; - } - -#ifdef USE_UNTESTED_LIBUSBPP_METHODS - int Endpoint::bulkWrite(unsigned char *message, int timeout) - { - return usb_bulk_write(m_parent->handle(), m_EndpointAddress, message.data(), - message.size(), timeout); - } - - int Endpoint::bulkRead(int length, unsigned char *message, int timeout) - { - char *buf; - int res; - - buf = (char *)malloc(length); - res = usb_bulk_read(m_parent->handle(), m_EndpointAddress, buf, length, timeout); - - if (res > 0) { - message.resize(length); - message.duplicate(buf, res); - } - - return res; - } - - int Endpoint::reset(void) - { - return usb_resetep(m_parent->handle(), m_EndpointAddress); - } - - int Endpoint::clearHalt(void) - { - return usb_clear_halt(m_parent->handle(), m_EndpointAddress); - } - -#endif /* USE_UNTESTED_LIBUSBPP_METHODS */ - - void Endpoint::dumpDescriptor(void) - { - printf(" bEndpointAddress: %02xh\n", m_EndpointAddress); - printf(" bmAttributes: %02xh\n", m_Attributes); - printf(" wMaxPacketSize: %d\n", m_MaxPacketSize); - printf(" bInterval: %d\n", m_Interval); - printf(" bRefresh: %d\n", m_Refresh); - printf(" bSynchAddress: %d\n", m_SynchAddress); - } - - DeviceID::DeviceID(u_int16_t vendor, u_int16_t product) - { - m_vendor = vendor; - m_product = product; - } - - u_int16_t DeviceID::vendor(void) - { - return m_vendor; - } - - u_int16_t DeviceID::product(void) - { - return m_product; - } -} - diff --git a/libusb/libusb/usbpp.h b/libusb/libusb/usbpp.h deleted file mode 100644 index abda64f..0000000 --- a/libusb/libusb/usbpp.h +++ /dev/null @@ -1,855 +0,0 @@ -// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- -#ifndef __USBPP_HEADER__ -#define __USBPP_HEADER__ - -#include -#include - -#include - -/* - * The following usb.h function is not wrapped yet: - * char *usb_strerror(void); - */ - - -/** - * \brief Classes to access Universal Serial Bus devices - * - * The USB Namespace provides a number of classes to work - * with Universal Serial Bus (USB) devices attached to the - * system. - * - * \author Brad Hards - */ -namespace USB { - - class Device; - - /** - * \brief Class representing a device endpoint - * - * This class represents a device endpoint. You need this class to - * perform bulk reads and writes. - * - */ - class Endpoint { - /** - * Busses is a friend because it fills in the descriptor type - * information on initialisation and rescan. - */ - friend class Busses; - public: - Endpoint() {}; - -#ifdef USE_UNTESTED_LIBUSBPP_METHODS - /** - * \brief Bulk write - * - * This method performs a bulk transfer to the endpoint. - * - * \param message is the message to be sent. - * \param timeout is the USB transaction timeout in milliseconds - * - * \returns the number of bytes sent, or a negative value on - * failure - */ - int bulkWrite(QByteArray message, int timeout = 100); - - /** - * \brief Bulk read - * - * This method performs a bulk transfer from the endpoint. - * - * \param length is the maximum data transfer required. - * \param message is the message that was received. - * \param timeout is the USB transaction timeout in milliseconds - * - * \returns the number of bytes received, or a negative value on - * failure - */ - int bulkRead(int length, unsigned char *message, int timeout = 100); - - /** - * \brief Reset endpoint - * - * This method resets the endpoint. - */ - int reset(void); - - /** - * \brief Clear halt - * - * This method clears a halt (stall) on the endpoint. - */ - int clearHalt(void); - -#endif /* USE_UNTESTED_LIBUSBPP_METHODS */ - - /** - * \brief Endpoint descriptor information output - * - * This method dumps out the various characteristics - * of the endpoint to standard output. - * - * It is mostly useful for debugging. - */ - void dumpDescriptor(void); - - private: - void setDescriptor(struct usb_endpoint_descriptor); - void setParent(Device *parent); - u_int8_t m_Length; - u_int8_t m_DescriptorType; - u_int8_t m_EndpointAddress; - u_int8_t m_Attributes; - u_int16_t m_MaxPacketSize; - u_int8_t m_Interval; - u_int8_t m_Refresh; - u_int8_t m_SynchAddress; - Device *m_parent; - }; - - class AltSetting : public std::list { - /** - * Busses is a friend because it fills in the descriptor type - * information on initialisation and rescan. - */ - friend class Busses; - public: - AltSetting() {}; - u_int8_t numEndpoints(void); - - /** - * \brief AltSetting descriptor information output - * - * This method dumps out the various characteristics - * of the alternate setting to standard output. - * - * It is mostly useful for debugging. - */ - void dumpDescriptor(void); - - Endpoint *firstEndpoint(void); - Endpoint *nextEndpoint(void); - Endpoint *lastEndpoint(void); - - private: - std::list::const_iterator iter; - - void setDescriptor(struct usb_interface_descriptor); - /* we don't use a normal usb_interface_descriptor */ - /* because that would bring in the endpoint list */ - u_int8_t m_Length; - u_int8_t m_DescriptorType; - u_int8_t m_InterfaceNumber; - u_int8_t m_AlternateSetting; - u_int8_t m_NumEndpoints; - u_int8_t m_InterfaceClass; - u_int8_t m_InterfaceSubClass; - u_int8_t m_InterfaceProtocol; - u_int8_t m_Interface; - }; - - /** - * \brief Class representing an interface of a Device - * - * The Interface class represents a USB interface - * for a device attached to a Universal Serial Bus. - * - * Interfaces are the main element of the USB class - * structure. - * - * \author Brad Hards - */ - class Interface : public std::list { - /** - * Busses is a friend because it fills in the descriptor type - * information on initialisation and rescan. - */ - friend class Busses; - public: - Interface() {}; - -#ifdef LIBUSB_HAS_GET_DRIVER_NP - /** - * \brief get the current driver for an interface - * - * \param driver a string containing the name of the current - * driver for the interface. You can typically pass in an empty - * string for this. - * - * \return length of string, or 0 on error. - */ - int driverName(std::string &driver); -#endif - -#ifdef USE_UNTESTED_LIBUSBPP_METHODS - /** - * \brief Claim this interface - * - * This method claims the interface. You have to claim the - * interface before performing any operations on the interface (or - * on endpoints that are part of the interface). - * - * \return 0 on success or negative number on error. - */ - int claim(void); - - /** - * \brief Release this interface - * - * This method releases the interface. You should release the - * interface after all operations on it (and any lower level - * endpoints) are completed. - * - * \return 0 on success or negative number on error. - */ - int release(void); - - /** - * \brief Set interface alternate setting - * - * This method sets the interface to a particular AltSetting. - * - * \param altSettingNumber the AltSetting that the interface - * should be changed to. - * - * \return 0 on success, or a negative number in case of error. - */ - int setAltSetting(int altSettingNumber); -#endif /* USE_UNTESTED_LIBUSBPP_METHODS */ - - /** - * \brief Number of Alternative Settings that this interface has - * - * This is a simple accessor method that specifies the number - * alternative settings that this device interface has. - */ - u_int8_t numAltSettings(void); - - /** - * \brief First AltSetting for the Interface - * - * This method returns a pointer to the first AltSetting - * for the Interface. - * - * See nextAltSetting() for an example of how it might be - * used. - * - * \see nextAltSetting(), lastAltSetting(), numAltSettings() - */ - AltSetting *firstAltSetting(void); - - /** - * \brief Next AltSetting for the Interface - * - * This method returns a pointer to the next AltSetting - * for the Interface. - * - * If you want to iterate through each AltSetting on - * a device, you can use something like the following: - * \code - * USB::Configuration *this_Configuration; - * this_Configuration = device->firstConfiguration(); - * for (i=0; i < device->numConfigurations(); i++) { - * this_Configuration->dumpDescriptor(); - * USB::Interface *this_Interface; - * this_Interface = this_Configuration->firstInterface(); - * for (j=0; j < this_Configuration->numInterfaces(); j++) { - * USB::AltSetting *this_AltSetting; - * this_AltSetting = this_Interface->firstAltSetting(); - * for (k=0; k < this_Interface->numAltSettings(); k++) { - * // do something with this_AltSetting - * this_AltSetting = this_Interface->nextAltSetting(); - * } - * this_Interface = this_Configuration->nextInterface(); - * } - * this_Configuration = device->nextConfiguration(); - * } - * \endcode - * - * \see firstAltSetting(), lastAltSetting(), numAltSettings() - */ - AltSetting *nextAltSetting(void); - - /** - * \brief Last AltSetting for the Interface - * - * This method returns a pointer to the last AltSetting - * for the Interface. - * - * \see firstAltSetting(), nextAltSetting(), numAltSettings() - */ - - AltSetting *lastAltSetting(void); - - private: - std::list::const_iterator iter; - - void setNumAltSettings(u_int8_t); - void setParent(Device *parent); - u_int8_t m_numAltSettings; - Device *m_parent; - - /* index representing the interface, in this configuration */ - int m_interfaceNumber; - void setInterfaceNumber(int interfaceNumber); - }; - - /** - * \brief Class representing a configuration of a Device - * - * The Configuration class represents a single configuration - * of a device attached to a Universal Serial Bus. - * - * \author Brad Hards - */ - class Configuration : public std::list { - /** - * Busses is a friend because it fills in the descriptor type - * information on initialisation and rescan. - */ - friend class Busses; - public: - Configuration() {}; - - /** - * \brief Configuration descriptor information output - * - * This method dumps out the various characteristics - * of the configuration to standard output. - * - * It is mostly useful for debugging. - */ - void dumpDescriptor(void); - - /** - * \brief Number of Interfaces that this device has - * - * This is a simple accessor method that specifies the number - * Interfaces that this device configuration has. - */ - u_int8_t numInterfaces(void); - - /** - * \brief First Interface for the Configuration - * - * This method returns a pointer to the first Interface - * for the Configuration. - * - * See nextInterface() for an example of how it might be - * used. - * - * \see nextInterface(), lastInterface(), numInterfaces() - */ - Interface *firstInterface(void); - - /** - * \brief Next Interface for the Configuration - * - * This method returns a pointer to the next Interface - * for the Configuration. - * - * If you want to iterate through each Interface on - * a device, you can use something like the following: - * \code - * USB::Configuration *this_Configuration; - * this_Configuration = device->firstConfiguration(); - * for (i=0; i < device->numConfigurations(); i++) { - * this_Interface = this_Configuration->firstInterface(); - * for (j=0; j < this_Configuration->numInterfaces(); j++) { - * // do something with this_Interface - * this_Interface = this_Configuration->nextInterface(); - * } - * this_Configuration->nextConfiguration(); - * } - * \endcode - * - * \see firstInterface(), lastInterface(), numInterfaces() - */ - Interface *nextInterface(void); - - /** - * \brief Last Interface for the Configuration - * - * This method returns a pointer to the last Interface - * for the Configuration. - * - * \see firstInterface(), nextInterface(), numInterfaces() - */ - Interface *lastInterface(void); - - private: - std::list::const_iterator iter; - - void setDescriptor(struct usb_config_descriptor); - /* we don't use a normal usb_config_descriptor */ - /* because that would bring in the interface list */ - u_int8_t m_Length; - u_int8_t m_DescriptorType; - u_int16_t m_TotalLength; - u_int8_t m_NumInterfaces; - u_int8_t m_ConfigurationValue; - u_int8_t m_Configuration; - u_int8_t m_Attributes; - u_int8_t m_MaxPower; - }; - - /** - * \brief Class representing a Device on the Bus - * - * The Device class represents a single device - * attached to a Universal Serial Bus. - * - * \author Brad Hards - */ - class Device : public std::list { - /** - * Busses is a friend because it fills in the descriptor type - * information on initialisation and rescan. - */ - friend class Busses; - /** - * Interface is a friend because it needs the handle() function to - * perform claim(), release(). - */ - friend class Interface; - /** - * Endpoint is a friend because it needs the handle() function to - * perform reads, writes, and other transactions. - */ - friend class Endpoint; - - public: - Device() {}; - ~Device(); - - /** - * \brief OS representation of filename for this device - * - * libusb++ provides a uniform way of accessing USB - * devices irrespective of the underlying Operation System - * representation. If you want to map the libusb++ representation - * to the Operating System representation, you can do this - * with filename(). - * - * On Linux, the filename is usually something like 002, which - * represents the second device (usually the first real device, - * after the root hub pseudo-device) on the bus. - * - * \see Bus::directoryName() - */ - std::string fileName(void); - - /** - * \brief The vendor ID number, as provided by the device. - * - * This method returns a number containing the vendor - * (manufacturer) identification number. These are allocated - * by the USB Implementers Forum, and you can construct a - * lookup based on the number to get the manufacturer's name, - * even if the device does not contain a vendor string. - * - * \see Vendor() - */ - u_int16_t idVendor(void); - - /** - * \brief The product ID number, as provided by the device. - * - * This method returns a number containing the product - * identification number. These are allocated - * by the manufacturer, and should be different on each device. - * - * \see Product() - */ - u_int16_t idProduct(void); - - /** - * \brief The product's revision ID, as provided by the device. - * - * This method returns a number containing the product's revision. - * This revision level is nominally binary coded decimal, but - * hexadecimal revision levels are not uncommon. The binary coded - * decimal version nominally has a major version in the high byte, - * and a minor version in the low byte. - */ - u_int16_t idRevision(void); - - /** - * \brief The device's USB class, as provided by the device. - * - * This method returns a number containing the device's class. - * These are defined by the USB Implementer's Forum. - * - * A code of Zero is special (and common) - it means that the - * class is found in the Interface descriptor, rather than in the - * Device descriptor. - * - * A code of 0xFF is also special (and far too common) - it means - * that the manufacturer didn't conform to one of the defined - * class specifications, and chose to implement a vendor specified - * protocol. - * - */ - u_int8_t devClass(void); - - /** - * \brief The device's USB subclass, as provided by the device. - * - * This method returns a number containing the device's subclass. - * These subclasses are defined by the USB Implementer's Forum, - * and only have meaning in the context of a specified class. - */ - u_int8_t devSubClass(void); - - /** - * \brief The device's USB protocol, as provided by the device. - * - * This method returns a number containing the device's protocol. - * These protocols are defined by the USB Implementer's Forum, and - * only have meaning in the context of a specified class and - * subclass. - */ - u_int8_t devProtocol(void); - - - /** - * \brief The vendor name string, as provided by the device. - * - * This method returns a string containing the name of the - * device's vendor (manufacturer), as encoded into the device. - * - * Note that not all devices contain a vendor name, and also - * that under some operating systems you may not be able to - * read the vendor name without elevated privledges (typically - * root privledges). - * - * \see idVendor() - **/ - std::string Vendor(void); - - /** - * \brief The product name string, as provided by the device. - * - * This method returns a string containing the name of the - * device's product name, as encoded into the device. - * - * Note that not all devices contain a product name, and also - * that under some operating systems you may not be able to - * read the vendor name without elevated privledges (typically - * root privledges). - * - * \see idProduct() - **/ - std::string Product(void); - - /** - * \brief The serial number string, as provided by the device. - * - * This method returns a string containing a serial number for - * the device, as encoded into the device. - * - * Note that few devices contain a serial number string, and also - * that under some operating systems you may not be able to - * read the serial number without elevated privledges (typically - * root privledges). The USB specification requires that serial - * numbers are unique if they are provided, but adherence to this - * requirement by manufacturers is not universal. - **/ - std::string SerialNumber(void); - - /** - * \brief Number of Configurations that this device has - * - * This is a simple accessor method that specifies the number - * configurations that this device has. - */ - u_int8_t numConfigurations(void); - - /** - * \brief fetch an arbitrary string from the device - * - * \param string the string from the device. You can typically - * pass in an empty string for this. - * \param index the index of the string required - * \param lang the language ID to use. Defaults to using the - * first language ID. - * - * \return length of string, or 0 on error. - */ - int string(std::string &buf, int index, u_int16_t lang=0); - - /** - * \brief First Configuration for the Device - * - * This method returns a pointer to the first Configuration - * for the Device. - * - * See nextConfiguration() for an example of how it might be - * used. - */ - Configuration *firstConfiguration(void); - - /** - * \brief Next Configuration for the Device - * - * This method returns a pointer to the next Configuration - * for the Device. - * - * If you want to iterate through each Configuration on - * a device, you can use something like the following: - * \code - * USB::Configuration *this_Configuration; - * this_Configuration = device->firstConfiguration(); - * for (i=0; i < device->numConfigurations(); i++) { - * // do something with this_Configuration - * this_Configuration->nextConfiguration(); - * } - * \endcode - */ - Configuration *nextConfiguration(void); - - /** - * \brief Last Configuration for the Device - * - * This method returns a pointer to the last Configuration - * for the Device. - * - */ - Configuration *lastConfiguration(void); - - /** - * \brief USB control transfer - * - * This method performs a standard control transfer to the default - * endpoint. See the USB specification for more details on this. - * - * \param requestType corresponds to the bmRequestType field - * in the transfer - * \param request corresponds to the bRequest field in the - * transfer - * \param value corresponds to the wValue field in the transfer - * \param index corresponds to the wIndex field in the transfer - * \param length corresponds to the wLength field in the transfer - * \param payload corresponds to the data phase of a control - * transfer - * \param timeout is the timeout period for the control transfer, - * in milliseconds - * - * \return number of bytes sent or received, or a negative number - * in case of error. - */ - int controlTransfer(u_int8_t requestType, u_int8_t request, - u_int16_t value, u_int16_t index, u_int16_t length, - unsigned char *payload, - int timeout = 100); - -#ifdef USE_UNTESTED_LIBUSBPP_METHODS - /** - * \brief USB device reset - * - * This method performs a device reset - see USB Specification - * 9.1 for how this changes the device state to the Default state. - * - * \return 0 on success, or a negative number in case of error. - */ - int reset(void); - - /** - * \brief Set device configuration - * - * This method sets the device to a particular Configuration. - * - * \param configurationNumber the configuration that the device - * should be changed to. - * - * \return 0 on success, or a negative number in case of error. - */ - int setConfiguration(int configurationNumber); -#endif /* USE_UNTESTED_LIBUSBPP_METHODS */ - - private: - std::list::const_iterator iter; - - struct usb_dev_handle *handle(); - void setFileName(std::string); - void setDescriptor(struct usb_device_descriptor); - void setVendor(std::string); - void setProduct(std::string); - void setSerialNumber(std::string); - void setDevHandle(struct usb_dev_handle *); - std::string m_fileName; - std::string m_Vendor; - std::string m_Product; - std::string m_SerialNumber; - struct usb_device *m_dev; - struct usb_dev_handle *m_handle; - struct usb_device_descriptor m_descriptor; - }; - - /** - * \brief Class representing a single bus on the machine - * - * This class is essentially a list of Device class instances - */ - class Bus : public std::list { - /** - * Busses is a friend because it fills in the directory name - * information on initialisation and rescan. - */ - friend class Busses; - public: - Bus() {}; - /** - * \brief OS representation of directory name for this Bus - * - * libusb++ provides a uniform way of accessing USB - * busses irrespective of the underlying Operation System - * representation. If you want to map the libusb++ representation - * to the Operating System representation, you can do this - * with directory name(). - * - * On Linux, the directoryname is usually something like 003, which - * represents the third bus on the host. - * - * \see Directory::filename() - */ - std::string directoryName(void); - private: - std::list::const_iterator iter; - - void setDirectoryName(std::string); - std::string m_directoryName; - }; - - /** - * \brief A vendor/product ID pair - * - * DeviceID provides a list of (vendor, product) identification - * pairs. It is intended for use in a list of device numbers to - * search for, but there is no reason why it couldn't be used for a - * general purpose (vendor,product) tuple if you had some reason for - * this. - * - * The description for Busses::match() provides an example of how - * this class might be used. - * - * \see DeviceIDList, Busses::match() - */ - class DeviceID { - public: - DeviceID() {}; - /** - * \brief Standard constructor - * - * This constructor takes (vendor, product) tuple, which are - * stored away. - * - * \param vendor the 16 bit vendor number for the device - * \param product the 16 bit product number for the device - */ - DeviceID(u_int16_t vendor, u_int16_t product); - - /** - * \brief vendor number for the device - * - * This method returns the 16 bit vendor number. - */ - u_int16_t vendor(void); - - /** - * \brief product number for the device - * - * This method returns the 16 bit product number. - */ - u_int16_t product(void); - - private: - u_int16_t m_vendor; - u_int16_t m_product; - }; - - /** - * \brief A list of vendor/product pairs - * - * DeviceIDList provides a list of DeviceID classes, which is - * essentially a list of (vendor, product) identification pairs. - * - * \see DeviceID - */ - typedef std::list DeviceIDList; - - /** - * \brief Class representing all the busses on the machine - * - * This class is essentially a list of Bus class instances - */ - class Busses : public std::list { - public: - Busses(); - - /** - * \brief Update method - * - * This method can be called to rescan the various devices - * attached to the various busses. You should use it to - * update if things change. Unfortunately there is no - * way to automatically detect this change in a portable way, - * so worst case is that you need to call this using some - * kind of timer in the background. - */ - void rescan(void); - - /** - * \brief find all devices with matching device class designator - * - * This method searches every device on every bus, and returns a - * list of pointers to the devices that have a matching device - * class code - */ - std::list match(u_int8_t Class); - - /** - * \brief find all devices with matching device IDs - * - * This method searches every device on every bus, and returns a - * list of pointers to the devices that have a matching device - * ID. That is, if the (vendor, product) tuple of a device matches - * one of the tuples on the list, then the device will be added to - * the list of matches. - * - * An example of usage is shown below: - * \code - * USB::Busses buslist; - * USB::Device *device; - * std::list miceFound; - * USB::DeviceIDList mouseList; - * - * mouseList.append(USB::DeviceID(VENDOR_LOGITECH, 0xC00E)); // Wheel Mouse Optical - * mouseList.append(USB::DeviceID(VENDOR_LOGITECH, 0xC012)); // MouseMan Dual Optical - * mouseList.append(USB::DeviceID(VENDOR_LOGITECH, 0xC506)); // MX700 Optical Mouse - * - * miceFound = buslist.match(mouseList); - * - * for ( device = miceFound.first(); device; device = miceFound.next() ) { - * // do something with each mouse that matched - * } - * FIXME: This is incorrect now - * \endcode - */ - std::list match(DeviceIDList); - - private: - std::list::const_iterator iter; - }; - - class Error { - public: - private: - }; - -} -#endif /* __USBPP_HEADER__ */ -

o4SRv9aJ`oIy}f1ERL;AbyIrLcvrMbXHz_Qe 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 in all cases + + The value was not restored in the error case. So it was not a + bug. But the Coverity tool complained: + + CID 1090609 (#1 of 1): Failure to restore non-local value + (MISSING_RESTORE)20. end_of_scope: Value of non-local + "ccid_descriptor->readTimeout" that was saved in "oldReadTimeout" + is not restored as it was along other paths. + +2013-09-16 Ludovic Rousseau + + * [r6752] src/Makefile.am: Revert change in revision 6735 + + We can't use install-exec-local since we want to overwrite the + install rule. We do not want to _add_ files to install + * [r6751] MacOSX/configure: Display the warning "No Universal + Binary build" in red + +2013-09-05 Ludovic Rousseau + + * [r6746] configure.ac: Set LIBUSB_* even if the libusb-1.0 version + is too old + + If PKG_CHECK_MODULES(LIBUSB, libusb-1.0 >= + $LIBUSB_NEEDED_VERSION,...) fails then LIBUSB_CFLAGS and + LIBUSB_LIBS are not set. This is problematic since it just + displays a warning. So we recall PKG_CHECK_MODULES(LIBUSB, + libusb-1.0) with not version test + + Problem discovered with Debian GNU/kFreeBSD where libusb-1.0 is + at version 1.0.6 (it is not the _real_ libusb). + + ./configure failed with: [...] checking for LIBUSB... no + configure: WARNING: install libusb 1.0.8 or later checking + libusb.h usability... yes checking libusb.h presence... yes + checking for libusb.h... yes configure: error: libusb not found, + use ./configure LIBUSB_LIBS=... + +2013-08-24 Ludovic Rousseau + + * [r6740] configure.ac: Use subdir-objects option + + src/Makefile.am:36: warning: source file 'towitoko/atr.c' is in a + subdirectory, src/Makefile.am:36: but option 'subdir-objects' is + disabled + + automake-1.14: warning: possible forward-incompatibility. + automake-1.14: At least a source file is in a subdirectory, but + the 'subdir-objects' automake-1.14: automake option hasn't been + enabled. For now, the corresponding output automake-1.14: object + file(s) will be placed in the top-level directory. However, + automake-1.14: this behaviour will change in future Automake + versions: they will automake-1.14: unconditionally cause object + files to be placed in the same subdirectory automake-1.14: of the + corresponding sources. automake-1.14: You are advised to start + using 'subdir-objects' option throughout your automake-1.14: + project, to avoid future incompatibilities. + +2013-08-23 Ludovic Rousseau + + * [r6739] src/ifdhandler.c: IFDHControl(): Add support of Windows + value for CM_IOCTL_GET_FEATURE_REQUEST + + Windows uses 0x313520 for SCARD_CTL_CODE(3400) pcsc-lite uses + 0x42000D48 for SCARD_CTL_CODE(3400) + + RDP aplications (like rdesktop) will convert SCardControl() + commands from a Windows application (so using 0x313520) to + pcsc-lite. + * [r6738] src/commands.c: Silence a "clang --analyze" warning + + commands.c:1936:12: warning: The right operand of '==' is a + garbage value if (0x10 == pcbuffer[0]) ^ ~~~~~~~~~~~ + * [r6737] src/ccid_usb.c: Fix "clang --analyze" warning + + ccid_usb.c:1095:14: warning: Result of 'calloc' is converted to a + pointer of type 'unsigned int', which is incompatible with sizeof + operand type 'int' int_array = calloc(n+1, sizeof(int)); ^~~~~~ + ~~~~~~~~~~~ + + - Change variable name int_array -> uint_array since the type is + "unsigned int" - Use sizeof(uint_array[0]) to always get the + correct type of a uint_array[] element + * [r6736] src/Makefile.am: Uninstall libccidtwin in the uninstall + rule + + If libccidtwin is installed in install rule we should also remove + it in the uninstall rule + * [r6735] src/Makefile.am: Use the -local versions for install and + uninstall rules + + autoreconf: running: automake --add-missing --no-force + --warnings=all src/Makefile.am:76: warning: user target 'install' + defined here ... /usr/share/automake-1.13/am/install.am: ... + overrides Automake target 'install' defined here + src/Makefile.am:99: warning: user target 'uninstall' defined here + ... /usr/share/automake-1.13/am/install.am: ... overrides + Automake target 'uninstall' defined here src/Makefile.am:99: + consider using uninstall-local instead of uninstall + + See + http://www.gnu.org/software/automake/manual/html_node/Extending.html + +2013-08-20 Ludovic Rousseau + + * [r6732] readers/Planeta_RC700-NFC_CCID.txt, + readers/supported_readers.txt: Add Planeta RC700-NFC CCID + +2013-08-12 Ludovic Rousseau + + * [r6729] README, configure.ac: Release 1.4.12 + * [r6728] readers/SecuTech_Token.txt, + readers/supported_readers.txt: Add SecuTech SecuTech Token + +2013-08-08 Ludovic Rousseau + + * [r6720] readers/HID_OMNIKEY_5427_CK.txt, + readers/supported_readers.txt: Add HID OMNIKEY 5427 CK + +2013-08-05 Ludovic Rousseau + + * [r6715] readers/Ingenico_WITEO_badge.txt, + readers/Ingenico_WITEO_base.txt, readers/supported_readers.txt: + Add Ingenico WITEO USB Smart Card Reader (Base and Badge) + * [r6714] readers/supported_readers.txt: Regenerate without the + duplicates as entries + +2013-08-02 Ludovic Rousseau + + * [r6705] readers/Lenovo2.txt, readers/supported_readers.txt: Add + Lenovo Lenovo USB Smartcard Keyboard + +2013-07-28 Ludovic Rousseau + + * [r6689] readers/HID_OMNIKEY_5326_DFR.txt, + readers/supported_readers.txt: Add HID OMNIKEY 5326 DFR + +2013-07-06 Ludovic Rousseau + + * [r6688] readers/ACR122U_PICC.txt: Firmware upgrade + * [r6686] readers/Omnikey_5127_CK.txt, + readers/supported_readers.txt: Add HID OMNIKEY 5127 CK + +2013-07-05 Ludovic Rousseau + + * [r6685] src/ifdhandler.c: CreateChannelByNameOrChannel(): + correctly fails if the reader disapears + + If we get the error IFD_NO_SUCH_DEVICE then we must exit using + the error path and not directly with a return. We need to unlock + a mutex and free allocated resources. + + Thanks to coverity. + * [r6684] src/towitoko/atr.c: ATR_InitFromArray(): avoid a possible + buffer overflow + + Increment the protocol index _before_ checking it is too big. + +2013-07-01 Ludovic Rousseau + + * [r6682] src/ccid_usb.c: Code factorisation + * [r6681] src/ccid_usb.c: CloseUSB(): free + arrayOfSupportedDataRates on the last slot close + + Do free .ccid.arrayOfSupportedDataRates array only when the last + slot is closed. + + Multi-slot readers share the same .ccid.arrayOfSupportedDataRates + array. + + The GEMCOREPOSPRO and GEMCORESIMPRO are an exception and are not + correctly managed by this patch (memory may leak). + +2013-06-30 Ludovic Rousseau + + * [r6678] src/ccid_usb.c, src/ifdhandler.c: Add support of + multi-slot readers + + Thanks to Johann Dantant for the initial patch + * [r6677] src/ccid_usb.c: ReadUSB(): check libusb return value for + LIBUSB_ERROR_NO_DEVICE + + Same change as in revision 6676 but for ReadUSB(). + * [r6676] src/ccid_usb.c: WriteUSB(): check return value for + LIBUSB_ERROR_NO_DEVICE + + If the device is removed we check for ENODEV == errno and now + also for LIBUSB_ERROR_NO_DEVICE == rv (libusb_bulk_transfer() + return value) + + Only the value returned by libusb_bulk_transfer() should be used + in the futur. + +2013-06-28 Ludovic Rousseau + + * [r6675] src/ccid_usb.c: close_libusb_if_needed(): Reset ctx value + to NULL + + Make sure libusb_init() will be called for the next reader. + + This was not a real problem since pcscd will unload the driver + when no more reader is using it. + * [r6674] src/ccid_usb.c: Call libusb_exit() when needed + + Starting with libusbx 1.0.16 a hotplug thread is created by + libusb. We must cleanly stop the thread or bad thing can happen + (crash on Mac OS X for exampple) + * [r6673] configure.ac: Check libusb is at least at version 1.0.8 + + The driver will need to use libusb_exit() for libusbx >= 1.0.16 + because of the libusb hotplug thread. + + libusb_exit() was not working correctly in libusb < 1.0.8. + + So we check the libusb library used will at least provide a + working libusb_exit() function. + * [r6672] configure.ac: Remove libusb-config use + + libusb-config was provided by libusb-0.1. We do not use this + version of the libusb API since version libccid 1.4.0 (August + 2010) + +2013-06-20 Ludovic Rousseau + + * [r6667] MacOSX/configure: Update the bundle name template to + include the vendor name + + The bundle name template is now ifd-ccid-vendor-reader.bundle + * [r6666] MacOSX/configure: Disable class driver on Mac OS X + + - we are building for a specific reader - pcsc-lite on Mac OS X + do not yet support "class" driver + +2013-06-18 Ludovic Rousseau + + * [r6664] configure.ac, src/Makefile.am: Use serialconfdir from + pcsc-lite + + Get the serialconfdir value from pcsc-lite pkg config instead of + using $(DESTDIR)/$(sysconfdir)/reader.conf.d/ + +2013-06-12 Ludovic Rousseau + + * [r6661] ylwrap: Update from automake 1.13 + * [r6659] README, configure.ac: Release 1.4.11 + +2013-06-11 Ludovic Rousseau + + * [r6658] readers/supported_readers.txt: Move Gemalto IDBridge + K3000 from "should work" to "supported" + +2013-06-10 Ludovic Rousseau + + * [r6656] readers/supported_readers.txt: Move Gemalto IDBridge CT30 + from "unsupported" to "should work" list + * [r6655] readers/supported_readers.txt: Add Gemalto IDBridge K30 + * [r6652] readers/Gemalto_IDBridge_K30.txt: New firmware and new + name of the Gemalto USB Shell Token V2 + * [r6651] readers/DellSCRK.txt: New firmware (2.0) + * [r6650] src/ccid.c, src/ccid.h, src/ccid_serial.c, + src/ccid_usb.c: Add Zero Length Packet (ZLP) support for Gemalto + IDBridge CT30 and K30 + + The Gemalto IDBridge CT30 and IDBridge K30 readers may send a ZLP + after some commands when connected on a USB3 bus. Only the + readers with firmware 2.00 have the problem. + + The solution is to use a short read before every USB write. + +2013-06-03 Ludovic Rousseau + + * [r6646] src/debug.c: Reset color after time value + + Fix a bug introduced in revision 6644. + * [r6645] src/debug.c: Do not do colorization when not available. + + Check code was missing in revision 6644. + * [r6644] src/debug.c: Add colorization of logs + + This log API is used when pcsc-lite do not provide it i.e. on Mac + OS X. + + The colorization should happen only when the logs are displayed + on a terminal and not when sent in a log file. The main use is + with the handler_test application. + +2013-05-31 Ludovic Rousseau + + * [r6643] src/ccid_usb.c: get_ccid_device_descriptor(): check + endpoint[] before access + + Some non-CCID devices with bInterfaceClass = 0xFF may make the + code crash because they do not have endpoints. + + This may happens using 'parse -p' to parse non CCID devices. + * [r6641] readers/ACR122U.txt, readers/ACR122U_PICC.txt, + readers/ACR38U-CCID.txt, readers/ACS_ACR100.txt, + readers/ACS_ACR101.txt, readers/ACS_ACR38_plugin.txt, + readers/ACS_AET65.txt, readers/ACS_APG8201.txt, + readers/ACS_APG8201_v2.txt, readers/ACS_CryptoMate64.txt, + readers/ASEDrive_IIIe_KB.txt, readers/ASE_IIIe.txt, + readers/ATMEL_AT90SCR050.txt, readers/ATMEL_AT90SCR100.txt, + readers/ATMEL_AT91SC192192CT-USB.txt, readers/ATMEL_AT91SO.txt, + readers/ATMEL_AT98SC032CT.txt, readers/ATMEL_VaultIC420.txt, + readers/ATMEL_VaultIC440.txt, readers/ATMEL_VaultIC460.txt, + readers/AU9520.txt, readers/AU9540.txt, readers/ActivCardV2.txt, + readers/ActivCardV3.txt, readers/ActivkeySim.txt, + readers/Akasa_AK-CR-03.txt, readers/Aktiv_Rutoken_ECP.txt, + readers/Aktiv_Rutoken_Lite.txt, + readers/Aktiv_Rutoken_Magistra.txt, + readers/Aladdin_eToken_PRO_USB_72K_Java.txt, + readers/AlcorMicro_AU9522.txt, readers/Alcor_SCR001.txt, + readers/Alya.txt, readers/Ask_CPL108.txt, + readers/Athena_IDProtect_Key.txt, + readers/Avtor_SC_Reader_371.txt, readers/Avtor_SecureToken.txt, + readers/AxaltoV3.txt, readers/BIFIT_USB-Token_iBank2key.txt, + readers/BIFIT_iBank2key.txt, readers/BZH_uKeyCI800-K1.txt, + readers/BludriveII.txt, readers/Broadcom_5880.txt, + readers/Broadcom_5880v2.txt, readers/Broadcom_5880v3.txt, + readers/Broadcom_5880v4.txt, readers/C3PO_KBR36.txt, + readers/C3PO_LTC32_USBv2.txt, readers/C3PO_TLTC2USB.txt, + readers/CCB_eSafeLD.txt, readers/CardMan1021.txt, + readers/CardMan3021.txt, readers/CardMan3121.txt, + readers/CardMan3621.txt, readers/CardMan3821.txt, + readers/CardMan4321.txt, readers/CardMan5121.txt, + readers/CardMan5125.txt, readers/CardMan5321.txt, + readers/CardMan6121.txt, readers/Charismathics.txt, + readers/CherryST1044U.txt, readers/CherrySmartBoardXX1X.txt, + readers/CherrySmartTerminalST2XXX.txt, + readers/CherrySmartTerminalXX1X.txt, + readers/CherrySmartTerminalXX7X.txt, readers/CherryXX33.txt, + readers/CherryXX44.txt, readers/Covadis_Auriga.txt, + readers/CryptoIdentity.txt, readers/Dectel_CI692.txt, + readers/DellSCRK.txt, readers/DellSK-3106.txt, + readers/Eutron_CryptoIdentity.txt, + readers/Eutron_Digipass_860.txt, + readers/Eutron_SIM_Pocket_Combo_(Card_Reader).txt, + readers/Eutron_SIM_Pocket_Combo_(SIM_Reader).txt, + readers/Eutron_Smart_Pocket.txt, readers/Feitian_SCR301.txt, + readers/Feitian_SCR310.txt, readers/Feitian_ePass2003_PKI.txt, + readers/Fsij_gnuk.txt, + readers/FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt, + readers/FujitsuSiemens_SmartCard_USB_2A.txt, + readers/FujitsuTechnologySolutions_SmartCase_KB_SCR_eSIG.txt, + readers/GIS_SmartMouse.txt, readers/GPFCryptoStick.txt, + readers/GemCorePOSPro.txt, readers/GemCoreSIMPro.txt, + readers/GemPC433_SL.txt, readers/GemPCKey.txt, + readers/GemPCPinpad.txt, readers/GemPCPinpadv2.txt, + readers/GemPCTwin.txt, readers/GemPC_Express.txt, + readers/GemProxDU.txt, readers/GemProxSU.txt, + readers/Gem_e-SealPro.txt, + readers/GemaltoSmartEnterpriseGuardian.txt, + readers/Gemalto_Ezio_Branch.txt, readers/Gemalto_Ezio_CB+.txt, + readers/Gemalto_Ezio_Shield.txt, + readers/Gemalto_Ezio_Shield_PinPad.txt, + readers/Gemalto_HybridSmartcardReader.txt, + readers/Gemalto_IDBridge_CT30.txt, + readers/Gemalto_IDBridge_K3000.txt, readers/Gemalto_PDT.txt, + readers/Gemalto_SA_dotNet_Dual.txt, readers/Gemalto_SG.txt, + readers/GnD_StarSignCardToken350.txt, + readers/GnD_StarSignCardToken550.txt, + readers/GnD_StarSign_CUT.txt, readers/GoldKey_PIV_Token.txt, + readers/HPUSBSmartCardKeyboard.txt, + readers/HPUSBSmartCardReader.txt, + readers/HP_MFP_SmartCardReader.txt, readers/HP_kus-0133.txt, + readers/Identive_CLOUD_2700_F.txt, + readers/Identive_CLOUD_2700_R.txt, + readers/Identive_CLOUD_4500_F.txt, + readers/Identive_CLOUD_4510_F.txt, + readers/Identive_CLOUD_4700_F.txt, + readers/Identive_CLOUD_4710_F.txt, + readers/Inside_Secure_AT90SCR050.txt, + readers/Inside_Secure_AT90SCR100.txt, + readers/Inside_Secure_AT90SCR200.txt, + readers/Inside_Secure_VaultIC_420.txt, + readers/Inside_Secure_VaultIC_440.txt, + readers/Inside_Secure_VaultIC_460_Smart_Object.txt, + readers/JCOP41V221.txt, readers/KAAN_Advanced.txt, + readers/KAAN_Base.txt, readers/KAAN_SIM_III.txt, + readers/KEBTechnology_KONA_USB_SmartCard.txt, + readers/Kingtrust_Multi-Reader.txt, readers/Kobil_EMV_CAP.txt, + readers/Kobil_IDToken.txt, readers/Kobil_Smart_Token.txt, + readers/Kobil_mIDentity_4smart.txt, + readers/Kobil_mIDentity_4smart_AES.txt, + readers/Kobil_mIDentity_fullsize.txt, + readers/Kobil_mIDentity_fullsize_AES.txt, + readers/Kobil_mIDentity_visual.txt, readers/LTC31.txt, + readers/LTC31v2.txt, readers/LTC36.txt, readers/Lenovo.txt, + readers/MSI_StarReader_SMART.txt, + readers/MX5_SMART_CCID_DRIVER.txt, + readers/Macally_NFC_CCID_eNetPad.txt, readers/Morpho_MSO1350.txt, + readers/Morpho_MSO350.txt, readers/MySmartPad.txt, + readers/NXP_PR533.txt, readers/Neowave_Weneo.txt, + readers/Neowave_Weneo2.txt, readers/Neowave_Weneo3.txt, + readers/Neowave_Weneo4.txt, readers/Oberthur-CosmoCard.txt, + readers/Oberthur-CosmoCard1.txt, + readers/Oberthur-ID-ONE_token_slim_v2.txt, + readers/Omnikey_6321.txt, readers/Omnikey_noname1.txt, + readers/Oz776S.txt, readers/Oz776_7772.txt, + readers/Panasonic_USB_Smart_Card_Reader_7A-Smart.txt, + readers/Philips_SmartMX.txt, readers/Precise_200_MC.txt, + readers/Precise_250_MC.txt, readers/Precise_Sense_MC.txt, + readers/Raritan_D2CIM-DVUSB.txt, readers/ReinerSCT.txt, + readers/ReinerSCT_cyberJack_RFID_basis.txt, + readers/ReinerSCT_cyberJack_go.txt, + readers/Rutoken_PINPad_ex.txt, readers/Rutoken_PINPad_in.txt, + readers/SCL010.txt, readers/SCL01x.txt, readers/SCM_SCL010.txt, + readers/SCM_SCL011.txt, readers/SCM_SDI011.txt, + readers/SCM_SDI011_512C.txt, readers/SCR331-DI-NTTCom.txt, + readers/SCR331-DI.txt, readers/SCR331.txt, + readers/SCR3310-NTTCom.txt, readers/SCR3310.txt, + readers/SCR3310_2.txt, readers/SCR3311.txt, readers/SCR3320.txt, + readers/SCR333.txt, readers/SCR3340.txt, readers/SCR335.txt, + readers/SCR3500.txt, readers/SCR355.txt, readers/SDI010.txt, + readers/SDS4ID_DominoKeyPro_100.txt, readers/SPR532.txt, + readers/SafeTech_SafeTouch.txt, readers/Sitecom_MD-010.txt, + readers/Smart_SBV280.txt, readers/Softforum_XecureHSM.txt, + readers/SpringCard_CSB6_Basic.txt, + readers/SpringCard_CSB6_Secure.txt, + readers/SpringCard_CSB6_Ultimate.txt, + readers/SpringCard_CrazyWriter.txt, + readers/SpringCard_EasyFinger_Standard.txt, + readers/SpringCard_EasyFinger_Ultimate.txt, + readers/SpringCard_H512_Series.txt, + readers/SpringCard_H663_Series.txt, + readers/SpringCard_NFC_Roll.txt, + readers/SpringCard_Prox_N_Roll.txt, readers/Synnix_STD200.txt, + readers/Teo.txt, readers/Teridian_TSC12xxFV.09.txt, + readers/TianYu_CCID_SmartKey.txt, + readers/Tianyu_Smart_Card_Reader.txt, + readers/Todos_AGM2_CCID.txt, readers/Todos_Cx00.txt, + readers/Ubisys_RFID.txt, readers/VMware_Virtual_USB_CCID.txt, + readers/Validy_TokenA.txt, + readers/Vasco_DIGIPASS_KEY_202_0120.txt, + readers/Vasco_DIGIPASS_KEY_202_0122.txt, readers/Vasco_DP200.txt, + readers/Vasco_DP855.txt, readers/Vasco_DP860.txt, + readers/Vasco_DP865.txt, readers/Vasco_DP905.txt, + readers/Vasco_DPKey101.txt, readers/Vasco_DPKey200.txt, + readers/Vasco_DPKey860.txt, readers/Vasco_Digipass920.txt, + readers/Vega-Alpha.txt, + readers/Verisign_secure_storage_token.txt, + readers/Verisign_secure_token.txt, readers/Winbond.txt, + readers/Xiring_Leov2.txt, readers/Xiring_MyLeo.txt, + readers/Xiring_XI-SIGN.txt, readers/Xiring_XI-SIGN_6000.txt, + readers/Yubico_Yubikey_neo.txt, + readers/Yubico_Yubikey_neo_otp.txt, readers/bit4id_cryptokey.txt, + readers/bit4id_iam.txt, readers/bit4id_key4.txt, + readers/bit4id_minilector-s.txt, readers/bit4id_minilector.txt, + readers/e-gate.txt, readers/iDream.txt, readers/iMONO.txt, + readers/id3_CL1356A_HID.txt, readers/id3_CL1356T.txt, + readers/id3_CL1356T5.txt, readers/jNet_jToken_s1.txt, + readers/mIDentity.txt, readers/mIDentityXL.txt, + readers/sid800.txt: Fix typo + + bClassEnveloppe: -> bClassEnvelope: only one 'p' + +2013-05-30 Ludovic Rousseau + + * [r6640] src/ccid_usb.c: Fix typo in comment + +2013-05-24 Ludovic Rousseau + + * [r6635] src/ccid_usb.c: CloseUSB(): free the + gemalto_firmware_features only on the last slot + + All the slots of a same reader use the same + gemalto_firmware_features structure. We should only free the + structure when the last slot is closing. + * [r6634] src/ccid_usb.c: Replace doubles spaces by tabulations + +2013-05-22 Ludovic Rousseau + + * [r6633] src/parse.c: Fix typo in field name + + bClassEnveloppe -> bClassEnvelope (only 1 'p') + +2013-05-17 Ludovic Rousseau + + * [r6632] readers/SCM_SDI011_512C.txt, + readers/supported_readers.txt: Add SCM Microsystems Inc. SDI011 + Contactless Reader + + This SDI011 has a new idProduct: 0x512C + +2013-05-16 Ludovic Rousseau + + * [r6631] src/ccid_usb.c: ReadUSB: Zero Length Packet (ZLP) support + + The Gemalto IDBridge CT30 and IDBridge K30 readers may send a ZLP + after some commands when connected on a USB3 bus + +2013-05-15 Ludovic Rousseau + + * [r6630] src/parse.c: Do not exit if a device with class 0xFF is + not accessible + + Maybe the device is NOT a CCID reader and the parsing should + continue. + + Thanks to Jaidev Bhattacharjee for the bug report + +2013-05-13 Ludovic Rousseau + + * [r6627] src/parse.c: parse: make the use of -p argument more + explicit + + The error message now displays: "use ./parse -p" (or whatever the + program name is) + +2013-05-11 Ludovic Rousseau + + * [r6626] readers/SCM_SCL010.txt, readers/supported_readers.txt, + src/ccid_usb.c: Add SCM Microsystems Inc. SCL010 Contactless + Reader + + A new firmware version 1.12 seems to make the reader usable as a + CCID readers in contacless mode. + +2013-05-08 Ludovic Rousseau + + * [r6624] src/ifdhandler.c: CreateChannelByNameOrChannel(): fix + clang warning + + ifdhandler.c:142:26: warning: comparison of constant 617 with + expression of type 'status_t' is always false + [-Wtautological-constant-out-of-range-compare] if + (IFD_NO_SUCH_DEVICE == ret) ~~~~~~~~~~~~~~~~~~ ^ ~~~ + + Do not mix ret of type status_t with CmdGetSlotStatus() returning + a RESPONSECODE + +2013-05-07 Ludovic Rousseau + + * [r6623] src/92_pcscd_ccid.rules: udev rule file: remove support + of Linux kernel < 2.6.35 + + USB power management is now only working on Linux kernel >= + 2.6.35 Older kernels will just not suspend the smart card reader. + * [r6622] src/92_pcscd_ccid.rules: udev rule file: Remove setting + group to pcscd + + Since pcsc-lite 1.8.0 (November 2011) the auto start of pcscd + from the library has been removed. Use systemd instead + + This action in the udev rule file is then useless. + +2013-05-04 Ludovic Rousseau + + * [r6620] readers/supported_readers.txt: THRC Smart Card Reader + moved from disabled to unsupported list + * [r6618] readers/iDream.txt, src/ccid_usb.c: New firmware of the + THRC reader + + This new firmware _may_ work. Firmware older than 1.02 are marked + as bogus. + + The reader was in the disabled list so old readers will continue + to _not_ work with the driver. + * [r6617] src/commands.c: CCID_Receive(): better management of time + extension requests + + The driver now uses the value returned in the time extension + frame to multiply the timeout value. The timeout value may be + bigger than needed but the goal is to timeout _after_ the reader. + + Thanks to Henryk Plötz for the bug report + +2013-05-03 Ludovic Rousseau + + * [r6616] readers/GemPCTwin.txt, readers/Gemalto_IDBridge_CT30.txt, + readers/supported_readers.txt: Add Gemalto IDBridge CT30 in the + Unsupported list + + This reader is an GemPC Twin with a new chipset and firmware + (version E) + +2013-04-26 Ludovic Rousseau + + * [r6614] readers/Broadcom_5880v2.txt: Update with contactless + interface enabled + http://ridrix.wordpress.com/2009/10/13/how-to-enable-pcsc-support-for-dell-contactless-reader/ + +2013-04-16 Ludovic Rousseau + + * [r6609] README, configure.ac: Release 1.4.10 + * [r6608] readers/supported_readers.txt: Regenerate using composite + readers + +2013-04-15 Ludovic Rousseau + + * [r6605] readers/CardMan3821.txt, readers/CherryXX33.txt, + readers/CherryXX44.txt, readers/GemPC433_SL.txt, + readers/SCR331-DI-NTTCom.txt, readers/Verisign_secure_token.txt, + readers/Winbond.txt: Normalize file + * [r6604] readers/Identive_CLOUD_4710_F.txt, + readers/supported_readers.txt: Add Identive CLOUD 4710 F + Contactless + SAM Reader + * [r6603] readers/Identive_CLOUD_4700_F.txt, + readers/supported_readers.txt: Add Identive CLOUD 4700 F Dual + Interface Reader + * [r6602] readers/Identive_CLOUD_4510_F.txt, + readers/supported_readers.txt: Add Identive CLOUD 4510 F + Contactless + SAM Reader + * [r6601] readers/Identive_CLOUD_4500_F.txt, + readers/supported_readers.txt: Add Identive CLOUD 4500 F Dual + Interface Reader + * [r6600] readers/Identive_CLOUD_2700_R.txt, + readers/supported_readers.txt: Add Identive CLOUD 2700 R Smart + Card Reader + * [r6599] readers/Identive_CLOUD_2700_F.txt, + readers/supported_readers.txt: Add Identive CLOUD 2700 F Smart + Card Reader + * [r6598] readers/CherryXX33.txt, readers/CherryXX44.txt, + readers/GemPC433_SL.txt, readers/SCR331-DI-NTTCom.txt, + readers/Verisign_secure_token.txt: Normalize values in hex or + decimal + +2013-04-12 Ludovic Rousseau + + * [r6597] readers/Inside_Secure_AT90SCR200.txt, + readers/supported_readers.txt: Add Inside Secure AT90SCR200 + * [r6596] readers/Inside_Secure_AT90SCR100.txt, + readers/supported_readers.txt: Add Inside Secure AT90SCR100 + * [r6595] readers/Inside_Secure_AT90SCR050.txt, + readers/supported_readers.txt: Add Inside Secure AT90SCR050 + +2013-04-09 Ludovic Rousseau + + * [r6590] readers/Gemalto_IDBridge_K3000.txt, + readers/supported_readers.txt: Add Gemalto IDBridge K3000 + +2013-04-05 Ludovic Rousseau + + * [r6587] src/92_pcscd_ccid.rules: Add SCR3310-NTTCom USB SmartCard + Reader which uses bInterfaceClass: 0xFF + + Thanks to Hiroyuki Yamamoto for the patch Closes Debian bug + #704673 + +2013-04-04 Ludovic Rousseau + + * [r6586] readers/Morpho_MSO1350.txt, + readers/supported_readers.txt: Add Morpho MSO1350 Fingerprint + Sensor & SmartCard Reader + * [r6585] readers/Morpho_MSO350.txt, readers/supported_readers.txt: + Add Morpho MSO350/MSO351 Fingerprint Sensor & SmartCard Reader + +2013-03-14 Ludovic Rousseau + + * [r6570] src/commands.c: Add support of time extension for Escape + commands + + An CCID Escape command can now use the time extension request + mechanism to ask for more time. + + Fixes Alioth bug [#314061] Time extension request and escape + command + + Thanks to Rachid HARBI-ASSYSTEM for the feature request + +2013-03-12 Ludovic Rousseau + + * [r6569] readers/Yubico_Yubikey_neo.txt, + readers/supported_readers.txt: Add Yubico Yubikey NEO CCID + * [r6567] readers/Yubico_Yubikey_neo.txt, + readers/Yubico_Yubikey_neo_otp.txt: Rename descriptor + * [r6566] examples/scardcontrol.c: Check the value returned by + fgets(3) + + Fix compiler warning: ignoring return value of ‘fgets’, declared + with attribute warn_unused_result [-Wunused-result] + +2013-03-06 Ludovic Rousseau + + * [r6565] src/openct/proto-t1.c: cppcheck: Variable 'sent_length' + is assigned a value that is never used. + * [r6564] src/openct/proto-t1.c: cppcheck: The scope of the + variable 'm' can be reduced. + * [r6563] src/ifdhandler.c: cppcheck: The scope of the variable 'i' + can be reduced. + * [r6562] src/parse.c: cppcheck: Variable 'interface' is assigned a + value that is never used. + * [r6561] src/commands.c: cppcheck: The scope of the variable + 'voltage_code' can be reduced. + * [r6560] src/commands.c: cppcheck: The scope of the variable + 'count' can be reduced. + +2013-03-01 Ludovic Rousseau + + * [r6548] readers/SafeTech_SafeTouch.txt, + readers/supported_readers.txt: Add SafeTech SafeTouch + * [r6541] readers/SpringCard_H663_Series.txt, + readers/supported_readers.txt: Add SpringCard H663 Series + * [r6540] readers/SpringCard_H512_Series.txt, + readers/supported_readers.txt: Add SpringCard H512 Series + * [r6539] readers/SpringCard_NFC_Roll.txt: New firmware (1.71) for + SpringCard NFC'Roll + +2013-02-18 Ludovic Rousseau + + * [r6533] readers/ACS_APG8201_v2.txt, + readers/supported_readers.txt: Add ACS APG8201 USB Reader with + PID 0x8202 + +2013-02-17 Ludovic Rousseau + + * [r6530] readers/GIS_SmartMouse.txt, + readers/supported_readers.txt: Add GIS Ltd SmartMouse USB + +2013-02-15 Ludovic Rousseau + + * [r6528] src/create_Info_plist.pl: Add a missing "; to terminate a + string + + The bug was introduced in revision 6518. + +2013-01-31 Ludovic Rousseau + + * [r6521] readers/Yubico_Yubikey_neo.txt, + readers/supported_readers.txt: Add Yubico Yubikey NEO OTP+CCID + +2013-01-27 Ludovic Rousseau + + * [r6518] src/Info.plist.src, src/Makefile.am, + src/create_Info_plist.pl: Remove the duplicate CFBundleExecutable + from Info.plist + + CFBundleExecutable key was used 2 times: - The first occurence + stored the bundle name (ifd-ccid.bundle) - The second occurence + stored the executable name (libccid.so or .dylib) + + The bundle name is not usefull and has been present since + revision 3458 (April 2009) + +2013-01-22 Ludovic Rousseau + + * [r6512] readers/SpringCard_NFC_Roll.txt, + readers/supported_readers.txt: Add SpringCard NFC'Roll + +2013-01-16 Ludovic Rousseau + + * [r6507] README, configure.ac: Release 1.4.9 + +2012-11-13 Ludovic Rousseau + + * [r6482] readers/ReinerSCT_cyberJack_go.txt, + readers/supported_readers.txt: Add REINER SCT cyberJack go + * [r6481] readers/supported_readers.txt: Move ATMEL VaultIC460 in + unsupported list See revision 6479 + +2012-10-31 Ludovic Rousseau + + * [r6478] src/ifdhandler.c: IFDHSetProtocolParameters(): display + the timeout + + If the reader has CCID_CLASS_AUTO_PPS_PROP then the negociations + are done by the reader itself and the default timeout + DEFAULT_COM_READ_TIMEOUT is used. + +2012-10-12 Ludovic Rousseau + + * [r6475] readers/Rutoken_PINPad_in.txt, + readers/supported_readers.txt: Add Aktiv Rutoken PINPad In + * [r6474] readers/Rutoken_PINPad_ex.txt, + readers/supported_readers.txt: Add Aktiv Rutoken PINPad Ex + +2012-10-07 Ludovic Rousseau + + * [r6471] README: Fix typo + * [r6470] README, configure.ac: Release 1.4.8 + +2012-10-04 Ludovic Rousseau + + * [r6469] configure.ac, configure.in: Rename configure.in in + configure.ac + + aclocal: warning: autoconf input should be named 'configure.ac', + not 'configure.in' + +2012-09-14 Ludovic Rousseau + + * [r6465] ylwrap: Updated version from autoamake-1.12 + * [r6464] MacOSX/configure: Use pkg-config to find the libusb-1.0 + arguments + + The libusb-1.0 path and link arguments are no more hard coded. + +2012-09-13 Ludovic Rousseau + + * [r6457] readers/MX5_SMART_CCID_DRIVER.txt, + readers/supported_readers.txt: Add MX5 SMART CCID DRIVER in the + "disabled" list + +2012-09-03 Ludovic Rousseau + + * [r6455] readers/Inside_Secure_VaultIC_440.txt, + readers/supported_readers.txt: Add Inside Secure VaultIC 440 + Smart Object + * [r6454] readers/Inside_Secure_VaultIC_420.txt, + readers/supported_readers.txt: Add Inside Secure VaultIC 420 + Smart Object + +2012-08-30 Ludovic Rousseau + + * [r6452] Makefile.am, configure.in, m4/acx_pthread.m4, + m4/ax_pthread.m4: Use AX_PTHREAD macro instead of ACX_PTHREAD + + Fix some "autoreconf -vis -Wall" warnings + +2012-08-23 Ludovic Rousseau + + * [r6438] Makefile.am, configure.in, m4/Makefile.am: Integrate + m4/Makefile.am into Makefile.am + + The idea is to remove a Makefile files to speed up compilation. + + Thanks to Diego Elio Pettenò for the idea. + * [r6437] examples/Makefile.am: Add missing PCSCv2part10.h + * [r6436] configure.in: Add AC_CONFIG_MACRO_DIR([m4]) as suggested + by autoreconf + + libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to + configure.in and libtoolize: rerunning libtoolize, to keep the + correct libtool macros in-tree. + +2012-08-07 Ludovic Rousseau + + * [r6406] examples/Makefile.am, examples/PCSCv2part10.c, + examples/PCSCv2part10.h, examples/scardcontrol.c: Use helper + functions from libPCSCv2part10 project + * [r6403] examples/scardcontrol.c: Add support of new PC/SC V2 part + 10 properties: - dwMaxAPDUDataSize - wIdVendor - wIdProduct + +2012-08-02 Ludovic Rousseau + + * [r6399] src/ifdhandler.c: CreateChannelByNameOrChannel(): check + device exists for the first CmdGetSlotStatus() + * [r6396] src/ifdhandler.c: CreateChannelByNameOrChannel(): Do not + change the default timeout for the first call to + CmdGetSlotStatus(). + + In revision 4938 the timeout is changed from default to 100 ms to + avoid a 2 seconds delay if the reader needs to resynchronize. + + In revision 5389 the timeout was changed from 100 ms to 1000 ms + because it was too sort for the Kobil KAAN Base reader. + + The idea now is to use the default value + (DEFAULT_COM_READ_TIMEOUT (3*1000)) for the first + CmdGetSlotStatus() call. And then use a short value (100 ms) for + the 2 next calls. + + The reader should have enough time to start during the 3 first + seconds. + +2012-07-26 Ludovic Rousseau + + * [r6394] readers/ActivkeySim.txt: New firmware + * [r6393] readers/SCR3310-NTTCom.txt, + readers/supported_readers.txt: Add (again) SCR3310-NTTCom USB + SmartCard Reader + * [r6390] readers/GemPCTwin.txt: New firmware (version E) + +2012-07-05 Ludovic Rousseau + + * [r6387] readers/GemPCTwin.txt: New firmware + +2012-06-23 Ludovic Rousseau + + * [r6352] readers/CherryST1044U.txt: New firmware. No other + changes. + +2012-06-22 Ludovic Rousseau + + * [r6350] configure.in: Release 1.4.7 + * [r6349] README: Release 1.4.7 + +2012-06-20 Ludovic Rousseau + + * [r6348] src/ccid_usb.c: OpenUSBByName(): Add debug log message + when the interface found is not the one we are looking for. + + This is in particular interesting for a composite device and the + CCID driver compiled with --enable-composite-as-multislot + +2012-06-15 Ludovic Rousseau + + * [r6337] readers/NXP_PR533.txt: New firmware + +2012-06-13 Ludovic Rousseau + + * [r6331] readers/ACS_CryptoMate64.txt, + readers/supported_readers.txt: Add ACS CryptoMate64 + +2012-06-06 Ludovic Rousseau + + * [r6328] src/openct/proto-t1.c: t1_transceive(): avoids a infinite + retry loop + + Move the check for ISO 7816-3 Rule 7.4.2 (2 retried before + resynch) before the check for ISO 7816-3 Rule 7.2 (retransmission + of R-block) + + Thanks to Martin Vogt for the bug report and patch + http://archives.neohapsis.com/archives/dev/muscle/2012-q2/0077.html + * [r6327] src/openct/proto-t1.c: t1_transceive(): avoids a infinite + retry loop + + Add a check for ISO 7816-3 Rule 7.4.2 (2 retried before resync) + in case of "wrong nr". + + " currently I have an endless loop in t1_transceive. It happens + from time to time with the aladdin token. + + I added some printfs to the code. I can see, that the errors are + detected and then a t1_build is called with a T1_OTHER_ERROR, + retries are decreased, but this is never evaluated in the loop + path and the retries counter counts and counts.... I stopped it + at: retries -1796. " + + Thanks to Martin Vogt for the bug report and patch + http://archives.neohapsis.com/archives/dev/muscle/2012-q2/0076.html + * [r6326] src/ccid_usb.c: OpenUSBByName(): check the lists + vendorID, productID and friendlyNames have all the same size. + + This should prevent a crash if the parsing failed. For example it + would avoid a crash due to a bug similar to the one fixed in + revision 6325: ie a reader with [ ] in its name. + +2012-05-30 Ludovic Rousseau + + * [r6313] SCARDGETATTRIB.txt: Update descriptions + +2012-05-26 Ludovic Rousseau + + * [r6311] src/commands.c: Always check for STATUS_NO_SUCH_DEVICE + and return accordingly + + Thanks to Martin Vogt for the bug report and patch idea + http://archives.neohapsis.com/archives/dev/muscle/2012-q2/0057.html + * [r6310] src/openct/proto-t1.c: t1_xcv(): always return a negative + value in case of error + + Thanks to Martin Vogt for the patch + http://archives.neohapsis.com/archives/dev/muscle/2012-q2/0057.html + +2012-05-19 Ludovic Rousseau + + * [r6309] readers/supported_readers.txt: Add KOBIL Systems IDToken + * [r6308] src/ifdhandler.c: Add Reader-Info-Commands special + APDU/command for the Kobil IDToken + + - Manufacturer command - Product name command - Firmware version + command - Driver version command + + The APDU are handled by the driver sice the reader do not support + them. These APDU/commands are used by the AusweisApp application + and a German eID card. + * [r6307] src/ifdhandler.c: Hack for the Kobil IDToken and Geman + eID card + + The German eID card is bogus and need to be powered off before a + power on + * [r6306] src/ccid.h: Add Kobil IDToken definition + * [r6305] src/defs.h: Give more time (3 seconds instead of 2) to + the reader to answer + + The IDToken reader takes up to 2.5 seconds to answer to an + PC_to_RDR_GetSlotStatus command after the (contactless) card has + been removed. + +2012-05-18 Ludovic Rousseau + + * [r6301] configure.in: warning: 'libccid.la': linking libtool + libraries using a non-POSIX archiver requires 'AM_PROG_AR' in + 'configure.in' + * [r6300] configure.in: autoupdated using autoupdate (GNU Autoconf) + 2.69 + +2012-05-16 Ludovic Rousseau + + * [r6297] readers/Vasco_DP905.txt: Firmware upgrade + + The new firmware supports extended APDU and iProduct changed from + DP905 to DP905v1.1 + +2012-05-15 Ludovic Rousseau + + * [r6296] readers/ACS_ACR101.txt, readers/supported_readers.txt: + Add ACS ACR101 ICC Reader + +2012-05-11 Ludovic Rousseau + + * [r6292] src/ccid_usb.c: OpenUSBByName(): log the Info.plist used + + On Mac OS X the CCID driver may be installed many times with + different names using --enable-bundle=... + + With the Info.plist file name displayed it is possible to check + the correct Info.plist is used. + +2012-05-01 Ludovic Rousseau + + * [r6289] readers/AlcorMicro_AU9522.txt, + readers/supported_readers.txt: Add Alcor Micro AU9522 + +2012-04-18 Ludovic Rousseau + + * [r6284] readers/sid800.txt: New firmware + * [r6283] readers/bit4id_cryptokey.txt, + readers/supported_readers.txt: Add Bit4id cryptokey + * [r6282] readers/bit4id_iam.txt, readers/supported_readers.txt: + Add Bit4id iAM + * [r6281] readers/bit4id_key4.txt, readers/supported_readers.txt: + Add Bit4id CKey4 + * [r6280] readers/bit4id_minilector-s.txt, + readers/supported_readers.txt: Add Bit4id miniLector-s + * [r6279] readers/bit4id_minilector.txt, + readers/supported_readers.txt: Add Bit4id miniLector + * [r6278] readers/supported_readers.txt: Sort the duplicates + section by vid/pid + * [r6277] readers/NXP_PR533.txt, readers/supported_readers.txt: Add + NXP PR533 + +2012-04-17 Ludovic Rousseau + + * [r6275] src/92_pcscd_ccid.rules: Use auto suspend for CCID + devices only + + The rule used "*:0b0000:*" and so was used even for composite + devices using a CCID interface. It was problematic for a keybord + + CCID interface since the keyboard was also automatically + systended after a few seconds of inactivity. + + The new rule uses ":0b0000:" so composite devices will not be + configured for USB automatic suspend. + + Closes Alioth bug [#313445] "Do not activate USB suspend for + composite devices: keyboard" + https://alioth.debian.org/tracker/index.php?func=detail&aid=313445&group_id=30105&atid=410085 + +2012-04-13 Ludovic Rousseau + + * [r6274] src/ccid.c: Use %zd instead of %ld for size_t size + + Fix compiler warning ccid.c: In function + `dump_gemalto_firmware_features': ccid.c:122:2: warning: format + `%ld' expects argument of type `long int', but argument 6 has + type `unsigned int' [-Wformat] + + sizeof returns a size_t value with a variable length depending on + the architecture. + +2012-04-12 Ludovic Rousseau + + * [r6273] readers/Gemalto_Ezio_Branch.txt, + readers/supported_readers.txt: Add Gemalto Ezio Shield Branch + Reader + +2012-04-08 Ludovic Rousseau + + * [r6270] readers/CCB_eSafeLD.txt, readers/supported_readers.txt: + Add CCB eSafeLD + +2012-04-06 Ludovic Rousseau + + * [r6266] README, configure.in: Release 1.4.6 + * [r6265] ylwrap: Update to version 2011-08-25.18 + * [r6264] MacOSX/configure: Use the new SDK path for Xcode 4 + + Xcode is now a normal application downloaded from the Mac App + Store. All the files are now contained in /Applications/Xcode.app + +2012-04-05 Ludovic Rousseau + + * [r6260] src/ccid.c: Use DWORD_D instead %ld to fix a warning on + Mac OS X 64-bits + + ccid.c: In function 'set_gemalto_firmware_features': ccid.c:204: + warning: format '%ld' expects type 'long int', but argument 6 has + type 'RESPONSECODE' + * [r6259] src/defs.h, src/ifdhandler.c: Move definitions of DWORD_X + and DWORD_D + +2012-04-04 Ludovic Rousseau + + * [r6258] src/ifdhandler.c: IFDHControl(): Add support of + dwMaxAPDUDataSize + + This property indicates if a reader/driver supports extended APDU + or not. + + From PC/SC v2 part 10 (version 2.02.09 not yet published): + dwMaxAPDUDataSize: Maximal size of data the reader and its driver + can support 0: short APDU only. 0 000000 + 69 14 00 00 00 00 24 00 00 00 00 1E 02 00 00 10 04 02 00 00 00 00 + 00 40 05 00 20 00 81 00 30005454 <- 000000 80 00 00 00 00 00 24 + 40 F0 00 00000059 commands.c:1339:CCID_Receive PIN timeout + + Instead of telling the reader has SPE and failing with an obscure + error the driver will disable the SPE feature. + + Thanks to Jörg Grundmann for the bug report. + +2012-01-27 Ludovic Rousseau + + * [r6207] readers/supported_readers.txt: Sort the readers of a same + manufacturer by PID + * [r6203] readers/supported_readers.txt: Generated by + website/generate_supported_readers.py + + The list of supported readers is now generated from list of USB + descriptor files. + + Readers without a .txt file are now NO MORE supported. They are: + Reader(s) without a .txt description 0x08E6:0x34C1:Gemalto Ezio + Shield Secure Channel 0x08E6:0x34C4:Gemalto Ezio Generic + 0x04E6:0x511A:SCM SCR 3310 NTTCom 0x0783:0x0008:C3PO LTC32 USBv2 + with keyboard support 0x0783:0x9002:C3PO TLTC2USB + 0x047B:0x020B:Silitek SK-3105 + +2012-01-23 Ludovic Rousseau + + * [r6191] readers/GemPCTwin_serial.txt: Duplicates of GemPCTwin.txt + + It is a duplicate by design since it is a symbolic link. Now that + supported_readers.txt is generated from the .txt file this is + problematic. + +2012-01-16 Ludovic Rousseau + + * [r6179] src/debug.c: Log to stdout by default + + This log service is only used on Mac OS X. Using stderr is + problematic when other log mesages are using stdout. The order is + not respected if stdout and stderr are redirected to a file. For + example when using handler_test. + + Now the logs are sent to stdout (by default) and also flushed + after each line. It is possible to use tee(1). + +2012-01-12 Ludovic Rousseau + + * [r6168] readers/Todos_Connectable.txt: Todos_Connectable.txt is a + duplicate of Todos_Cx00.txt + +2012-01-03 Ludovic Rousseau + + * [r6164] readers/Teridian_TSC12xxFV.09.txt, + readers/supported_readers.txt: Add Teridian TSC12xxF + * [r6162] readers/Avtor_SecureToken.txt, + readers/supported_readers.txt: Add Avtor SecureToken + +2012-01-02 Ludovic Rousseau + + * [r6161] readers/supported_readers.txt: Update "Giesecke & + Devrient StarSign Crypto USB Token" name on G&D request + * [r6159] MacOSX/configure: Build a Universal Binary driver only if + libusb is also a Universal Binary library + * [r6158] MacOSX/configure: Add $Id$ + * [r6157] MacOSX/configure: Add -lobjc since + objc_registerThreadWithCollector() is used now in + libusb-1.0.8-rc3 + + See libusb ticket #63 "libusb pthread usage causes error in + garbage collected Cocoa apps" http://libusb.org/ticket/63 + +2011-12-31 Ludovic Rousseau + + * [r6154] readers/Vasco_DIGIPASS_KEY_202_0120.txt, + readers/Vasco_DIGIPASS_KEY_202_0122.txt, + readers/supported_readers.txt: Add Vasco DIGIPASS KEY 202 with + ProductID 0x0120 and 0x0122 + +2011-12-16 Ludovic Rousseau + + * [r6144] readers/Vasco_DPKey101.txt, + readers/supported_readers.txt: Add Vasco DIGIPASS KEY 101 + * [r6141] readers/Avtor_SC_Reader_371.txt, + readers/supported_readers.txt: Add Avtor SC Reader 371 + +2011-12-06 Ludovic Rousseau + + * [r6135] src/ccid_usb.c: Fix bug from revision 6134 + + The correct return value is STATUS_SUCCESS for success. + * [r6134] src/ccid_usb.c: OpenUSBByName(): fix memory leaks + + Some memory was not released in case of errors. + * [r6133] src/ifdhandler.c: IFDHCreateChannelByName(): fix memory + leak + + Memory leak if the OpenPortByName() failed + +2011-12-01 Ludovic Rousseau + + * [r6125] readers/supported_readers.txt: Fix OmniKey 6321 CLi USB + name + * [r6123] readers/Omnikey_6321.txt, readers/supported_readers.txt: + Add OmniKey 6321 USB + +2011-11-03 Ludovic Rousseau + + * [r6100] readers/Xiring_MyLeo.txt: New firmware + * [r6099] readers/Kobil_EMV_CAP.txt: New firmware + * [r6097] readers/Feitian_SCR301.txt: New firmware release + * [r6096] src/ccid_usb.c: ControlUSB(): return a negative value in + case of error instead of STATUS_UNSUCCESSFUL (0xFB) + + The calling code is checking for a negative return value so we + adapt the API to its usage. + +2011-10-30 Ludovic Rousseau + + * [r6088] src/create_Info_plist.pl: Convert "&" in a reader name + into "&" + + For example the name "Giesecke & Devrient" does not work on Mac + OS X using hotplug_macosx.c and generates the error: 00000683 + hotplug_macosx.c:161:HPDriversGetFromDirectory() error getting + vendor ID from bundle + +2011-10-28 Ludovic Rousseau + + * [r6085] readers/SCM_SDI011.txt, readers/supported_readers.txt: + Add SCM SDI 011 + +2011-10-24 Ludovic Rousseau + + * [r6075] examples/scardcontrol.c: Move a variable to the block it + is used + * [r6074] examples/scardcontrol.c: Display PIN_PROPERTIES_STRUCTURE + if any + +2011-10-23 Ludovic Rousseau + + * [r6066] readers/Inside_Secure_VaultIC_460_Smart_Object.txt, + readers/supported_readers.txt: Add Inside Secure VaultIC 460 + Smart Object + * [r6064] + readers/FujitsuTechnologySolutions_SmartCase_KB_SCR_eSIG.txt, + readers/supported_readers.txt: Add Fujitsu SmartCase KB SCR eSIG + +2011-10-20 Ludovic Rousseau + + * [r6049] src/ccid_usb.c: InterruptStop(): Do not interrupt two + times (or more) the same libusb transfer + + This can happen within SCardDisconnect() on the same reader from + 2 or more threads/processes. This is the case with + PCSC.work/UnitaryTests/ThreadSafeConnect.py + +2011-10-14 Ludovic Rousseau + + * [r6040] readers/GnD_StarSign_CUT.txt, + readers/supported_readers.txt: Add Giesecke & Devrient StarSign + CUT + +2011-10-11 Ludovic Rousseau + + * [r6032] README, configure.in: Release 1.4.5 + +2011-10-10 Ludovic Rousseau + + * [r6025] src/ccid_usb.c: Remove a debug log + * [r6024] src/ccid.h: Remove a const qualifier to avoid a warning + on free() + + ccid_usb.c: In function 'CloseUSB': ccid_usb.c:742:4: warning: + passing argument 1 of 'free' discards 'const' qualifier from + pointer target type [enabled by default] + * [r6023] src/ccid_usb.c: CloseUSB(): free the sIFD_iManufacturer + allocated resource is needed + * [r6022] src/ifdhandler.c: Remove debug log + * [r6021] src/ccid.h, src/ccid_serial.c, src/ccid_usb.c, + src/ifdhandler.c: SCARD_ATTR_VENDOR_NAME and + SCARD_ATTR_VENDOR_IFD_VERSION are not the vendor name and version + of the driver but of the IFD: InterFace Device i.e. the smart + card reader. + + We then return the USB iManufacturer string as + SCARD_ATTR_VENDOR_NAME and USB bcdDevice as + SCARD_ATTR_VENDOR_IFD_VERSION + +2011-10-05 Ludovic Rousseau + + * [r6000] readers/ActivCardV3.txt: Firmware update + +2011-10-02 Ludovic Rousseau + + * [r5991] src/ifdhandler.c: Add support of FEATURE_CCID_ESC_COMMAND + and bPPDUSupport + + FEATURE_CCID_ESC_COMMAND is available only if ifdDriverOptions + (from Info.plist config file) has bit 1 set: + + 1: DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED the CCID Exchange + command is allowed. You can use it through SCardControl(hCard, + IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, ...) + * [r5990] examples/scardcontrol.c: Use FEATURE_CCID_ESC_COMMAND to + get the firmware of a GemPC reader + * [r5989] examples/scardcontrol.c: Add support of + PCSCv2_PART10_PROPERTY_bPPDUSupport and FEATURE_CCID_ESC_COMMAND + +2011-09-20 Ludovic Rousseau + + * [r5959] src/ccid_usb.c: ControlUSB(): log an eror if + libusb_control_transfer() fails + + Instead of passing a negative length to DEBUG_XXD() and make it + crash. + +2011-09-13 Ludovic Rousseau + + * [r5952] .gitignore: Add missing files in .gitignore + +2011-09-02 Ludovic Rousseau + + * [r5927] .gitignore: Create .gitignore files + +2011-08-31 Ludovic Rousseau + + * [r5925] readers/SDS4ID_DominoKeyPro_100.txt, + readers/supported_readers.txt: Add SDS DOMINO-Key TWIN Pro + * [r5923] readers/BIFIT_iBank2key.txt, + readers/supported_readers.txt: Add BIFIT iBank2Key + +2011-08-30 Ludovic Rousseau + + * [r5921] readers/Gemalto_SA_dotNet_Dual.txt, + readers/supported_readers.txt: Add Gemalto SA .NET Dual + +2011-08-27 Ludovic Rousseau + + * [r5916] src/debug.h, src/ifdhandler.c: Remove extra spaces + +2011-08-25 Ludovic Rousseau + + * [r5912] examples/scardcontrol.c: Remove extra spaces + * [r5911] readers/Precise_Sense_MC.txt: Add Precise Sense MC reader + (with fingerprint) + +2011-08-24 Ludovic Rousseau + + * [r5909] src/Makefile.am: Do not build simclist with (unused) file + dump option + + Gain 5kB (or 5%) space for the binary text segment of libccid.so + * [r5908] src/ccid_serial.c: OpenSerial(): remove useless casts + * [r5907] src/commands.c: CCID_Transmit(): use a variable-length + array + + Use a VLA instead of static size of 65556 to limit stack + consumption + + Coverity: stack_use_local: Local variable "cmd" stack use: 65556 + bytes -> 65572 bytes total. stack_use_overflow: The maximum stack + use of 32768 bytes is exceeded. + * [r5906] src/commands.c: SecurePINModify(): use a variable-length + array + + Use a VLA instead of static size of 65576 to limit stack + consumption + + Coverity: stack_use_local: Local variable "cmd" stack use: 65576 + bytes -> 65592 bytes total. stack_use_overflow: The maximum stack + use of 32768 bytes is exceeded. + * [r5905] src/commands.c: SecurePINVerify(): use a variable-length + array + + Use a VLA instead of static size of 65572 to limit stack + consumption + + Coverity: stack_use_local: Local variable "cmd" stack use: 65572 + bytes -> 65588 bytes total. stack_use_overflow: The maximum stack + use of 32768 bytes is exceeded. + * [r5904] src/debug.c: Add a missing #include "strlcpycat.h" needed + on GNU/Linux + * [r5903] src/commands.c: SetParameters(): use a variable-length + array + + Use a VLA instead of static size of 65556 to limit stack + consumption + + Coverity: Event stack_use_local: Local variable "cmd" stack use: + 65556 bytes -> 65572 bytes total. Event stack_use_overflow: The + maximum stack use of 32768 bytes is exceeded. + * [r5902] src/commands.c: Remove extra spaces + +2011-08-21 Ludovic Rousseau + + * [r5897] src/debug.c: Use a variable-length array + + The debug message buffer is no more with a fixed size (around 256 + bytes of buffer to log) but uses a variable-length array. + + This is available in GCC in C90 mode and is mandatory in C99 + standard. + +2011-08-20 Ludovic Rousseau + + * [r5895] src/Makefile.am, src/ccid.h, src/commands.c, src/parse.c: + Remove extra spaces and tabs + +2011-08-19 Ludovic Rousseau + + * [r5893] readers/Gemalto_Ezio_Shield_PinPad.txt: Add Gemalto Ezio + Shield PinPad reader + +2011-08-17 Ludovic Rousseau + + * [r5890] readers/BIFIT_USB-Token_iBank2key.txt, + readers/supported_readers.txt: Add BIFIT USB-Token iBank2key + +2011-08-05 Ludovic Rousseau + + * [r5878] readers/Ubisys_RFID.txt, readers/supported_readers.txt: + Add Ubisys 13.56MHz RFID (CCID) + +2011-07-09 Ludovic Rousseau + + * [r5871] src/ifdhandler.c: Fix compiler warnings + + ifdhandler.c: In function `IFDHCreateChannelByName': + ifdhandler.c:80:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHCreateChannel': + ifdhandler.c:201:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHCloseChannel': ifdhandler.c:294:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHPolling': ifdhandler.c:331:3: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHSleep': ifdhandler.c:346:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHStopPolling': ifdhandler.c:367:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHGetCapabilities': + ifdhandler.c:401:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + ifdhandler.c:401:2: warning: format `%X' expects argument of type + `unsigned int', but argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHSetCapabilities': + ifdhandler.c:660:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + ifdhandler.c:660:2: warning: format `%X' expects argument of type + `unsigned int', but argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHSetProtocolParameters': + ifdhandler.c:702:2: warning: format `%d' expects argument of type + `int', but argument 6 has type `DWORD' [-Wformat] + ifdhandler.c:702:2: warning: format `%X' expects argument of type + `unsigned int', but argument 8 has type `DWORD' [-Wformat] + ifdhandler.c:920:5: warning: format `%d' expects argument of type + `int', but argument 6 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHPowerICC': ifdhandler.c:1153:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHTransmitToICC': + ifdhandler.c:1283:2: warning: format `%X' expects argument of + type `unsigned int', but argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHControl': ifdhandler.c:1325:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 6 has type `DWORD' [-Wformat] ifdhandler.c:1325:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHICCPresence': ifdhandler.c:1616:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHCreateChannelByName': + ifdhandler.c:80:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHCreateChannel': + ifdhandler.c:201:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHCloseChannel': ifdhandler.c:294:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHGetCapabilities': + ifdhandler.c:401:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + ifdhandler.c:401:2: warning: format `%X' expects argument of type + `unsigned int', but argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHSetCapabilities': + ifdhandler.c:660:2: warning: format `%X' expects argument of type + `unsigned int', but argument 6 has type `DWORD' [-Wformat] + ifdhandler.c:660:2: warning: format `%X' expects argument of type + `unsigned int', but argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHSetProtocolParameters': + ifdhandler.c:702:2: warning: format `%d' expects argument of type + `int', but argument 6 has type `DWORD' [-Wformat] + ifdhandler.c:702:2: warning: format `%X' expects argument of type + `unsigned int', but argument 8 has type `DWORD' [-Wformat] + ifdhandler.c:920:5: warning: format `%d' expects argument of type + `int', but argument 6 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHPowerICC': ifdhandler.c:1153:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHTransmitToICC': + ifdhandler.c:1283:2: warning: format `%X' expects argument of + type `unsigned int', but argument 7 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHControl': ifdhandler.c:1325:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 6 has type `DWORD' [-Wformat] ifdhandler.c:1325:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 8 has type `DWORD' [-Wformat] + + ifdhandler.c: In function `IFDHICCPresence': ifdhandler.c:1616:2: + warning: format `%X' expects argument of type `unsigned int', but + argument 7 has type `DWORD' [-Wformat] + * [r5870] src/ccid_usb.c: Fix compiler warning + + ccid_usb.c: In function `OpenUSBByName': ccid_usb.c:245:2: + warning: format `%s' expects argument of type `char *', but + argument 6 has type `void *' [-Wformat] ccid_usb.c:246:2: + warning: format `%s' expects argument of type `char *', but + argument 6 has type `void *' [-Wformat] ccid_usb.c:247:2: + warning: format `%s' expects argument of type `char *', but + argument 6 has type `void *' [-Wformat] + +2011-07-06 Ludovic Rousseau + + * [r5839] src/commands.c: T0ProcSW1(): remove 2 useless variables + after revision 5834 + + commands.c: In function 'T0ProcSW1': commands.c:1794: warning: + unused variable 'rcv_len_tmp' commands.c:1793: warning: unused + variable 'rcv_buf_tmp' + * [r5838] src/ifdhandler.c: Fix compiler warning + + ifdhandler.c: In function ‘IFDHGetCapabilities’: + ifdhandler.c:612: warning: implicit declaration of function + ‘strlcpy’ ifdhandler.c:612: warning: nested extern declaration of + ‘strlcpy’ + * [r5837] src/ccid_serial.c: Add #include "strlcpycat.h" + + coverity: Event implicit_func_decl: function "strlcpy" declared + implicitly + * [r5836] src/debug.c: log_xxd(): use safer snprintf() instead of + sprintf() + + coverity: Event secure_coding: [VERY RISKY]. Using "sprintf" can + cause a buffer overflow when done incorrectly. Because sprintf() + assumes an arbitrarily long string, callers must be careful not + to overflow the actual space of the destination. Use snprintf() + instead, or correct precision specifiers. + * [r5835] src/commands.c: CmdEscape(): fix a memory leak + + coverity: Event leaked_storage: Variable "cmd_out" going out of + scope leaks the storage it points to. + * [r5834] src/commands.c: T0ProcSW1(): remove dead code. + + The case (return_value != IFD_SUCCESS) is already treated a few + lines above. + + coverity: Event dead_error_begin: Execution cannot reach this + statement "rcv_buf_tmp[0] = rcv_buf_tm...". + * [r5833] src/ccid_serial.c: OpenSerialByName(): use safer + strlcpy() instead of strncpy() + + coverity: Event buffer_size_warning: Calling strncpy with a + maximum size argument of 255 bytes on destination array + "reader_name" of size 255 bytes might leave the destination + string unterminated. + +2011-07-05 Ludovic Rousseau + + * [r5832] src/ifdhandler.c: IFDHGetCapabilities(): use strlcpy() + instead of the insecure strcpy + + No problem was expected since pcsc-lite uses a big buffer. + + coverity: Event secure_coding: [VERY RISKY]. Using "strcpy" can + cause a buffer overflow when done incorrectly. If the destination + string of a strcpy() is not large enough then anything might + happen. Use strncpy() instead. + * [r5829] src/commands.c: CmdXfrBlockAPDU_extended(): Initialize + local_rx_length + + Silence coverity: Event uninit_use_in_call: Using uninitialized + value "local_rx_length" when calling "CCID_Receive". + * [r5828] src/parse.c: Fix a UNREACHABLE coverity error + + Code after the goto was dead code + * [r5827] src/ccid_usb.c: OpenUSBByName(): readerID is also needed + on Mac OS X + + Partly reverting revision r5816 + +2011-06-30 Ludovic Rousseau + + * [r5816] src/ccid_usb.c: Fix compiler warnings + + ccid_usb.c: In function 'OpenUSBByName': ccid_usb.c:324: warning: + unused variable 'readerID' + +2011-06-29 Ludovic Rousseau + + * [r5815] configure.in: Enable silent build by default + +2011-06-16 Ludovic Rousseau + + * [r5800] readers/supported_readers.txt: Update OBERTHUR + TECHNOLOGIES ID-ONE TOKEN SLIM v2 reader name on request of F. + Bourgault + * [r5799] readers/Oberthur-ID-ONE_token_slim_v2.txt: New firmware + +2011-06-13 Ludovic Rousseau + + * [r5789] src/commands.c: SecurePINModify(): update comment for a + GemPC pinpad bug circumvention hack + * [r5788] src/commands.c: Rename bNumberMessages in bNumberMessage + (singular) to conform to the CCID specification names + +2011-06-12 Ludovic Rousseau + + * [r5787] examples/scardcontrol.c: Do not reference secoder_info + for properties_in_tlv_ioctl tag + +2011-05-18 Ludovic Rousseau + + * [r5761] readers/AU9540.txt, readers/supported_readers.txt: Add + Alcor Micro AU9540 + +2011-05-13 Ludovic Rousseau + + * [r5746] configure.in: Use AC_LANG_SOURCE to fix a warning from + autoconf 2.68 + + configure.in:151: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE + call detected in body + * [r5742] README, configure.in: Release 1.4.4 + * [r5741] README: Some minor corrections + +2011-05-12 Ludovic Rousseau + + * [r5740] src/ccid.h, src/ccid_usb.c: OpenUSBByName(): Some early + Gemalto Ezio CB+ readers have bDeviceClass, bDeviceSubClass and + bDeviceProtocol set to 0xFF (proprietary) instead of 0x00. + + So on Mac OS X the reader configuration is not done by the + OS/kernel and we do it ourself. + * [r5739] src/ccid_usb.c: OpenUSBByName(): move declaration of + readerID outside of the USE_COMPOSITE_AS_MULTISLOT case so that + the variable can also be used elsewhere + * [r5738] src/ccid_usb.c: OpenUSBByName(): remove a (useless) { } + block level + * [r5737] src/ccid_usb.c: OpenUSBByName(): log the error code + returned by libusb_get_active_config_descriptor() if any + +2011-05-09 Ludovic Rousseau + + * [r5731] readers/supported_readers.txt: Add Gemalto Ezio Shield + Secure Channel, Gemalto Ezio Shield PinPad and Gemalto Ezio + Generic + * [r5728] readers/GemCorePOSPro.txt: Add Gemalto GemCore POS Pro + * [r5727] src/ifdhandler.c: init_driver(): do not fail if the + Info.plist file is not found + + This may happen if the driver for the serial GemPC Twin is used + but the USB driver is NOT installed (no .bundle directory). + + Thanks to Frederic Dumas for the bug report. + * [r5726] readers/Gemalto_Ezio_CB+.txt, + readers/supported_readers.txt: Add Gemalto Ezio CB+ + * [r5725] src/ifdhandler.c: Add support of TLV Properties + wLcdMaxCharacters and wLcdMaxLines They just duplicate wLcdLayout + * [r5724] examples/scardcontrol.c: Add table for bMsgIndex[1-3] and + correctly set bMsgIndex2 and bMsgIndex3 + * [r5723] examples/scardcontrol.c: Update copyright + * [r5722] examples/scardcontrol.c: Add table for + bEntryValidationCondition + * [r5718] readers/Gemalto_Ezio_Shield.txt, + readers/supported_readers.txt: Add Gemalto Ezio Shield + +2011-05-07 Ludovic Rousseau + + * [r5716] src/Makefile.am: Use $(sysconfdir) instead of hardcoded + "etc" in install_ccidtwin rule + * [r5715] configure.in: Reuse the definition of $usbdropdir to + define the default value of ccidtwindir + + It is important if --enable-usbdropdir=DIR is used and + `$PKG_CONFIG libpcsclite --variable=usbdropdir` should then not + be used. + +2011-04-22 Ludovic Rousseau + + * [r5706] src/92_pcscd_ccid.rules: Activate USB automatic power + suspend. The Linux kernel should power off the reader + automatically if it is not used (pcscd is not running). + + Documentation from + http://www.lesswatts.org/projects/devices-power-management/usb.php + + Closes: alioth bug [#311273] CCID driver: Enable USB selective + suspend when possible + +2011-04-14 Ludovic Rousseau + + * [r5698] readers/MSI_StarReader_SMART.txt: firmware update + +2011-04-08 Ludovic Rousseau + + * [r5695] src/ifdhandler.c: T0_card_timeout/T1_card_timeout: set + timeout to 60 seconds instead of 60 milliseconds if the ATR is + non ISO + +2011-04-07 Ludovic Rousseau + + * [r5693] readers/HP_kus-0133.txt, readers/supported_readers.txt, + src/ccid_usb.c: Firmware 1.24 of the HP USB CCID Smartcard + Keyboard fixes the problem reported with the 1.22. But the pinpad + is (still) bogus. + +2011-04-02 Ludovic Rousseau + + * [r5688] README, configure.in: release 1.4.3 + +2011-03-30 Ludovic Rousseau + + * [r5681] readers/LTC31v2.txt: firmware update + +2011-03-28 Ludovic Rousseau + + * [r5678] readers/Feitian_ePass2003_PKI.txt, + readers/supported_readers.txt: Add Feitian ePass2003 + +2011-03-26 Ludovic Rousseau + + * [r5672] src/ccid_usb.c: Fix a stupid bug in the previous revision + * [r5671] src/ccid_usb.c: OpenUSBByName(): check the value returned + by libusb_init() + +2011-03-23 Ludovic Rousseau + + * [r5666] src/ccid.c, src/ccid.h: the Secure Pin Entry of the HP + USB Smart Card Keyboard is bogus so disable it + + http://martinpaljak.net/2011/03/19/insecure-hp-usb-smart-card-keyboard/ + +2011-03-18 Ludovic Rousseau + + * [r5660] src/ccid.c: ccid_error(): simplify code and avoids a + "clang --analyze" warning + + ccid.c:490:5: warning: Value stored to 'text' is never read text + = var_text; ^ ~~~~~~~~ + +2011-03-14 Ludovic Rousseau + + * [r5656] readers/SCM_SCL011.txt, readers/supported_readers.txt: + Add SCM SCL011 + +2011-03-13 Ludovic Rousseau + + * [r5654] configure.in: Use the same code as in pcsc-lite to detect + the plateform name (BUNDLE_HOST) + +2011-03-09 Ludovic Rousseau + + * [r5651] readers/Vasco_Digipass920.txt, + readers/supported_readers.txt: Add Vasco DIGIPASS 920 + +2011-03-08 Ludovic Rousseau + + * [r5645] readers/Neowave_Weneo4.txt, + readers/supported_readers.txt: Add a new Neowave Weneo reader + +2011-02-25 Ludovic Rousseau + + * [r5640] contrib/Kobil_mIDentity_switch/Makefile.am, + contrib/RSA_SecurID/Makefile.am: Do not install + RSA_SecurID_getpasswd and Kobil_mIDentity_switch and the + associated documentation. + + Only very few people need these tools. Adding them bring a + dependency on libpcsclite (see Debian bug #612972 "libccid: + circular dependency with pcscd and libpcsclite1") + * [r5639] src/ccid_usb.c: Use the :libudev: instead of :libhal: + naming scheme. It is supported by pcsc-lite since revision 5638. + + It is only usefull for USB devices with more than one CCID + interface. + * [r5637] src/ifdhandler.c: get_IFSC(): parse TA byte before TD + byte for a same iteration. So that TA3 is parsed before TD3 and + the IFSC is correctly parsed in an ATR like: 3B F0 12 00 FF 91 81 + B1 7C 45 1F 03 99 + + Thanks to Toshimune Konno for the bug report + +2011-02-22 Ludovic Rousseau + + * [r5626] README, configure.in: release 1.4.2 + * [r5625] readers/supported_readers.txt: Add Xiring MyLeo + * [r5622] readers/Aktiv_Rutoken_Lite.txt, + readers/supported_readers.txt: Add Aktiv Rutoken lite + +2011-02-20 Ludovic Rousseau + + * [r5620] bootstrap: Use /bin/sh instead of bash + + bash is installed in /usr/local on FreeBSD + +2011-02-16 Ludovic Rousseau + + * [r5615] readers/Broadcom_5880v4.txt: Add another Broadcom 5880 + with PID = 0x5802 This one is a dual interface + contact/contactless + * [r5614] readers/GemProxDU.txt, readers/GemProxDU_contact.txt, + readers/GemProxDU_contactless.txt, readers/GemProxSU.txt, + readers/GemProxSU_contact.txt, readers/GemProxSU_contactless.txt: + Concat the 2 interfaces of the GemProxDU and GemProxSU in only 1 + .txt file each now that matrix.py can support it + * [r5599] src/parse.c: Align the number of lines and characters per + line in wLcdLayout parse + +2011-02-13 Ludovic Rousseau + + * [r5596] readers/ATMEL_AT91SO.txt, readers/CardMan3821.txt, + readers/GemPCPinpadv2.txt, readers/Kobil_EMV_CAP.txt, + readers/Kobil_mIDentity_visual.txt, + readers/Todos_Connectable.txt, readers/Todos_Cx00.txt, + readers/Vasco_DP855.txt, readers/Vasco_DP865.txt, + readers/Xiring_Leov2.txt, readers/Xiring_MyLeo.txt, + readers/Xiring_XI-SIGN.txt, readers/Xiring_XI-SIGN_6000.txt: + Correctly parse wLcdLayout (the 2 bytes were interverted) + * [r5595] src/parse.c: The bytes for wLcdLayout were interverted + * [r5594] examples/scardcontrol.c: Use a SCARD_SHARE_SHARED instead + of SCARD_SHARE_DIRECT since we are really talking to the card, + not just to the reader. So SCardConnect() has to power on the + card if needed. + +2011-02-11 Ludovic Rousseau + + * [r5593] src/Makefile.am: Do not add the version to the library + name + + Thanks to Diego Elio Pettenò for the idea + * [r5592] src/Makefile.am: make parse a noinst_PROGRAMS + + Thanks to Diego Elio Pettenò for the idea + +2011-02-09 Ludovic Rousseau + + * [r5586] readers/Xiring_MyLeo.txt: Add Xiring MyLeo reader + +2011-02-04 Ludovic Rousseau + + * [r5578] src/commands.c: CmdXfrBlockCHAR_T0(): use 'int' instead + of 'char' for backup_len variable since it can contain up to 256. + + Thanks to el Tuba for the patch. + +2011-01-29 Ludovic Rousseau + + * [r5570] readers/supported_readers.txt: Add Xiring Leo v2 + * [r5565] readers/Xiring_Leov2.txt: New firmware release + +2011-01-28 Ludovic Rousseau + + * [r5563] contrib/RSA_SecurID/RSA_SecurID_getpasswd.c: Correctly + display the 2 last bytes (status word) instead of potentially + garbage in the received buffer. + * [r5562] contrib/RSA_SecurID/RSA_SecurID_getpasswd.c: Correctly + identify the command numbers in the error messages + +2011-01-20 Ludovic Rousseau + + * [r5542] src/openct/proto-t1.c: t1_xcv(): remove useless + affectation + + openct/proto-t1.c:675:3: warning: Value stored to 'rmax' is never + read rmax = rmax_int; ^ ~~~~~~~~ + * [r5541] src/commands.c: SecurePINVerify() & SecurePINModify(): + ignore the returned value of t1_build() + + commands.c:416:3: warning: Value stored to 'ret' is never read + ret = t1_build(&((get_ccid_slot(reader_index))->t1), ^ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ commands.c:653:3: + warning: Value stored to 'ret' is never read ret = + t1_build(&((get_ccid_slot(reader_index))->t1), ^ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * [r5540] src/commands.c: T0ProcSW1(): remove useless affectations + + commands.c:1818:2: warning: Value stored to 'in_buf' is never + read in_buf++; ^~~~~~~~ commands.c:1817:2: warning: Value stored + to 'rcv_buf' is never read rcv_buf++; ^~~~~~~~~ + +2011-01-19 Ludovic Rousseau + + * [r5527] readers/iDream.txt: update + +2011-01-18 Ludovic Rousseau + + * [r5516] src/openct/proto-t1.c: Add an explicit cast to avoid a + compiler warning + + openct/proto-t1.c:775:10: warning: comparison of integers of + different signs: 'int' and 'unsigned int' [-Wsign-compare] || (n + != 4 + t1->rc_bytes) ... ~ ^ ~~~~~~~~~~~~~~~~ + * [r5515] src/ifdhandler.c: Add an explicit cast to avoid a + compiler warning + + ifdhandler.c:410:16: warning: comparison of integers of different + signs: 'unsigned long' and 'int' [-Wsign-compare] if (*Length >= + CcidSlots[reader_index].nATRLength) ~~~~~~~ ^ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * [r5514] src/commands.c: Add an explicit cast to avoid a compiler + warning + + commands.c:169:16: warning: comparison of integers of different + signs: 'unsigned int' and 'int' [-Wsign-compare] if (*nlength > + r-1) ~~~~~~~~ ^ ~~~ + * [r5513] src/commands.c: Do not redefine macro offsetof() if + already defined + + Thanks to clang(1) compiler commands.c:51:9: warning: 'offsetof' + macro redefined [-pedantic] #define offsetof(TYPE, MEMBER) + ((size_t) &((TYPE *)0)->MEMBER) ^ In file included from + commands.c:25: In file included from /usr/include/string.h:33: + /usr/lib/clang/1.1/include/stddef.h:41:9: note: previous + definition is here #define offsetof(t, d) __builtin_offsetof(t, + d) ^ + +2011-01-13 Ludovic Rousseau + + * [r5499] src/ifdhandler.c: T1_card_timeout(): This is the + card/reader timeout. Add 1 second for the libusb timeout so we + get the error from the reader. + +2011-01-07 Ludovic Rousseau + + * [r5495] src/ifdhandler.c: IFDHGetCapabilities(): multi slot + readers does not (yet) support + TAG_IFD_POLLING_THREAD_WITH_TIMEOUT + + The polling function will return for a event in any slot not just + the slot we are interested in. And the event will be lost for the + real slot. + * [r5494] src/ccid_usb.c: CloseUSB(): free the serial number string + only for the last slot since they all point to the same string. + +2011-01-05 Ludovic Rousseau + + * [r5488] readers/Vasco_DP200.txt, readers/Vasco_DP860.txt, + readers/supported_readers.txt: Add Vasco DIGIPASS KEY 860 and + Vasco DIGIPASS KEY 200 + +2011-01-04 Ludovic Rousseau + + * [r5477] readers/supported_readers.txt: Sort devices by Product ID + * [r5476] readers/supported_readers.txt: Reenable O2 Micro and + Blutronics "bogus" readers + * [r5475] src/ccid.h: Reenable O2MICRO_OZ776_PATCH since a new + patch is now included in revision 5473 + * [r5474] src/parse.c: Use get_ccid_device_descriptor() instead of + using usb_interface_descriptor->extra directly to support "bogus" + readers + * [r5473] src/ccid_usb.c, src/ccid_usb.h: Add and use + get_ccid_device_descriptor() to get the CCID descriptor including + a fix for bogus readers (Oz776, Reiner SCT and bludrive II) + + Thanks to Diego Elio Pettenò and Dario Leone for the patch + * [r5472] src/parse.c: Define log level to maximum to get error + messages from ccid_usb.c + * [r5471] src/parse.c: Rename variable usb_interface to + usb_interface_descriptor to better match the libusb type + * [r5470] src/parse.c: Rename variable extra to device_descriptor + * [r5465] src/.dependencies: Remove useless file + +2011-01-03 Ludovic Rousseau + + * [r5463] readers/Neowave_Weneo3.txt, + readers/supported_readers.txt: Add a new Neowave Weneo token + + Closes Debian bug #570167 "libccid: New Neowave Weneo card + version with new productId" + +2010-12-21 Ludovic Rousseau + + * [r5461] readers/Oberthur-ID-ONE_token_slim_v2.txt, + readers/supported_readers.txt: Add Oberthur ID-ONE TOKEN SLIM v2 + +2010-12-17 Ludovic Rousseau + + * [r5458] src/ccid_usb.c: OpenUSBByName(): return STATUS_COMM_ERROR + instead of STATUS_NO_SUCH_DEVICE if the cause of the failure is + libusb_claim_interface(). The main cause if the use of OpenCT. + + The OpenCT detection code in pcsc-lite is not triggered if the + driver returns STATUS_NO_SUCH_DEVICE. So the driver must return + someting else in that case. + +2010-12-16 Ludovic Rousseau + + * [r5457] readers/GemPCPinpadv2.txt: new firmware + * [r5455] readers/ACS_APG8201.txt, readers/supported_readers.txt: + Add ACS APG8201 PINhandy 1 + +2010-12-15 Ludovic Rousseau + + * [r5451] readers/Eutron_SIM_Pocket_Combo_(Card_Reader).txt, + readers/Eutron_SIM_Pocket_Combo_(SIM_Reader).txt: regenerate + * [r5450] readers/Eutron_SIM_Pocket_Combo_(Card_Reader).txt, + readers/Eutron_SIM_Pocket_Combo_(SIM_Reader).txt, + readers/SIM_Pocket_Combo.txt: Rename and split + SIM_Pocket_Combo.txt in Eutron_SIM_Pocket_Combo_(Card_Reader).txt + and Eutron_SIM_Pocket_Combo_(SIM_Reader).txt + + The device contains a hub with 3 devices: 2 CCID card readers and + a USB Mass storage + +2010-12-12 Ludovic Rousseau + + * [r5445] readers/supported_readers.txt: Add Feitian SCR310 + * [r5444] readers/Feitian_SCR310.txt: Feitian SCR310 reader (also + labeled Rokey 301) + +2010-12-10 Ludovic Rousseau + + * [r5437] src/ccid_usb.c: OpenUSBByName(): use the correct type to + fix compiler warning + + ccid_usb.c: In function `OpenUSBByName': ccid_usb.c:294: warning: + comparison between signed and unsigned integer expressions + * [r5436] readers/Todos_Connectable.txt: Todos Connectable reader + +2010-12-03 Ludovic Rousseau + + * [r5430] README, configure.in: release 1.4.1 + +2010-12-01 Ludovic Rousseau + + * [r5425] readers/Fsij_gnuk.txt, readers/supported_readers.txt: Add + Free Software Initiative of Japan Gnuk token + +2010-11-20 Ludovic Rousseau + + * [r5409] readers/SpringCard_CSB6_Ultimate.txt: new firmware + +2010-11-17 Ludovic Rousseau + + * [r5404] readers/Xiring_Leov2.txt: Add Xiring Leo v2 + * [r5403] src/parse.c: define DISPLAY_EXTRA_VALUES to display the + extra (invalid) values returned by bNumClockSupported and + bNumDataRatesSupported + +2010-11-12 Ludovic Rousseau + + * [r5397] readers/Athena_IDProtect_Key.txt, + readers/supported_readers.txt, src/ccid_usb.c: Athena IDProtect + Key v1 was bogus. The v2 should work. + * [r5396] readers/CardMan6121.txt: Regenerate + +2010-11-08 Ludovic Rousseau + + * [r5389] src/ifdhandler.c: IFDHCreateChannelByName(): increase the + timeout from 100ms to 1000ms to give more time to the reader to + setup and answer. + + 100ms is too short for the Kobil KAAN Base for example. + +2010-11-05 Ludovic Rousseau + + * [r5382] src/ccid_serial.c: ReadSerial(): further improve check + from revision 5381 + * [r5381] src/ccid_serial.c: ReadSerial(): avoids a possible + integer overflow if the CCID frame is corrupted or malign. + + Thanks to Rafael Dominguez Vega for the bug report + +2010-10-27 Ludovic Rousseau + + * [r5365] readers/BZH_uKeyCI800-K1.txt, + readers/supported_readers.txt: Add BZH uKeyCI800-K18 + +2010-10-26 Ludovic Rousseau + + * [r5363] readers/supported_readers.txt: Normalize the Vid and Pid + hex values + * [r5361] readers/SCR3310_2.txt, readers/supported_readers.txt: Add + a new model of SCM SCR 3310 + * [r5360] readers/Akasa_AK-CR-03.txt: Add Akasa AK-CR-03 reader + +2010-10-21 Ludovic Rousseau + + * [r5330] src/ifdhandler.c: Use TAG_IFD_POLLING_THREAD_WITH_TIMEOUT + instead of TAG_IFD_POLLING_THREAD to support the auto power off + feature introduced in pcsc-lite revision 5328 + * [r5329] src/ifdhandler.c: Remove two useless static function + declarations + +2010-10-19 Ludovic Rousseau + + * [r5325] src/ifdhandler.c: get_IFSC(): 0xFF is not a valid value + for IFSC according to ISO 7816-3, CCID and MasterCard standards. + The maximum value is 0xFE. + + The "TIVU SAT" from ITALY www.tivu.tv card has such an IFSC in + its ATR: 3F FF 95 00 FF 91 81 71 FF 47 00 54 49 47 45 52 30 30 33 + 20 52 65 76 32 35 30 64 + +2010-10-14 Ludovic Rousseau + + * [r5320] src/Makefile.am: src/pcscd_ccid.rules has been renamed to + src/92_pcscd_ccid.rules in revision 5263. So update the name in + INSTALL_UDEV_RULE_FILE + * [r5319] src/Makefile.am: Use /bin/echo instead of the echo shell + version to use color escape codes + + Thanks to Martin Paljak for the patch + * [r5318] configure.in, src/Info.plist.src, src/Makefile.am, + src/create_Info_plist.pl: Remove --enable-udev option since it is + not used anymore with libhal. The udev rules file is now used to + change the access rights of the device and not send a hotplug + signal to pcscd. + +2010-10-13 Ludovic Rousseau + + * [r5312] configure.in: Need pcsc-lite 1.6.5 for + TAG_IFD_POLLING_THREAD_WITH_TIMEOUT + * [r5311] src/Makefile.am: pcscd_ccid.rules is renamed + 92_pcscd_ccid.rules in revision 5263 + * [r5310] Makefile.am: MacOSX/reader.h.in is now replaced by + MacOSX/reader.h since pcsc-lite revision 5254 + * [r5309] configure.in: build: remove use_usb_interrupt variable + which is not set. + + Thanks to Martin Paljak for the patch + +2010-10-06 Ludovic Rousseau + + * [r5284] README: Update some paragraphs + * [r5282] README: Remove the "Known problems" section about Mac OS + X libusb since we know use libusb-1.0. The bug should/may have + been fixed. + +2010-09-20 Ludovic Rousseau + + * [r5263] src/92_pcscd_ccid.rules, src/pcscd_ccid.rules: Rename to + add the number in the file name. The file shall be _after_ + 91-permissions.rules on Debian. + + See http://permalink.gmane.org/gmane.linux.hotplug.devel/16139 + +2010-09-15 Ludovic Rousseau + + * [r5257] MacOSX/configure, MacOSX/reader.h, MacOSX/reader.h.in: No + need to convert reader.h.in in reader.h since revision 5252. + +2010-09-14 Ludovic Rousseau + + * [r5253] examples/scardcontrol.c: No need to use HOST_TO_CCID_16() + and HOST_TO_CCID_32() since revision 5252 + * [r5252] src/commands.c: SecurePINVerify() & SecurePINModify(): + Accept big and little endian byte orders for multibytes fields + + The application should not use HOST_TO_CCID_16() and + HOST_TO_CCID_32() any more and just use the normal byte order of + the architecture. + + Thanks to Douglas E. Engert for the patch + http://archives.neohapsis.com/archives/dev/muscle/2010-q3/0145.html + +2010-09-13 Ludovic Rousseau + + * [r5251] src/pcscd_ccid.rules: Use GROUP= instead of RUN+= to + avoid a race + + See the thread "Use GROUP= in a rule matching an interface of the + device?" on linux-hotplug@vger.kernel.org mailing list + http://www.spinics.net/lists/hotplug/msg04165.html + +2010-09-04 Ludovic Rousseau + + * [r5244] src/pcscd_ccid.rules: Add a ENV{DEVTYPE}!="usb_device" + rule as suggested by Marco d'Itri + +2010-09-03 Ludovic Rousseau + + * [r5237] readers/HP_kus-0133.txt, readers/supported_readers.txt: + HP kus-0133 is not supported + * [r5236] readers/supported_readers.txt: update URL to use ccid/ + * [r5229] readers/Precise_200_MC.txt: new firmware + +2010-09-02 Ludovic Rousseau + + * [r5223] src/pcscd_ccid.rules: Change the group ownership of the + device to "pcscd" when a reader is connected + * [r5222] src/pcscd_ccid.rules: Add $Id$ + * [r5221] src/pcscd_ccid.rules: Factorize teh SUBSYSTEMS=="usb" + test + +2010-08-31 Ludovic Rousseau + + * [r5207] readers/ReinerSCT_cyberJack_RFID_basis.txt, + readers/supported_readers.txt: Add ReinerSCT cyberJack RFID basis + * [r5206] src/ifdhandler.c: ifdhandler.c: In function + ‘IFDHPolling’: ifdhandler.c:328: warning: unused variable ‘ret’ + * [r5205] src/ccid_usb.c, src/ifdhandler.c: Convert the return + value from libusb code to IFD_* in InterruptRead() instead of + IFDHPolling(). + + We do not return IFD_NO_SUCH_DEVICE any more. This value will be + returned by the next libusb_*() call + +2010-08-26 Ludovic Rousseau + + * [r5189] readers/supported_readers.txt: Remove O2 Micro Oz776 and + Blutronics Bludrive II CCID since they are no more supported + since version 1.4.0 + + The USB descriptor is bogus and the patch in + get_ccid_usb_interface() does not work with libusb-1.0 + * [r5188] src/ifdhandler.c: IFDHSetCapabilities(): remove dead + comments + * [r5187] configure.in: Add --enable-embedded (default is no) to + build libccid for an embedded system. + + This will activate the NO_LOG option to disable logging and limit + RAM and disk consumption. + * [r5185] src/ccid_serial.c, src/ccid_usb.c, src/commands.c, + src/ifdhandler.c, src/utils.c: Include config.h before any other + local includes to the configuration defined in config.h is used. + + This is just a preventive change. + +2010-08-24 Ludovic Rousseau + + * [r5182] src/ccid.c: ccid_open_hack_pre(): call InterruptRead() + only if the device has an interrupt pipe endpoint (3 in total) + * [r5181] readers/supported_readers.txt: add Gemalto SG CCID + +2010-08-23 Ludovic Rousseau + + * [r5176] src/ccid.c: ccid_open_hack_pre(): use InterruptRead() + with a timeout of 100ms instead of 10ms to give more time to the + device to respond. + + This allows the Gemalto SG CCID to always start correctly, not + just once in a while. + * [r5174] src/ccid.c: ccid_open_hack_pre(): Do not disable the call + to InterruptRead() on Mac OS X. We now use libusb-1.0 and the + timeout should work. + + This allows the Gemalto SG CCID to work under Mac OS X. + * [r5173] readers/Gemalto_SG.txt, readers/supported_readers.txt: + Add Gemalto Smart Guardian (SG CCID) + * [r5172] readers/supported_readers.txt: Rename Gemalto Smart + Enterprise Guardian + +2010-08-19 Ludovic Rousseau + + * [r5166] MacOSX/configure: Use the full include path for libusb.h + * [r5165] src/Makefile.am, src/ccid_usb.c, src/ifdhandler.c, + src/simclist.c, src/simclist.h: Use the new Info.plist parser API + * [r5164] src/ccid_serial.c: OpenSerialByName(): + TOKEN_MAX_VALUE_SIZE is no more defined in parser.h + + Use MAX_DEVICENAME defined as 255 in pcscd.h + +2010-08-17 Ludovic Rousseau + + * [r5153] contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c, + src/ccid_usb.c, src/ccid_usb.h: Do not hardcode the libusb-1.0 + include header path (remove the libusb-1.0/ part) + +2010-08-05 Ludovic Rousseau + + * [r5119] configure.in: Do not hardcode the libusb.h path. The h + file is not at the same place on kfreebsd + + Fixes Debian bug #591782 + +2010-08-04 Ludovic Rousseau + + * [r5108] README, configure.in: release 1.4.0 + +2010-08-02 Ludovic Rousseau + + * [r5094] readers/supported_readers.txt: Add support of the SCM SDI + 010 again. At least the contact interface can be used. + + This should not conflict with the SCM proprietary driver since + the CCID driver will only work with pcsc-lite > 1.6.2 and recent + pcsc-lite (>= 1.5.4) will load any specific driver before my + "Class" CCID driver. + +2010-08-01 Ludovic Rousseau + + * [r5090] src/Makefile.am: Install the serial configuration find in + /etc/reader.conf.d/libccidtwin instead of /etc/reader.conf. pcscd + (>= 1.6.0) will parse all the files from /etc/reader.conf.d/ + * [r5087] readers/supported_readers.txt: Add SCM SCL01x Contactless + Reader (disabled since unsupported) + * [r5086] readers/supported_readers.txt: Add Gemalto Hybrid + Smartcard Reader + * [r5084] readers/Tianyu_Smart_Card_Reader.txt, + readers/supported_readers.txt: Add Tianyu Smart Card Reader + * [r5083] src/ccid.c, src/commands.c: Do not #include "ccid_usb.h" + Compilation fails on Mac OS X for the libccidtwin library + +2010-07-29 Ludovic Rousseau + + * [r5078] src/ifdhandler.c: add get_IFSC() to get the IFSC value + from the ATR. + + IFSC is not just the value of TAi (i>2) For example "3B 80 81 1F + 07 19" has a TA3 but it is not the IFSC since T=15 is defined in + TD2 so before TA3 + * [r5077] src/ccid_usb.c: libusb <= 1.0.8 does not implement a + reference counter in libusb_init()/libusb_exit() for the default + context. + + We then use our own and unique libusb context. + +2010-07-27 Ludovic Rousseau + + * [r5076] src/parse.c: check the return value of + libusb_get_active_config_descriptor() + * [r5075] src/Makefile.am, src/parse.c: parse do need some parts of + libccid + * [r5074] src/Makefile.am: parse do not need to be linked with + libccid + +2010-07-26 Ludovic Rousseau + + * [r5072] src/ccid.c: ccid_open_hack_post(): update the Gemalto + proprietary command to switch in EMV mode. 0xA0 was an old value + no more used on new products. + +2010-07-02 Ludovic Rousseau + + * [r5055] MacOSX/configure: No need to respecify -arch in LDFLAGS + since we already have the correct architectures specified in + CFLAGS + * [r5054] MacOSX/configure: Fix a comment: we do not use + libusb-compat-0.1 any more + +2010-07-01 Ludovic Rousseau + + * [r5052] src/parse.c: ccid_parse_interface_descriptor(): document + "USB Wake up signaling supported on card insertion and removal" + in dwFeatures + +2010-06-30 Ludovic Rousseau + + * [r5050] readers/Broadcom_5880v3.txt, + readers/supported_readers.txt: Add a new Broadcom 5880 reader + (idProduct: 0x5802) + +2010-06-29 Ludovic Rousseau + + * [r5043] src/ccid_usb.c: OpenUSBByName(): use DEBUG_CRITICAL() + instead of printf() to log an error + +2010-06-22 Ludovic Rousseau + + * [r5034] src/ccid_usb.c: WriteUSB() & ReadUSB(): also display the + value returned by libusb. The error is not always reported by the + kernel so errno is not significant. + * [r5033] src/debug.h: Add DEBUG_CRITICAL5() function + * [r5030] configure.in: Request pcsc-lite 1.6.2 minimum (instead of + 1.6.0) to have TAG_IFD_STOP_POLLING_THREAD defined + * [r5028] src/ccid_usb.c, src/ccid_usb.h, src/ifdhandler.c: Add + support of TAG_IFD_STOP_POLLING_THREAD and use of the + asynchronous libusb API to be able to stop a transfer. + + We are now "polling" for card movements every 1 hour or once an + event is detected on the interrupt endpoint of the device. + + Another gain is that the driver will terminate "instantly" after + pcscd request instead of after a maximum of 2 seconds (previous + polling timeout). + * [r5027] src/ccid_usb.c: Use ctx instead of NULL to keep the + information that this parameter is the libusb context. + * [r5026] src/ccid_usb.c: OpenUSBByName(): call libusb_exit() if we + can't use the reader + + CloseUSB(): call libusb_exit() before exiting + +2010-06-21 Ludovic Rousseau + + * [r5025] src/ccid_usb.c: OpenUSBByName(): free the libusb + allocated list & devices when we are done with it + * [r5024] src/ccid_usb.c: OpenUSBByName(): call libusb_init() just + before the next libusb call + * [r5019] readers/ACS_AET65.txt: add ACS AET65 (same idProduct as + many other ACS devices) + +2010-06-19 Ludovic Rousseau + + * [r5017] readers/LTC36.txt, readers/supported_readers.txt: add + C3PO LTC36 + +2010-06-18 Ludovic Rousseau + + * [r5016] MacOSX/configure: Only link with libusb-1.0.a without the + 0.1 compatibility layer now the library has been ported to + libusb-1.0 API + * [r5015] contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c: + use libusb_detach_kernel_driver() from libusb-1.0 instead of the + *_np() version + +2010-06-17 Ludovic Rousseau + + * [r5014] src/ccid.c, src/ifdhandler.c: use PROTOCOL_CCID instead + of 0 when checking bInterfaceProtocol + * [r5013] src/ccid.c, src/ccid.h, src/commands.c, src/ifdhandler.c: + Rename ICCD_A in PROTOCOL_ICCD_A, ICCD_B in PROTOCOL_ICCD_B and + add PROTOCOL_CCID for plain CCID + * [r5012] src/ccid_usb.c: get_end_points(): use + LIBUSB_ENDPOINT_DIR_MASK instead of LIBUSB_TRANSFER_TYPE_MASK to + get the direction of an endpoint. + + .bulk_out field were never set and then not working (No such file + or directory) + * [r5011] src/ccid_usb.c: WriteUSB() & ReadUSB(): the same function + libusb_bulk_transfer() is now ued to read and write to a USB + device. So I use "write failed" and "read failed" instead of the + libusb function name to log an error. + * [r5010] src/ccid_usb.c: WriteUSB(), ReadUSB() & InterruptRead(): + display strerror(errno) instead of just the code returned by the + libusb_*_transfer() function + +2010-06-16 Ludovic Rousseau + + * [r5007] readers/Todos_Cx00.txt, readers/supported_readers.txt: + add Todos CX00 + * [r5002] readers/Dectel_CI692.txt, readers/supported_readers.txt: + add Dectel CI692 + * [r5001] readers/Kingtrust_Multi-Reader.txt, + readers/supported_readers.txt: add Kingtrust Multi-Reader + * [r4999] SCARDGETATTRIB.txt: replace tabs by spaces + * [r4998] SCARDGETATTRIB.txt: add SCARD_ATTR_ICC_INTERFACE_STATUS, + SCARD_ATTR_ICC_PRESENCE and SCARD_ATTR_VENDOR_IFD_SERIAL_NO + * [r4997] SCARDCONTOL.txt: add IOCTL_FEATURE_GET_TLV_PROPERTIES + +2010-06-14 Ludovic Rousseau + + * [r4993] src/ccid_usb.c: use libusb-1.0/libusb.h instead of usb.h + (from libusb-0.1) + +2010-06-10 Ludovic Rousseau + + * [r4988] src/ccid.h: The O2MICRO OZ776 patch (for OZ776, + OZ776_7772, REINER_SCT and BLUDRIVEII_CCID) is no more supported + with libusb-1.0 + * [r4987] configure.in, + contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c, + src/ccid_usb.c, src/ccid_usb.h, src/ifdhandler.c, src/parse.c: + Use libusb-1.0 instead of libusb-0.1 + +2010-06-04 Ludovic Rousseau + + * [r4979] README, configure.in: release 1.3.13 + +2010-06-01 Ludovic Rousseau + + * [r4975] readers/GemPCTwin.txt: update + * [r4973] src/ccid.c, src/ccid.h, src/ccid_ifdhandler.h, + src/ccid_serial.c, src/ccid_serial.h, src/ccid_usb.c, + src/ccid_usb.h, src/commands.h, src/convert_version.pl, + src/create_Info_plist.pl, src/debug.c, src/debug.h, src/defs.h, + src/ifdhandler.c, src/parse.c, src/utils.c, src/utils.h: update + copyright date + * [r4972] src/parse.c: No need to #include since revision + 4907 + * [r4971] configure.in: remove duplicate errno.h in + AC_CHECK_HEADERS() + * [r4970] configure.in, m4/as-ac-expand.m4: Correctly display + $bindir and $sysconfdir values when they are not changed from the + default values (instead of NONE/bin and NONE/etc) + +2010-05-27 Ludovic Rousseau + + * [r4965] readers/Lenovo.txt: update + * [r4963] src/ccid_usb.c: OpenUSBByName(): allow the combination of + USE_COMPOSITE_AS_MULTISLOT and libhal. It does work so do not + prevent its use. + +2010-05-20 Ludovic Rousseau + + * [r4956] src/ccid.h, src/ccid_serial.c, src/ccid_usb.c, + src/ifdhandler.c: Add support of SCARD_ATTR_VENDOR_IFD_SERIAL_NO + +2010-05-15 Ludovic Rousseau + + * [r4943] readers/GemPCPinpadv2.txt: Gemalto PC pinpad v1+ + +2010-05-10 Ludovic Rousseau + + * [r4939] src/commands.c: Revert revision 4936 (stupid me) + * [r4938] src/ifdhandler.c: IFDHCreateChannelByName() & + IFDHCreateChannel(): use the low level CmdGetSlotStatus() instead + of IFDHICCPresence() to be able to fix the read timeout. + + We use a read timeout of 100 milliseconds instead of 2 secondes. + The maximum wait time is now 200 milliseconds instead of 4 + seconds. + + This increases the startup time a lot (up to 95%) when pcscd is + auto started. + * [r4937] src/ccid.c, src/ccid.h, src/ccid_serial.c, + src/ccid_usb.c, src/commands.c, src/defs.h, src/ifdhandler.c: + change read timeout from second to millisecond unit to have a + sub-second control + * [r4936] src/commands.c: SecurePINVerify() & SecurePINModify(): + use min() instead of max() to get a minimum of 30 seconds for the + read timeout + +2010-05-08 Ludovic Rousseau + + * [r4932] configure.in: Minimum version of pcsc-lite is 1.6.0 + instead of the unreleased 1.5.6 + * [r4931] README, configure.in: release 1.3.12 + +2010-05-07 Ludovic Rousseau + + * [r4930] MacOSX/configure: - use libusb-1.0 and libusb-compat-0.1 + - build for Snow Leopard + * [r4928] src/ifdhandler.c: IFDHControl(): set + PCSCv2_PART10_PROPERTY_bEntryValidationCondition specific value + only for the Gemalto PC Pinpad V1 & Covadis Véga-Alpha readers. + * [r4927] examples/scardcontrol.c: Reformat output + * [r4926] src/ifdhandler.c: IFDHControl(): The Covadis Véga-Alpha + share the same firmware with the Gemalto PC Pinpad V1 + * [r4925] src/ifdhandler.c: IFDHControl(): add comments + * [r4924] src/ifdhandler.c: IFDHControl(): add support of + IOCTL_FEATURE_GET_TLV_PROPERTIES bMinPINSize & bMaxPINSize for + Gemalto Pinpad V1 + +2010-05-03 Ludovic Rousseau + + * [r4914] readers/SCR3500.txt: add SCM SCR3500 (same idProduct as + SCR355 but different firmware) + +2010-05-02 Ludovic Rousseau + + * [r4908] readers/Athena_IDProtect_Key.txt, + readers/supported_readers.txt: add Athena IDProtect Key + (unsupported see + http://www.opensc-project.org/pipermail/opensc-user/2010-May/004023.html) + +2010-05-01 Ludovic Rousseau + + * [r4907] src/ccid_usb.h: Do not try to be smart and always + #include + + Should fix FreeBSD issues + +2010-04-29 Ludovic Rousseau + + * [r4902] src/commands.c: SecurePINVerify() & SecurePINModify(): + with a TPDU reader and a T=1 card the ns & nr sequence numbers + were not correctly handled if the CCID command was rejected at + the reader level (not sent to the card). The next APDU sent to + the card would fail. + +2010-04-25 Ludovic Rousseau + + * [r4897] src/ifdhandler.c: IFDHControl(): reuse ccid_descriptor + variable when available + * [r4896] src/ccid.h, src/ifdhandler.c: FEATURE_MCT_READER_DIRECT + is also supported by the Kobil mIDentity visual + +2010-04-24 Ludovic Rousseau + + * [r4893] readers/Kobil_Smart_Token.txt, + readers/Kobil_mIDentity_4smart.txt, + readers/Kobil_mIDentity_4smart_AES.txt, + readers/Kobil_mIDentity_fullsize.txt, + readers/Kobil_mIDentity_fullsize_AES.txt, + readers/Kobil_mIDentity_visual.txt, + readers/supported_readers.txt: add KOBIL Smart Token, KOBIL + mIDentity 4smart, KOBIL mIDentity 4smart AES, KOBIL mIDentity + visual, KOBIL mIDentity fullsize, KOBIL mIDentity 4smart fullsize + AES + +2010-04-18 Ludovic Rousseau + + * [r4886] src/commands.c: CmdXfrBlockCHAR_T0(): debug ICCD type A + algorithm + + Thanks to Alexander Abarzhi for the patch + +2010-04-16 Ludovic Rousseau + + * [r4879] src/ifdhandler.c: Fix Studio CC warning "ifdhandler.c", + line 1275: warning: initializer does not fit or is out of range: + 248 + * [r4878] src/ifdhandler.c: Fix Sun Studio CC warnings + "ifdhandler.c", line 910: warning: initializer does not fit or is + out of range: 250 "ifdhandler.c", line 910: warning: initializer + does not fit or is out of range: 255 "ifdhandler.c", line 910: + warning: initializer does not fit or is out of range: 129 + "ifdhandler.c", line 911: warning: initializer does not fit or is + out of range: 128 "ifdhandler.c", line 911: warning: initializer + does not fit or is out of range: 193 "ifdhandler.c", line 911: + warning: initializer does not fit or is out of range: 192 + "ifdhandler.c", line 912: warning: initializer does not fit or is + out of range: 144 "ifdhandler.c", line 912: warning: initializer + does not fit or is out of range: 177 + * [r4876] readers/SCL01x.txt: SCM SCL01x Contactless Reader + +2010-04-09 Ludovic Rousseau + + * [r4869] readers/ATMEL_AT90SCR050.txt, + readers/ATMEL_AT90SCR100.txt, readers/ATMEL_VaultIC420.txt, + readers/ATMEL_VaultIC440.txt, readers/ATMEL_VaultIC460.txt, + readers/supported_readers.txt: Add Atmel AT90SCR100, Atmel + AT90SCR050, Atmel VaultIC420, Atmel VaultIC440, Atmel VaultIC460 + +2010-04-06 Ludovic Rousseau + + * [r4856] readers/supported_readers.txt: Remove duplicate Vid/Pid + entry for Alcor Micro SCR001 and Micro AU9520 + * [r4854] readers/Vasco_DP855.txt, readers/Vasco_DP865.txt, + readers/Vasco_DPKey200.txt, readers/Vasco_DPKey860.txt, + readers/supported_readers.txt: Add Vasco DIGIPASS KEY 860, Vasco + DIGIPASS KEY 200, Vasco DP855, Vasco DP865 + +2010-03-31 Ludovic Rousseau + + * [r4849] readers/GoldKey_PIV_Token.txt, + readers/supported_readers.txt: add GoldKey PIV Token + +2010-03-30 Ludovic Rousseau + + * [r4847] src/ccid_ifdhandler.h, src/ifdhandler.c: add support of + FEATURE_GET_TLV_PROPERTIES + * [r4846] examples/scardcontrol.c: add support of + FEATURE_GET_TLV_PROPERTIES + +2010-03-27 Ludovic Rousseau + + * [r4844] src/Info.plist.src, src/commands.c, src/ifdhandler.c: + remove spaces and tabs at end of line + +2010-03-14 Ludovic Rousseau + + * [r4815] readers/supported_readers.txt: Enable the Broadcom 5880 + reader. It should work after a firmware upgrade. + +2010-03-12 Ludovic Rousseau + + * [r4814] INSTALL, examples/scardcontrol.c, + readers/supported_readers.txt, src/ccid_serial.c, + src/reader.conf.in: Rename Gemplus in Gemalto + +2010-03-05 Ludovic Rousseau + + * [r4796] src/commands.c: CmdXfrBlockCHAR_T0(): limit the received + length to 0x1000 for ICCD Version A length is 16-bits and + usb_control_msg() fails with "Invalid argument" if the length is + > 0x100 + + The same patch was already present in CmdXfrBlockAPDU_extended + for ICCD Version B + + Thanks to Alexander Abarzhi for the patch + * [r4795] src/commands.c: CCID_Receive(): set the received length + for a ICCD Version A device + + Thanks to El Tuba for the patch + +2010-02-26 Ludovic Rousseau + + * [r4780] readers/supported_readers.txt: SCM SDI 010 removed on + manufacturer request since not supported by my driver + +2010-02-24 Ludovic Rousseau + + * [r4776] readers/supported_readers.txt: Removed Smart SBV280 on + manufacturer request. They use libusb directly. + * [r4775] readers/Broadcom_5880.txt: regenerate + +2010-02-23 Ludovic Rousseau + + * [r4771] readers/Covadis_Auriga.txt, + readers/supported_readers.txt: add Covadis Auriga + +2010-02-12 Ludovic Rousseau + + * [r4761] readers/id3_CL1356D.txt, readers/supported_readers.txt: + id3_CL1356D.txt is a duplicate of id3_CL1356T5.txt + * [r4759] readers/id3_CL1356T5.txt, readers/supported_readers.txt: + add id3 CL1356T5 + * [r4757] readers/Gemalto_PDT.txt, readers/supported_readers.txt: + update Gemalto PDT + +2010-02-09 Ludovic Rousseau + + * [r4750] src/ccid_usb.c: Fix 1 compiler warning + + ccid_usb.c: In function ‘InterruptRead’: ccid_usb.c:987: warning: + pointer targets in passing argument 3 of ‘log_xxd’ differ in + signedness /usr/include/PCSC/debuglog.h:83: note: expected ‘const + unsigned char *’ but argument is of type ‘char *’ + * [r4749] src/commands.c: Fix 2 compiler warnings + + commands.c: In function ‘CCID_Transmit’: commands.c:1107: + warning: passing argument 5 of ‘ControlUSB’ discards qualifiers + from pointer target type ccid_usb.h:43: note: expected ‘unsigned + char *’ but argument is of type ‘const unsigned char *’ + commands.c:1130: warning: passing argument 5 of ‘ControlUSB’ + discards qualifiers from pointer target type ccid_usb.h:43: note: + expected ‘unsigned char *’ but argument is of type ‘const + unsigned char *’ + * [r4748] src/ccid_usb.c: Fix a compiler warning + + ccid_usb.c: In function ‘OpenUSB’: ccid_usb.c:138: warning: + unused parameter ‘Channel’ + * [r4747] readers/Makefile.am: Do not include the reader + descriptions in the archive, only the supported_readers.txt file + * [r4746] Makefile.am, configure.in: use readers/ again (revert + revision 4745) + * [r4745] Makefile.am, configure.in: Do not include the readers/* + files in the archive + +2010-02-05 Ludovic Rousseau + + * [r4712] readers/CL1356T.txt, readers/id3_CL1356T.txt: rename + CL1356T.txt in id3_CL1356T.txt like the other id3_* readers + +2010-02-04 Ludovic Rousseau + + * [r4709] src/commands.c: add Copyright (C) 2005 Martin Paljak and + update my copyright date + +2010-01-29 Ludovic Rousseau + + * [r4694] readers/GPFCryptoStick.txt, + readers/supported_readers.txt: add German Privacy Foundation + Crypto Stick v1.2 + +2010-01-22 Ludovic Rousseau + + * [r4684] configure.in: use LT_INIT(disable-static) instead of the + deprecated AM_DISABLE_STATIC + +2010-01-21 Ludovic Rousseau + + * [r4680] configure.in: Static lib is disabled by default. Use + --enable-static if needed + +2010-01-19 Ludovic Rousseau + + * [r4676] readers/GemPC_Express.txt: update + +2010-01-13 Ludovic Rousseau + + * [r4665] readers/Ask_CPL108.txt, readers/supported_readers.txt: + ass Ask CPL108 + +2010-01-11 Ludovic Rousseau + + * [r4655] readers/supported_readers.txt: update Gemalto Prox-DU and + Prox-SU names + * [r4654] readers/supported_readers.txt: update "Gemalto Prox DU" + name + +2010-01-04 Ludovic Rousseau + + * [r4639] src/debug.c: debug.c: In function ‘log_msg’: debug.c:38: + warning: unused parameter ‘priority’ debug.c: In function + ‘log_xxd’: debug.c:51: warning: unused parameter ‘priority’ + * [r4638] src/ifdhandler.c: ifdhandler.c: In function + ‘IFDHSetCapabilities’: ifdhandler.c:553: warning: unused + parameter ‘Length’ ifdhandler.c:553: warning: unused parameter + ‘Value’ ifdhandler.c: In function ‘IFDHTransmitToICC’: + ifdhandler.c:1171: warning: unused parameter ‘RecvPci’ + * [r4637] contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c: + Kobil_mIDentity_switch.c: In function ‘main’: + Kobil_mIDentity_switch.c:136: warning: unused parameter ‘argc’ + Kobil_mIDentity_switch.c:136: warning: unused parameter ‘argv’ + * [r4636] src/openct/proto-t1.c: t1_release(): fix compilation + warning openct/proto-t1.c:116: warning: unused parameter ‘t1’ + +2010-01-02 Ludovic Rousseau + + * [r4631] readers/Broadcom_5880v2.txt, + readers/supported_readers.txt: another Broadcom 5880 reader + (iProduct: 5880) which looks like to work correctly + +2009-12-16 Ludovic Rousseau + + * [r4619] src/ccid_usb.c: Todos Argos Mini II with firmware before + 1.01 has a bogus CCID descriptor: "Automatic IFSD exchange as + first exchange (T=1)" is missing. You can't use a T=1 card with + this reader. + * [r4618] src/ccid_usb.c: Precise Biometrics Precise 250 MC with + firmware before 50.00 is bogus: time extension requests are not + sent back to the host + * [r4617] readers/Todos_AGM2_CCID.txt: firmware 1.01 + +2009-12-15 Ludovic Rousseau + + * [r4614] examples/scardcontrol.c, src/ccid_ifdhandler.h, + src/ifdhandler.c: rename FEATURE_MCT_READERDIRECT in + FEATURE_MCT_READER_DIRECT + +2009-12-13 Ludovic Rousseau + + * [r4610] src/ccid.c: ccid_open_hack_post(): get the language + selected during Mac OS X installation as language to use for + Covadis Véga-Alpha and Gemalto GemPC PinPad pinpad readers + +2009-12-09 Ludovic Rousseau + + * [r4597] readers/Precise_250_MC.txt: firmware update + * [r4594] src/parse.c: do not generate extra space at end of line + +2009-12-05 Ludovic Rousseau + + * [r4592] src/ccid_usb.c: Precise Biometrics Precise 200 MC with + firmware before 50.00 is bogus: time extension requests are not + sent back to the host + * [r4590] readers/supported_readers.txt: improve docmentation of + bogus readers + * [r4589] readers/supported_readers.txt: add OCS ID-One Cosmo Card + (with ProductID 0x6356) in a commented line (unsupported) + * [r4588] readers/Gemalto_HybridSmartcardReader.txt: Gemalto Hybrid + Smartcard Reader + +2009-12-02 Ludovic Rousseau + + * [r4584] readers/Precise_200_MC.txt: new firmware + +2009-11-18 Ludovic Rousseau + + * [r4556] readers/Oberthur-CosmoCard1.txt: other version of the OCS + ID-One Cosmo Card + +2009-11-17 Ludovic Rousseau + + * [r4550] src/ccid.c, src/ccid.h, src/commands.c: The Covadis + Véga-Alpha reader is a GemPC pinpad inside. So we use the same + code to: - load the strings for the display - avoid limitation of + the reader + + Thanks to Loïs Lherbier for the patch + +2009-11-13 Ludovic Rousseau + + * [r4545] src/commands.c: CmdGetSlotStatus(): the SCM SCR3310 also + reports an error 0xFE (ICC_MUTE) when no card is inserted. So + extend the special case to all readers and not just the O2MICRO + OZ776. + + Thanks to Ivan Vilata i Balaguer for the bug report (Debian bug + #555837) + +2009-10-28 Ludovic Rousseau + + * [r4521] src/ccid_serial.c: set_ccid_descriptor(): reset + dwSlotStatus to IFD_ICC_PRESENT for the other slots of a + multislot reader (like a GemCore SIM Pro). + + This is needed because the state of dwSlotStatus may have already + been changed to IFD_ICC_NOT_PRESENT (by the polling thread) when + the second slot is created. The polling thread of the second slot + would then never check for a card since this check is only done + once. Slots are SAMs and the card is always present or absent. + + The problem was already dealt with on USB from the beginning but + not on serial. + + Thanks to Emmanuel Deloget for the patch. + +2009-10-25 Ludovic Rousseau + + * [r4510] src/defs.h: change CMD_BUF_SIZE to support extended APDU + of up to 64kB. We need this size for readers in APDU mode to be + able to receive the card response in one block (chaining is not + always possible in this direction) + * [r4509] src/defs.h: remove useless #define + * [r4508] src/ifdhandler.c: FDHPowerICC(): use the exact length for + the PowerOn output buffer + * [r4507] src/defs.h: remove useless #defines + +2009-10-24 Ludovic Rousseau + + * [r4505] configure.in: check for IFD_ERROR_INSUFFICIENT_BUFFER in + ifdhandler.h and simplify the PCSC checking code + +2009-10-21 Ludovic Rousseau + + * [r4502] readers/Precise_250_MC.txt: new firmware + * [r4501] readers/Precise_200_MC.txt: new firmware + +2009-10-18 Ludovic Rousseau + + * [r4499] src/ifdhandler.c: FDHGetCapabilities(): add support of + SCARD_ATTR_ICC_PRESENCE + + Required to support the Windows middleware that's used for French + Healthcar cards. + + Thanks to David Markowitz for the patch. + * [r4498] src/ifdhandler.c: FDHGetCapabilities(): add support of + SCARD_ATTR_ICC_INTERFACE_STATUS + + Required to support the Windows middleware that's used for French + Healthcar cards. + + Thanks to David Markowitz for the patch. + +2009-10-14 Ludovic Rousseau + + * [r4493] readers/Smart_SBV280.txt, readers/supported_readers.txt: + add Smart SBV280 + +2009-10-08 Ludovic Rousseau + + * [r4450] src/ccid_ifdhandler.h, src/ifdhandler.c: IFDHControl(): + do not check if FEATURE_IFD_PIN_PROPERTIES is defined since we + now require pcsc-lite >= 1.5.6 (with FEATURE_IFD_PIN_PROPERTIES + defined) + * [r4449] src/ifdhandler.c: IFDHGetCapabilities() & IFDHControl(): + return IFD_ERROR_INSUFFICIENT_BUFFER when appropriate + * [r4448] configure.in, src/commands.c: Require to have pcsc-lite + >= 1.5.6 to have IFD_ERROR_INSUFFICIENT_BUFFER defined in + ifdhandler.h + * [r4446] src/ccid_usb.c: Use usb_strerror() instead of + strerror(errno) to also get the libusb specifc error messages + * [r4441] README: The supported, should work and unsupported lists + are now online only. + + The information in the README file was not up to date and hard to + sync. + +2009-10-02 Ludovic Rousseau + + * [r4417] src/ifdhandler.c: revert change in revision 4414. It is a + bug in the reader not the driver + * [r4416] ylwrap: update + * [r4414] src/ifdhandler.c: IFDHSetProtocolParameters(): with a T=1 + card, do not try to negociate IFSD if the reader works in APDU + mode + * [r4413] readers/Todos_AGM2_CCID.txt: update + +2009-10-01 Ludovic Rousseau + + * [r4411] src/ifdhandler.c: IFDHControl(): typo in comment + +2009-09-30 Ludovic Rousseau + + * [r4410] src/ifdhandler.c: IFDHControl(): PIN_PROPERTIES_STRUCTURE + structure do not have the wLcdMaxCharacters and wLcdMaxLines + fields anymore. Conform with Revision 2.02.06, April 2009 of + PCSCv2 part 10. + + Modified in pcsc-lite > 1.5.5 (revision 4378, 2009-09-08) + +2009-09-28 Ludovic Rousseau + + * [r4401] src/ccid_usb.c: OpenUSBByName(): make the libhal scheme + parsing more robust. Readers serial "numbers" may contain '_' + characters + +2009-09-25 Ludovic Rousseau + + * [r4397] src/ifdhandler.c: IFDHPowerICC(): remove a useless ; + +2009-09-22 Ludovic Rousseau + + * [r4392] readers/CherrySmartTerminalXX7X.txt, + readers/supported_readers.txt: add Cherry SmartTerminal XX7X + * [r4390] examples/GPL-2, examples/Makefile.am: sample code is + GPLv2+ + * [r4389] src/commands.c: SecurePINVerify(): circumvent a Dell + keyboard problem avoid the command rejection because the Enter + key is still pressed. Wait a bit (250ms) for the (Enter) key to + be released. + +2009-09-10 Ludovic Rousseau + + * [r4383] src/ccid.h, src/commands.c: circumvent bugs of the Dell + 413c:2100 keyboard + * [r4382] readers/DellSK-3106.txt: regenerate + * [r4380] src/Info.plist.src: typo in comment + +2009-08-30 Ludovic Rousseau + + * [r4372] readers/Todos_AGM2_CCID.txt, + readers/supported_readers.txt: add Todos AGM2 CCID + +2009-08-27 Ludovic Rousseau + + * [r4368] SCARDCONTOL.txt: List of SCardControl() commands + supported by the CCID driver + * [r4366] src/ifdhandler.c: IFDHControl(): return + IFD_ERROR_NOT_SUPPORTED instead of IFD_COMMUNICATION_ERROR if the + dwControlCode value is not supported + +2009-07-31 Ludovic Rousseau + + * [r4360] src/ccid.c: ccid_open_hack_pre(): do not call + InterruptRead() on Mac OS X. The libusb does not timeout and + blocks forever. + * [r4358] src/ifdhandler.c: IFDHControl(): the (proprietary) switch + interface escape command is allowed on the Gemalto GemProx DU + * [r4356] src/ifdhandler.c: IFDHControl(): the (proprietary) get + firmware version escape command is allowed with a Gemalto reader + * [r4355] src/ccid.h: add GET_VENDOR macro + 2009-07-28 Ludovic Rousseau * [r4347] README, configure.in: release 1.3.11 diff --git a/ccid/ccid/INSTALL b/ccid/ccid/INSTALL index 1f82ffb..a76de0f 100644 --- a/ccid/ccid/INSTALL +++ b/ccid/ccid/INSTALL @@ -90,7 +90,7 @@ configuring the driver for the serial reader You have to create or edit the file /etc/reader.conf. The file should contain something like: -# Gemplus reader with serial communication +# Gemalto reader with serial communication # - reader is the reader name. It is needed for multi-slot readers. # Possible reader values are: GemPCPinPad, GemCorePOSPro, GemCoreSIMPro, # GemPCTwin (default value) @@ -157,4 +157,4 @@ Test procedure: http://pcsclite.alioth.debian.org/ccid.html#CCID_compliant to know what to do. -$Id: INSTALL 3001 2008-06-14 16:15:11Z rousseau $ +$Id: INSTALL 4814 2010-03-12 15:42:07Z rousseau $ diff --git a/ccid/ccid/MacOSX/configure b/ccid/ccid/MacOSX/configure index 7ca0641..d291587 100755 --- a/ccid/ccid/MacOSX/configure +++ b/ccid/ccid/MacOSX/configure @@ -17,6 +17,8 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. +# $Id: configure 6792 2013-11-25 13:03:21Z rousseau $ + # to use # ./MacOSX/configure # make @@ -37,8 +39,6 @@ then exit; fi -./MacOSX/convert_reader_h.pl MacOSX/reader.h.in > MacOSX/reader.h - if [[ ("$*" =~ "--no-configure") ]]; then exit 0 fi @@ -48,23 +48,10 @@ fi PCSC_CFLAGS=${PCSC_CFLAGS:--I$(pwd)/MacOSX} PCSC_LIBS=${PCSC_LIBS:--framework PCSC} -libusb-config --version &> /dev/null -if [ $? -eq 0 ] -then - echo "found libusb-config, using it" - LIBUSB_CFLAGS=$(libusb-config --cflags) - LIBUSB_LIBS=$(libusb-config --libs) - # if possible replace "-L/usr/local/lib -lusb" - # by "/usr/local/lib/libusb.a" to use a static link - LIBUSB_LIBS=${LIBUSB_LIBS/-L\/usr\/local\/lib -lusb//usr/local/lib/libusb.a} - echo $LIBUSB_LIBS -else - echo "no libusb-config found" - # use libusb from OpenSC (universal binary) - LIBUSB_CFLAGS=${LIBUSB_CFLAGS:--I/Library/OpenSC/include} - #LIBUSB_LIBS=${LIBUSB_LIBS:--L/Library/OpenSC/lib -lusb} - LIBUSB_LIBS=${LIBUSB_LIBS:-/Library/OpenSC/lib/libusb.a -Wl,-framework -Wl,IOKit -Wl,-framework -Wl,CoreFoundation} -fi +# use libusb-1.0 (or libusbx-1.0) +LIBUSB_ARCHIVE=$(pkg-config --variable=libdir libusb-1.0)/libusb-1.0.a +LIBUSB_CFLAGS=$(pkg-config --cflags --static libusb-1.0) +LIBUSB_LIBS=$(pkg-config --libs --static libusb-1.0) # RESPONSECODE is already defined by PCSC/wintypes.h # define needed here to compile examples/scardcontrol.c since config.h is @@ -72,8 +59,21 @@ fi CFLAGS="$CFLAGS -DRESPONSECODE_DEFINED_IN_WINTYPES_H" # Build a Universal Binary -CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.5.sdk -arch i386 -arch ppc" -LDFLAGS="-arch i386 -arch ppc" +UB=$(file $LIBUSB_ARCHIVE | grep "Mach-O universal binary") +echo $UB +if [ -z "$UB" ] +then + echo -en $RED + echo "*************************" + echo "No Universal Binary build" + echo "*************************" + echo -en $NORMAL +else + echo "Universal Binary build" + CFLAGS="$CFLAGS -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -arch i386 -arch x86_64" +fi +echo + CONFIGURE_ARGS="--disable-dependency-tracking" # do not build a static driver @@ -86,8 +86,19 @@ CONFIGURE_ARGS="$CONFIGURE_ARGS --disable-pcsclite" # simulate a composite device as multi slots CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-composite-as-multislot" -# use a specific bundle name to NOT overwrite the official CCID driver -#CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-bundle=ifd-ccid-foobar.bundle" +# set BUNDLE_ID to a specific value for a specific driver +#BUNDLE_ID="vendor-reader" +if [ ! -z "$BUNDLE_ID" ] +then + # do not build a class driver (not yet used by pcsc-lite on Mac OS X) + CONFIGURE_ARGS="$CONFIGURE_ARGS --disable-class" + + # use a specific bundle name to NOT overwrite the official CCID driver + CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-bundle=ifd-ccid-$BUNDLE_ID.bundle" + + # differentiate each libccid library by the dynamic linker + CONFIGURE_ARGS="$CONFIGURE_ARGS --prefix=/fake/$BUNDLE_ID" +fi set -x ./configure \ diff --git a/ccid/ccid/MacOSX/configure.orig b/ccid/ccid/MacOSX/configure.orig new file mode 100755 index 0000000..ed59e03 --- /dev/null +++ b/ccid/ccid/MacOSX/configure.orig @@ -0,0 +1,113 @@ +#! /bin/bash + +# Copyright (C) 2007-2009 Ludovic Rousseau +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA. + +# $Id: configure 6792 2013-11-25 13:03:21Z rousseau $ + +# to use +# ./MacOSX/configure +# make +# make install +# the driver is installed in /usr/libexec/SmartCardServices/drivers + +# Colors +RED="\033[31m" +NORMAL="\033[0m" + +# run this script as ./MacOSX/configure to configure for Mac OS X +if [ ! -d MacOSX ] +then + echo -e $RED + echo "ERROR!" + echo "run ./MacOSX/configure from the source top directory" + echo -e $NORMAL + exit; +fi + +# find pcsc-lite header files in MacOSX/ +# use ${varname:-word} to return word only if varname is not already defined +PCSC_CFLAGS=${PCSC_CFLAGS:--I$(pwd)/MacOSX} +PCSC_LIBS=${PCSC_LIBS:--framework PCSC} + +# use libusb-1.0 (or libusbx-1.0) +LIBUSB_ARCHIVE=$(pkg-config --variable=libdir libusb-1.0)/libusb-1.0.a +LIBUSB_CFLAGS=$(pkg-config --cflags --static libusb-1.0) +LIBUSB_LIBS=$(pkg-config --libs --static libusb-1.0) + +# RESPONSECODE is already defined by PCSC/wintypes.h +# define needed here to compile examples/scardcontrol.c since config.h is +# not included +CFLAGS="$CFLAGS -DRESPONSECODE_DEFINED_IN_WINTYPES_H" + +# Build a Universal Binary +UB=$(file $LIBUSB_ARCHIVE | grep "Mach-O universal binary") +echo $UB +if [ -z "$UB" ] +then + echo -en $RED + echo "*************************" + echo "No Universal Binary build" + echo "*************************" + echo -en $NORMAL +else + echo "Universal Binary build" + CFLAGS="$CFLAGS -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -arch i386 -arch x86_64" +fi +echo + +CONFIGURE_ARGS="--disable-dependency-tracking" + +# do not build a static driver +# (building fails when linking statically with libusb) +CONFIGURE_ARGS="$CONFIGURE_ARGS --disable-static" + +# do not use pcscd debug feature +CONFIGURE_ARGS="$CONFIGURE_ARGS --disable-pcsclite" + +# simulate a composite device as multi slots +CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-composite-as-multislot" + +# set BUNDLE_ID to a specific value for a specific driver +#BUNDLE_ID="vendor-reader" +if [ ! -z "$BUNDLE_ID" ] +then + # do not build a class driver (not yet used by pcsc-lite on Mac OS X) + CONFIGURE_ARGS="$CONFIGURE_ARGS --disable-class" + + # use a specific bundle name to NOT overwrite the official CCID driver + CONFIGURE_ARGS="$CONFIGURE_ARGS --enable-bundle=ifd-ccid-$BUNDLE_ID.bundle" + + # differentiate each libccid library by the dynamic linker + CONFIGURE_ARGS="$CONFIGURE_ARGS --prefix=/fake/$BUNDLE_ID" +fi + +set -x +./configure \ + CFLAGS="$CFLAGS" \ + PCSC_CFLAGS="$PCSC_CFLAGS" \ + PCSC_LIBS="$PCSC_LIBS" \ + LIBUSB_CFLAGS="$LIBUSB_CFLAGS" \ + LIBUSB_LIBS="$LIBUSB_LIBS" \ + LDFLAGS="$LDFLAGS" \ + --enable-usbdropdir=/usr/libexec/SmartCardServices/drivers \ + $CONFIGURE_ARGS \ + "$@" + +# force a regeneration of Info.plist +rm -f src/Info.plist + diff --git a/ccid/ccid/MacOSX/debuglog.h b/ccid/ccid/MacOSX/debuglog.h index 75b22be..c434cf2 100644 --- a/ccid/ccid/MacOSX/debuglog.h +++ b/ccid/ccid/MacOSX/debuglog.h @@ -3,10 +3,10 @@ * * Copyright (C) 1999-2004 * David Corcoran - * Copyright (C) 1999-2005 + * Copyright (C) 1999-2011 * Ludovic Rousseau * - * $Id: debuglog.h 3075 2008-07-30 14:25:27Z rousseau $ + * $Id: debuglog.h 5854 2011-07-09 11:10:32Z rousseau $ */ /** @@ -33,22 +33,15 @@ #ifndef __debuglog_h__ #define __debuglog_h__ -#ifdef __cplusplus -extern "C" -{ -#endif - #ifndef PCSC_API #define PCSC_API #endif -#define DEBUGLOG_LOG_ENTRIES 1 -#define DEBUGLOG_IGNORE_ENTRIES 2 - enum { DEBUGLOG_NO_DEBUG = 0, DEBUGLOG_SYSLOG_DEBUG, - DEBUGLOG_STDERR_DEBUG + DEBUGLOG_STDOUT_DEBUG, + DEBUGLOG_STDOUT_COLOR_DEBUG }; #define DEBUG_CATEGORY_NOTHING 0 @@ -67,11 +60,33 @@ enum { #define __FUNCTION__ "" #endif +#ifndef __GNUC__ +#define __attribute__(x) /*nothing*/ +#endif + +#ifdef NO_LOG + +#define Log0(priority) do { } while(0) +#define Log1(priority, fmt) do { } while(0) +#define Log2(priority, fmt, data) do { } while(0) +#define Log3(priority, fmt, data1, data2) do { } while(0) +#define Log4(priority, fmt, data1, data2, data3) do { } while(0) +#define Log5(priority, fmt, data1, data2, data3, data4) do { } while(0) +#define Log9(priority, fmt, data1, data2, data3, data4, data5, data6, data7, data8) do { } while(0) +#define LogXxd(priority, msg, buffer, size) do { } while(0) + +#define DebugLogA(a) +#define DebugLogB(a, b) +#define DebugLogC(a, b,c) + +#else + #define Log0(priority) log_msg(priority, "%s:%d:%s()", __FILE__, __LINE__, __FUNCTION__) #define Log1(priority, fmt) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__) #define Log2(priority, fmt, data) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data) #define Log3(priority, fmt, data1, data2) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2) #define Log4(priority, fmt, data1, data2, data3) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2, data3) +#define Log5(priority, fmt, data1, data2, data3, data4) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2, data3, data4) #define Log9(priority, fmt, data1, data2, data3, data4, data5, data6, data7, data8) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2, data3, data4, data5, data6, data7, data8) #define LogXxd(priority, msg, buffer, size) log_xxd(priority, msg, buffer, size) @@ -79,7 +94,11 @@ enum { #define DebugLogB(a, b) Log2(PCSC_LOG_INFO, a, b) #define DebugLogC(a, b,c) Log3(PCSC_LOG_INFO, a, b, c) -PCSC_API void log_msg(const int priority, const char *fmt, ...); +#endif /* NO_LOG */ + +PCSC_API void log_msg(const int priority, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); + PCSC_API void log_xxd(const int priority, const char *msg, const unsigned char *buffer, const int size); @@ -89,9 +108,5 @@ int DebugLogSetCategory(const int); void DebugLogCategory(const int, const unsigned char *, const int); PCSC_API void DebugLogSetLevel(const int level); -#ifdef __cplusplus -} -#endif - #endif /* __debuglog_h__ */ diff --git a/ccid/ccid/MacOSX/ifdhandler.h b/ccid/ccid/MacOSX/ifdhandler.h index cad06a7..280d0b6 100644 --- a/ccid/ccid/MacOSX/ifdhandler.h +++ b/ccid/ccid/MacOSX/ifdhandler.h @@ -3,14 +3,227 @@ * * Copyright (C) 1999-2004 * David Corcoran + * Copyright (C) 2003-2004 * Damien Sauveron + * Copyright (C) 2002-2011 + * Ludovic Rousseau * - * $Id: ifdhandler.h 3029 2008-06-26 13:58:52Z rousseau $ + * $Id: ifdhandler.h 6413 2012-08-08 09:35:18Z rousseau $ */ /** * @file + * @defgroup IFDHandler IFDHandler * @brief This provides reader specific low-level calls. + +The routines specified hereafter will allow you to write an IFD handler +for the PC/SC Lite resource manager. Please use the complement +developer's kit complete with headers and Makefile at: +http://www.musclecard.com/drivers.html + +This gives a common API for communication to most readers in a +homogeneous fashion. This document assumes that the driver developer is +experienced with standards such as ISO-7816-(1, 2, 3, 4), EMV and MCT +specifications. For listings of these specifications please access the +above web site. + +@section UsbReaders USB readers + +USB readers use the bundle approach so that the reader can be loaded +and unloaded upon automatic detection of the device. The bundle +approach is simple: the actual library is just embedded in a +directory so additional information can be gathered about the device. + +A bundle looks like the following: + +@verbatim +GenericReader.bundle/ + Contents/ + Info.plist - XML file describing the reader + MacOS/ - Driver directory for OS X + Solaris/ - Driver directory for Solaris + Linux/ - Driver directory for Linux + HPUX/ - Driver directory for HPUX +@endverbatim + +The @c Info.plist file describes the driver and gives the loader +all the necessary information. The following must be contained in the +@c Info.plist file: + +@subsection ifdVendorID + +The vendor ID of the USB device. + +Example: + +@verbatim + ifdVendorID + 0x04E6 +@endverbatim + +You may have an OEM of this reader in which an additional @c +can be used like in the below example: + +@verbatim + ifdVendorID + + 0x04E6 + 0x0973 + +@endverbatim + +If multiples exist all the other parameters must have a second value +also. You may chose not to support this feature but it is useful when +reader vendors OEM products so you only distribute one driver. + + +The CCID driver from Ludovic Rousseau +http://pcsclite.alioth.debian.org/ccid.html uses this feature since the +same driver supports many different readers. + +@subsection ifdProductID + + The product id of the USB device. + +@verbatim + ifdProductID + 0x3437 +@endverbatim + +@subsection ifdFriendlyName + + Example: + +@verbatim + ifdFriendlyName + SCM Microsystems USB Reader +@endverbatim + +@subsection CFBundleExecutable + + The executable name which exists in the particular platform's directory. + + Example: + +@verbatim + CFBundleExecutable + libccid.so.0.4.2 +@endverbatim + +@subsection ifdCapabilities + + List of capabilities supported by the driver. This is a bit field. Possible values are: + +- 0 + No special capabilities +- 1 IFD_GENERATE_HOTPLUG + The driver supports the hot plug feature. + +Complete sample file: + +@verbatim + + + + + CFBundleDevelopmentRegion + English + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 0.0.1d1 + ifdCapabilities + 0x00000000 + ifdProtocolSupport + 0x00000001 + ifdVersionNumber + 0x00000001 + + CFBundleExecutable + libfoobar.so.x.y + + ifdManufacturerString + Foo bar inc. + + ifdProductString + Driver for Foobar reader, version x.y + + ifdVendorID + 0x1234 + + ifdProductID + 0x5678 + + ifdFriendlyName + Foobar USB reader + + +@endverbatim + +As indicated in the XML file the DTD is available at +http://www.apple.com/DTDs/PropertyList-1.0.dtd. + +@section SerialReaders Serial readers + +Serial drivers must be configured to operate on a particular port and +respond to a particular name. The @c reader.conf file is used for this +purpose. + +It has the following syntax: + +@verbatim +# Configuration file for pcsc-lite +# David Corcoran + +FRIENDLYNAME Generic Reader +DEVICENAME /dev/ttyS0 +LIBPATH /usr/lib/pcsc/drivers/libgen_ifd.so +CHANNELID 1 +@endverbatim + +The pound sign # denotes a comment. + +@subsection FRIENDLYNAME +The FRIENDLYNAME field is an arbitrary text used to identify the reader. +This text is displayed by commands like @c pcsc_scan +http://ludovic.rousseau.free.fr/softwares/pcsc-tools/ that prints the +names of all the connected and detected readers. + +@subsection DEVICENAME +The DEVICENAME field was not used for old drivers (using the IFD handler +version 2.0 or previous). It is now (IFD handler version 3.0) used to +identify the physical port on which the reader is connected. This is +the device name of this port. It is dependent of the OS kernel. For +example the first serial port device is called @c /dev/ttyS0 under Linux +and @c /dev/cuaa0 under FreeBSD. + +If you want to use IFDHCreateChannel() instead of +IFDHCreateChannelByName() then do not use any DEVICENAME line in the +configuration file. IFDHCreateChannel() will then be called with the +CHANNELID parameter. + +@subsection LIBPATH +The LIBPATH field is the filename of the driver code. The driver is a +dynamically loaded piece of code (generally a @c drivername.so* file). + +@subsection CHANNELID +The CHANNELID is no more used for recent drivers (IFD handler 3.0) and +has been superseded by DEVICENAME. + +If you have an old driver this field is used to indicate the port to +use. You should read your driver documentation to know what information +is needed here. It should be the serial port number for a serial reader. + +CHANNELID was the numeric version of the port in which the reader will +be located. This may be done by a symbolic link where @c /dev/pcsc/1 is +the first device which may be a symbolic link to @c /dev/ttyS0 or +whichever location your reader resides. + */ #ifndef _ifd_handler_h_ @@ -18,15 +231,9 @@ #include -#ifdef __cplusplus -extern "C" -{ -#endif - /* * List of data structures available to ifdhandler */ - typedef struct _DEVICE_CAPABILITIES { LPSTR Vendor_Name; /**< Tag 0x0100 */ @@ -75,6 +282,9 @@ extern "C" } PROTOCOL_OPTIONS, *PPROTOCOL_OPTIONS; + /** + * Use by SCardTransmit() + */ typedef struct _SCARD_IO_HEADER { DWORD Protocol; @@ -82,27 +292,20 @@ extern "C" } SCARD_IO_HEADER, *PSCARD_IO_HEADER; - /* - * End of structure list - */ - /* * The list of tags should be alot more but this is all I use in the * meantime */ - -#define TAG_IFD_ATR 0x0303 -#define TAG_IFD_SLOTNUM 0x0180 -#define TAG_IFD_SLOT_THREAD_SAFE 0x0FAC -#define TAG_IFD_THREAD_SAFE 0x0FAD -#define TAG_IFD_SLOTS_NUMBER 0x0FAE -#define TAG_IFD_SIMULTANEOUS_ACCESS 0x0FAF -#define TAG_IFD_POLLING_THREAD 0x0FB0 -#define TAG_IFD_POLLING_THREAD_KILLABLE 0x0FB1 - - /* - * End of tag list - */ +#define TAG_IFD_ATR 0x0303 /**< ATR */ +#define TAG_IFD_SLOTNUM 0x0180 /**< select a slot */ +#define TAG_IFD_SLOT_THREAD_SAFE 0x0FAC /**< support access to different slots of the reader */ +#define TAG_IFD_THREAD_SAFE 0x0FAD /**< driver is thread safe */ +#define TAG_IFD_SLOTS_NUMBER 0x0FAE /**< number of slots of the reader */ +#define TAG_IFD_SIMULTANEOUS_ACCESS 0x0FAF /**< number of reader the driver can manage */ +#define TAG_IFD_POLLING_THREAD 0x0FB0 /**< not used. See TAG_IFD_POLLING_THREAD_WITH_TIMEOUT */ +#define TAG_IFD_POLLING_THREAD_KILLABLE 0x0FB1 /**< the polling thread can be killed */ +#define TAG_IFD_STOP_POLLING_THREAD 0x0FB2 /**< method used to stop the polling thread (instead of just pthread_kill()) */ +#define TAG_IFD_POLLING_THREAD_WITH_TIMEOUT 0x0FB3 /**< driver uses a polling thread with a timeout parameter */ /* * IFD Handler version number enummerations @@ -110,47 +313,49 @@ extern "C" #define IFD_HVERSION_1_0 0x00010000 #define IFD_HVERSION_2_0 0x00020000 #define IFD_HVERSION_3_0 0x00030000 - /* - * End of version number enummerations - */ /* * List of defines available to ifdhandler */ - -#define IFD_POWER_UP 500 -#define IFD_POWER_DOWN 501 -#define IFD_RESET 502 - -#define IFD_NEGOTIATE_PTS1 1 -#define IFD_NEGOTIATE_PTS2 2 -#define IFD_NEGOTIATE_PTS3 4 - -#define IFD_SUCCESS 0 -#define IFD_ERROR_TAG 600 -#define IFD_ERROR_SET_FAILURE 601 -#define IFD_ERROR_VALUE_READ_ONLY 602 -#define IFD_ERROR_PTS_FAILURE 605 +#define IFD_POWER_UP 500 /**< power up the card */ +#define IFD_POWER_DOWN 501 /**< power down the card */ +#define IFD_RESET 502 /**< warm reset */ + +#define IFD_NEGOTIATE_PTS1 1 /**< negotiate PTS1 */ +#define IFD_NEGOTIATE_PTS2 2 /**< negotiate PTS2 */ +#define IFD_NEGOTIATE_PTS3 4 /**< negotiate PTS3 */ + +#define IFD_SUCCESS 0 /**< no error */ +#define IFD_ERROR_TAG 600 /**< tag unknown */ +#define IFD_ERROR_SET_FAILURE 601 /**< set failed */ +#define IFD_ERROR_VALUE_READ_ONLY 602 /**< value is read only */ +#define IFD_ERROR_PTS_FAILURE 605 /**< failed to negotiate PTS */ #define IFD_ERROR_NOT_SUPPORTED 606 -#define IFD_PROTOCOL_NOT_SUPPORTED 607 -#define IFD_ERROR_POWER_ACTION 608 +#define IFD_PROTOCOL_NOT_SUPPORTED 607 /**< requested protocol not supported */ +#define IFD_ERROR_POWER_ACTION 608 /**< power up failed */ #define IFD_ERROR_SWALLOW 609 #define IFD_ERROR_EJECT 610 #define IFD_ERROR_CONFISCATE 611 -#define IFD_COMMUNICATION_ERROR 612 -#define IFD_RESPONSE_TIMEOUT 613 -#define IFD_NOT_SUPPORTED 614 -#define IFD_ICC_PRESENT 615 -#define IFD_ICC_NOT_PRESENT 616 +#define IFD_COMMUNICATION_ERROR 612 /**< generic error */ +#define IFD_RESPONSE_TIMEOUT 613 /**< timeout */ +#define IFD_NOT_SUPPORTED 614 /**< request is not supported */ +#define IFD_ICC_PRESENT 615 /**< card is present */ +#define IFD_ICC_NOT_PRESENT 616 /**< card is absent */ +/** + * The \ref IFD_NO_SUCH_DEVICE error must be returned by the driver when + * it detects the reader is no more present. This will tell pcscd to + * remove the reader from the list of available readers. + */ #define IFD_NO_SUCH_DEVICE 617 +#define IFD_ERROR_INSUFFICIENT_BUFFER 618 /**< buffer is too small */ #ifndef RESPONSECODE_DEFINED_IN_WINTYPES_H typedef long RESPONSECODE; #endif /* - * If you want to compile a V2.0 IFDHandler, define IFDHANDLERv2 before you - * include this file. + * If you want to compile a V2.0 IFDHandler, define IFDHANDLERv2 + * before you include this file. * * By default it is setup for for most recent version of the API (V3.0) */ @@ -165,54 +370,428 @@ extern "C" * IFDHControl() API changed */ - RESPONSECODE IFDHCreateChannelByName(DWORD, LPSTR); - RESPONSECODE IFDHControl(DWORD, DWORD, PUCHAR, DWORD, PUCHAR, - DWORD, LPDWORD); -#else +/** +This function is required to open a communications channel to the port +listed by @p DeviceName. - /* - * List of Defined Functions Available to IFD_Handler 2.0 - */ +Once the channel is opened the reader must be in a state in which it is +possible to query IFDHICCPresence() for card status. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number\n + Use this for multiple card slots or multiple readers. 0xXXXXYYYY - + XXXX multiple readers, YYYY multiple slots. The resource manager will + set these automatically. By default the resource manager loads a new + instance of the driver so if your reader does not have more than one + smart card slot then ignore the Lun in all the functions.\n + \n + PC/SC supports the loading of multiple readers through one instance of + the driver in which XXXX is important. XXXX identifies the unique + reader in which the driver communicates to. The driver should set up + an array of structures that asociate this XXXX with the underlying + details of the particular reader. + +@param[in] DeviceName Filename to use by the driver.\n + For drivers configured by @p /etc/reader.conf this is the value of the + field \ref DEVICENAME. + \n + For USB drivers the @p DeviceName must start with @p usb:VID/PID. VID + is the Vendor ID and PID is the Product ID. Both are a 4-digits hex + number. + +Typically the string is generated by: + +@code +printf("usb:%04x/%04x", idVendor, idProduct); +@endcode + +The @p DeviceName string may also contain a more specialised +identification string. This additional information is used to +differentiate between two identical readers connected at the same time. +In this case the driver can't differentiate the two readers using VID +and PID and must use some additional information identifying the USB +port used by each reader. + +- libusb + + For USB drivers using libusb-1.0 http://libusb.sourceforge.net/ for USB + abstraction the @p DeviceName the string may be generated by: + + @code + printf("usb:%04x/%04x:libusb-1.0:%d:%d:%d", + idVendor, idProduct, bus_number, device_address, interface) + @endcode + + So it is something like: usb:08e6/3437:libusb-1.0:7:99:0 under + GNU/Linux. - RESPONSECODE IFDHControl(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD); +- libudev + + If pcscd is compiled with libudev support instead of libusb (default + since pcsc-lite 1.6.8) the string will look like: + + @code + printf("usb:%04x/%04x:libudev:%d:%s", idVendor, idProduct, + bInterfaceNumber, devpath); + @endcode + + bInterfaceNumber is the number of the interface on the device. It is + only usefull for devices with more than one CCID interface. + + devpath is the filename of the device on the file system. + + So it is something like: + usb:08e6/3437:libudev:0:/dev/bus/usb/008/047 + under GNU/Linux. + +- other + + If the driver does not understand the :libusb: or + :libudev: scheme or if a new scheme is used, the driver should + ignore the part it does not understand instead of failing. + + The driver shall recognize the usb:VID/PID part and, only if + possible, the remaining of the DeviceName field. + + It is the responsibility of the driver to correctly identify the reader. + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR DeviceName); + +/** +This function performs a data exchange with the reader (not the card) +specified by Lun. It is responsible for abstracting functionality such +as PIN pads, biometrics, LCD panels, etc. You should follow the MCT and +CTBCS specifications for a list of accepted commands to implement. This +function is fully voluntary and does not have to be implemented unless +you want extended functionality. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number +@param[in] dwControlCode Control code for the operation\n + This value identifies the specific operation to be performed. This + value is driver specific. +@param[in] TxBuffer Transmit data +@param[in] TxLength Length of this buffer +@param[out] RxBuffer Receive data +@param[in] RxLength Length of the response buffer +@param[out] pdwBytesReturned Length of response\n + This function will be passed the length of the buffer RxBuffer in + RxLength and it must set the length of the received data in + pdwBytesReturned. + +@note + @p *pdwBytesReturned should be set to zero on error. + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_RESPONSE_TIMEOUT The response timed out (\ref IFD_RESPONSE_TIMEOUT) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, PUCHAR + TxBuffer, DWORD TxLength, PUCHAR RxBuffer, DWORD RxLength, + LPDWORD pdwBytesReturned); + +#else + +/** + * Available in IFD_Handler 2.0 + * + * @deprecated + * You should use the new form of IFDHControl() + */ +RESPONSECODE IFDHControl(DWORD Lun, PUCHAR TxBuffer, DWORD TxLength, + PUCHAR RxBuffer, PDWORD RxLength); #endif /* * common functions in IFD_Handler 2.0 and 3.0 */ - RESPONSECODE IFDHCreateChannel(DWORD, DWORD); - RESPONSECODE IFDHCloseChannel(DWORD); - RESPONSECODE IFDHGetCapabilities(DWORD, DWORD, PDWORD, PUCHAR); - RESPONSECODE IFDHSetCapabilities(DWORD, DWORD, DWORD, PUCHAR); - RESPONSECODE IFDHSetProtocolParameters(DWORD, DWORD, UCHAR, - UCHAR, UCHAR, UCHAR); - RESPONSECODE IFDHPowerICC(DWORD, DWORD, PUCHAR, PDWORD); - RESPONSECODE IFDHTransmitToICC(DWORD, SCARD_IO_HEADER, PUCHAR, - DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER); - RESPONSECODE IFDHICCPresence(DWORD); +/** +This function is required to open a communications channel to the port +listed by Channel. For example, the first serial reader on COM1 would +link to @p /dev/pcsc/1 which would be a symbolic link to @p /dev/ttyS0 +on some machines This is used to help with inter-machine independence. + +On machines with no /dev directory the driver writer may choose to map +their Channel to whatever they feel is appropriate. + +Once the channel is opened the reader must be in a state in which it is +possible to query IFDHICCPresence() for card status. + +USB readers can ignore the @p Channel parameter and query the USB bus +for the particular reader by manufacturer and product id. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number\n + Use this for multiple card slots or multiple readers. 0xXXXXYYYY - + XXXX multiple readers, YYYY multiple slots. The resource manager will + set these automatically. By default the resource manager loads a new + instance of the driver so if your reader does not have more than one + smart card slot then ignore the Lun in all the functions.\n + \n + PC/SC supports the loading of multiple readers through one instance of + the driver in which XXXX is important. XXXX identifies the unique + reader in which the driver communicates to. The driver should set up + an array of structures that associate this XXXX with the underlying + details of the particular reader. +@param[in] Channel Channel ID + This is denoted by the following: + - 0x000001 @p /dev/pcsc/1 + - 0x000002 @p /dev/pcsc/2 + - 0x000003 @p /dev/pcsc/3 + - 0x000004 @p /dev/pcsc/4 + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) - /* - * List of Defined Functions Available to IFD_Handler 1.0 - */ + */ +RESPONSECODE IFDHCreateChannel(DWORD Lun, DWORD Channel); - RESPONSECODE IO_Create_Channel(DWORD); - RESPONSECODE IO_Close_Channel(void); - RESPONSECODE IFD_Get_Capabilities(DWORD, PUCHAR); - RESPONSECODE IFD_Set_Capabilities(DWORD, PUCHAR); - RESPONSECODE IFD_Set_Protocol_Parameters(DWORD, UCHAR, UCHAR, - UCHAR, UCHAR); - RESPONSECODE IFD_Power_ICC(DWORD); - RESPONSECODE IFD_Swallow_ICC(void); - RESPONSECODE IFD_Eject_ICC(void); - RESPONSECODE IFD_Confiscate_ICC(void); - RESPONSECODE IFD_Transmit_to_ICC(SCARD_IO_HEADER, PUCHAR, DWORD, - PUCHAR, PDWORD, PSCARD_IO_HEADER); - RESPONSECODE IFD_Is_ICC_Present(void); - RESPONSECODE IFD_Is_ICC_Absent(void); - -#ifdef __cplusplus -} -#endif +/** +This function should close the reader communication channel for the +particular reader. Prior to closing the communication channel the reader +should make sure the card is powered down and the terminal is also +powered down. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHCloseChannel(DWORD Lun); + +/** +This function should get the slot/card capabilities for a particular +slot/card specified by Lun. Again, if you have only 1 card slot and +don't mind loading a new driver for each reader then ignore Lun. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number +@param[in] Tag Tag of the desired data value +- \ref TAG_IFD_ATR + Return the ATR and its size (implementation is mandatory). +- \ref TAG_IFD_SLOTNUM + Unused/deprecated +- \ref SCARD_ATTR_ATR_STRING + Same as \ref TAG_IFD_ATR but this one is not mandatory. It is defined + in Microsoft PC/SC SCardGetAttrib(). +- \ref TAG_IFD_SIMULTANEOUS_ACCESS + Return the number of sessions (readers) the driver can handle in + Value[0]. + This is used for multiple readers sharing the same driver. +- \ref TAG_IFD_THREAD_SAFE + If the driver supports more than one reader (see + \ref TAG_IFD_SIMULTANEOUS_ACCESS above) this tag indicates if the + driver supports access to multiple readers at the same time.\n + Value[0] = 1 indicates the driver supports simultaneous accesses. +- \ref TAG_IFD_SLOTS_NUMBER + Return the number of slots in this reader in Value[0]. +- \ref TAG_IFD_SLOT_THREAD_SAFE + If the reader has more than one slot (see \ref TAG_IFD_SLOTS_NUMBER + above) this tag indicates if the driver supports access to multiple + slots of the same reader at the same time.\n + Value[0] = 1 indicates the driver supports simultaneous slot + accesses. +- \ref TAG_IFD_POLLING_THREAD + Unused/deprecated +- \ref TAG_IFD_POLLING_THREAD_WITH_TIMEOUT + If the driver provides a polling thread then @p Value is a pointer to + this function. The function prototype is: +@verbatim + RESPONSECODE foo(DWORD Lun, int timeout); +@endverbatim +- \ref TAG_IFD_POLLING_THREAD_KILLABLE + Tell if the polling thread can be killed (pthread_kill()) by pcscd +- \ref TAG_IFD_STOP_POLLING_THREAD + Returns a pointer in @p Value to the function used to stop the polling + thread returned by \ref TAG_IFD_POLLING_THREAD_WITH_TIMEOUT. The + function prototype is: +@verbatim + RESPONSECODE foo(DWORD Lun); +@endverbatim +@param[in,out] Length Length of the desired data value +@param[out] Value Value of the desired data + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_ERROR_TAG Invalid tag given (\ref IFD_ERROR_TAG) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, PDWORD Length, + PUCHAR Value); + +/** +This function should set the slot/card capabilities for a particular +slot/card specified by @p Lun. Again, if you have only 1 card slot and +don't mind loading a new driver for each reader then ignore @p Lun. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number +@param[in] Tag Tag of the desired data value +@param[in,out] Length Length of the desired data value +@param[out] Value Value of the desired data + +This function is also called when the application uses the PC/SC +SCardGetAttrib() function. The list of supported tags is not limited. + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_ERROR_TAG Invalid tag given (\ref IFD_ERROR_TAG) +@retval IFD_ERROR_SET_FAILURE Could not set value (\ref IFD_ERROR_SET_FAILURE) +@retval IFD_ERROR_VALUE_READ_ONLY Trying to set read only value (\ref IFD_ERROR_VALUE_READ_ONLY) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHSetCapabilities(DWORD Lun, DWORD Tag, DWORD Length, PUCHAR Value); + +/** +This function should set the Protocol Type Selection (PTS) of a +particular card/slot using the three PTS parameters sent + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number +@param[in] Protocol Desired protocol +- \ref SCARD_PROTOCOL_T0 + T=0 protocol +- \ref SCARD_PROTOCOL_T1 + T=1 protocol +@param[in] Flags Logical OR of possible values to determine which PTS values +to negotiate +- \ref IFD_NEGOTIATE_PTS1 +- \ref IFD_NEGOTIATE_PTS2 +- \ref IFD_NEGOTIATE_PTS3 +@param[in] PTS1 1st PTS Value +@param[in] PTS2 2nd PTS Value +@param[in] PTS3 3rd PTS Value\n + See ISO 7816/EMV documentation. + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_ERROR_PTS_FAILURE Could not set PTS value (\ref IFD_ERROR_PTS_FAILURE) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_PROTOCOL_NOT_SUPPORTED Protocol is not supported (\ref IFD_PROTOCOL_NOT_SUPPORTED) +@retval IFD_NOT_SUPPORTED Action not supported (\ref IFD_NOT_SUPPORTED) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, UCHAR Flags, + UCHAR PTS1, UCHAR PTS2, UCHAR PTS3); +/** +This function controls the power and reset signals of the smart card +reader at the particular reader/slot specified by @p Lun. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number +@param[in] Action Action to be taken on the card +- \ref IFD_POWER_UP + Power up the card (store and return Atr and AtrLength) +- \ref IFD_POWER_DOWN + Power down the card (Atr and AtrLength should be zeroed) +- \ref IFD_RESET + Perform a warm reset of the card (no power down). If the card is not powered then power up the card (store and return Atr and AtrLength) +@param[out] Atr Answer to Reset (ATR) of the card\n + The driver is responsible for caching this value in case + IFDHGetCapabilities() is called requesting the ATR and its length. The + ATR length should not exceed \ref MAX_ATR_SIZE. +@param[in,out] AtrLength Length of the ATR\n + This should not exceed \ref MAX_ATR_SIZE. + +@note +Memory cards without an ATR should return \ref IFD_SUCCESS on reset but the +Atr should be zeroed and the length should be zero Reset errors should +return zero for the AtrLength and return \ref IFD_ERROR_POWER_ACTION. + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_ERROR_POWER_ACTION Error powering/resetting card (\ref IFD_ERROR_POWER_ACTION) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_NOT_SUPPORTED Action not supported (\ref IFD_NOT_SUPPORTED) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action, PUCHAR Atr, PDWORD + AtrLength); + +/** +This function performs an APDU exchange with the card/slot specified by +Lun. The driver is responsible for performing any protocol specific +exchanges such as T=0, 1, etc. differences. Calling this function will +abstract all protocol differences. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number +@param[in] SendPci contains two structure members +- Protocol 0, 1, ... 14\n + T=0 ... T=14 +- Length\n + Not used. +@param[in] TxBuffer Transmit APDU\n + Example: "\x00\xA4\x00\x00\x02\x3F\x00" +@param[in] TxLength Length of this buffer +@param[out] RxBuffer Receive APDU\n + Example: "\x61\x14" +@param[in,out] RxLength Length of the received APDU\n + This function will be passed the size of the buffer of RxBuffer and + this function is responsible for setting this to the length of the + received APDU response. This should be ZERO on all errors. The + resource manager will take responsibility of zeroing out any temporary + APDU buffers for security reasons. +@param[out] RecvPci contains two structure members +- Protocol - 0, 1, ... 14\n + T=0 ... T=14 +- Length\n + Not used. + +@note +The driver is responsible for knowing what type of card it has. If the +current slot/card contains a memory card then this command should ignore +the Protocol and use the MCT style commands for support for these style +cards and transmit them appropriately. If your reader does not support +memory cards or you don't want to implement this functionality, then +ignore this. +@par +RxLength should be set to zero on error. +@par +The driver is not responsible for doing an automatic Get Response +command for received buffers containing 61 XX. + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_RESPONSE_TIMEOUT The response timed out (\ref IFD_RESPONSE_TIMEOUT) +@retval IFD_ICC_NOT_PRESENT ICC is not present (\ref IFD_ICC_NOT_PRESENT) +@retval IFD_NOT_SUPPORTED Action not supported (\ref IFD_NOT_SUPPORTED) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHTransmitToICC(DWORD Lun, SCARD_IO_HEADER SendPci, + PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, PDWORD + RxLength, PSCARD_IO_HEADER RecvPci); + +/** +This function returns the status of the card inserted in the reader/slot +specified by @p Lun. In cases where the device supports asynchronous +card insertion/removal detection, it is advised that the driver manages +this through a thread so the driver does not have to send and receive a +command each time this function is called. + +@ingroup IFDHandler +@param[in] Lun Logical Unit Number + +@return Error codes +@retval IFD_SUCCESS Successful (\ref IFD_SUCCESS) +@retval IFD_COMMUNICATION_ERROR Error has occurred (\ref IFD_COMMUNICATION_ERROR) +@retval IFD_ICC_NOT_PRESENT ICC is not present (\ref IFD_ICC_NOT_PRESENT) +@retval IFD_NO_SUCH_DEVICE The reader is no more present (\ref IFD_NO_SUCH_DEVICE) + */ +RESPONSECODE IFDHICCPresence(DWORD Lun); #endif diff --git a/ccid/ccid/MacOSX/reader.h b/ccid/ccid/MacOSX/reader.h index 4e12d67..80a1486 100644 --- a/ccid/ccid/MacOSX/reader.h +++ b/ccid/ccid/MacOSX/reader.h @@ -3,10 +3,10 @@ * * Copyright (C) 1999-2005 * David Corcoran - * Copyright (C) 1999-2009 + * Copyright (C) 2005-2009 * Ludovic Rousseau * - * $Id: reader.h.in 4210 2009-05-14 13:14:59Z rousseau $ + * $Id: reader.h 6638 2013-05-28 08:20:15Z rousseau $ */ /** @@ -97,7 +97,7 @@ #define SCARD_CTL_CODE(code) (0x42000000 + (code)) /** - * PC/SC v2.02.05 part 10 reader tags + * PC/SC part 10 v2.02.07 March 2010 reader tags */ #define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400) @@ -108,7 +108,7 @@ #define FEATURE_GET_KEY_PRESSED 0x05 #define FEATURE_VERIFY_PIN_DIRECT 0x06 /**< Verify PIN */ #define FEATURE_MODIFY_PIN_DIRECT 0x07 /**< Modify PIN */ -#define FEATURE_MCT_READERDIRECT 0x08 +#define FEATURE_MCT_READER_DIRECT 0x08 #define FEATURE_MCT_UNIVERSAL 0x09 #define FEATURE_IFD_PIN_PROPERTIES 0x0A /**< retrieve properties of the IFD regarding PIN handling */ #define FEATURE_ABORT 0x0B @@ -118,8 +118,11 @@ #define FEATURE_WRITE_DISPLAY 0x0F #define FEATURE_GET_KEY 0x10 #define FEATURE_IFD_DISPLAY_PROPERTIES 0x11 +#define FEATURE_GET_TLV_PROPERTIES 0x12 +#define FEATURE_CCID_ESC_COMMAND 0x13 +#define FEATURE_EXECUTE_PACE 0x20 -/* structures used (but not defined) in PC/SC Part 10 revision 2.02.05: +/* structures used (but not defined) in PC/SC Part 10: * "IFDs with Secure Pin Entry Capabilities" */ #include @@ -140,15 +143,10 @@ typedef struct uint32_t value; /**< This value is always in BIG ENDIAN format as documented in PCSC v2 part 10 ch 2.2 page 2. You can use ntohl() for example */ } PCSC_TLV_STRUCTURE; -/** the wLangId and wPINMaxExtraDigit are 16-bits long so are subject to byte - * ordering */ -#ifdef __BIG_ENDIAN__ -#define HOST_TO_CCID_16(x) ((((x) >> 8) & 0xFF) + ((x & 0xFF) << 8)) -#define HOST_TO_CCID_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + ((x & 0xFF00) << 8) + (((x) & 0xFF) << 24)) -#else +/** Since CCID 1.4.1 (revision 5252) the byte order is no more important + * These macros are now deprecated and should be removed in the future */ #define HOST_TO_CCID_16(x) (x) #define HOST_TO_CCID_32(x) (x) -#endif /** structure used with \ref FEATURE_VERIFY_PIN_DIRECT */ typedef struct @@ -172,7 +170,13 @@ typedef struct uint8_t bMsgIndex; /**< Message index (should be 00) */ uint8_t bTeoPrologue[3]; /**< T=1 block prologue field to use (fill with 00) */ uint32_t ulDataLength; /**< length of Data to be sent to the ICC */ - uint8_t abData[1]; /**< Data to send to the ICC */ + uint8_t abData +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; /**< Data to send to the ICC */ } PIN_VERIFY_STRUCTURE; /** structure used with \ref FEATURE_MODIFY_PIN_DIRECT */ @@ -205,14 +209,18 @@ typedef struct uint8_t bMsgIndex3; /**< index of 3d prompting message */ uint8_t bTeoPrologue[3]; /**< T=1 block prologue field to use (fill with 00) */ uint32_t ulDataLength; /**< length of Data to be sent to the ICC */ - uint8_t abData[1]; /**< Data to send to the ICC */ + uint8_t abData +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; /**< Data to send to the ICC */ } PIN_MODIFY_STRUCTURE; /** structure used with \ref FEATURE_IFD_PIN_PROPERTIES */ typedef struct { uint16_t wLcdLayout; /**< display characteristics */ - uint16_t wLcdMaxCharacters; - uint16_t wLcdMaxLines; uint8_t bEntryValidationCondition; uint8_t bTimeOut2; } PIN_PROPERTIES_STRUCTURE; @@ -224,5 +232,19 @@ typedef struct { #pragma pack(pop) #endif +/* properties returned by FEATURE_GET_TLV_PROPERTIES */ +#define PCSCv2_PART10_PROPERTY_wLcdLayout 1 +#define PCSCv2_PART10_PROPERTY_bEntryValidationCondition 2 +#define PCSCv2_PART10_PROPERTY_bTimeOut2 3 +#define PCSCv2_PART10_PROPERTY_wLcdMaxCharacters 4 +#define PCSCv2_PART10_PROPERTY_wLcdMaxLines 5 +#define PCSCv2_PART10_PROPERTY_bMinPINSize 6 +#define PCSCv2_PART10_PROPERTY_bMaxPINSize 7 +#define PCSCv2_PART10_PROPERTY_sFirmwareID 8 +#define PCSCv2_PART10_PROPERTY_bPPDUSupport 9 +#define PCSCv2_PART10_PROPERTY_dwMaxAPDUDataSize 10 +#define PCSCv2_PART10_PROPERTY_wIdVendor 11 +#define PCSCv2_PART10_PROPERTY_wIdProduct 12 + #endif diff --git a/ccid/ccid/MacOSX/reader.h.in b/ccid/ccid/MacOSX/reader.h.in deleted file mode 100644 index 565484f..0000000 --- a/ccid/ccid/MacOSX/reader.h.in +++ /dev/null @@ -1,223 +0,0 @@ -/* - * MUSCLE SmartCard Development ( http://www.linuxnet.com ) - * - * Copyright (C) 1999-2005 - * David Corcoran - * Copyright (C) 1999-2009 - * Ludovic Rousseau - * - * $Id: reader.h.in 4210 2009-05-14 13:14:59Z rousseau $ - */ - -/** - * @file - * @brief This keeps a list of defines shared between the driver and the application - */ - -#ifndef __reader_h__ -#define __reader_h__ - -/* - * Tags for requesting card and reader attributes - */ - -#define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag))) - -#define SCARD_CLASS_VENDOR_INFO 1 /**< Vendor information definitions */ -#define SCARD_CLASS_COMMUNICATIONS 2 /**< Communication definitions */ -#define SCARD_CLASS_PROTOCOL 3 /**< Protocol definitions */ -#define SCARD_CLASS_POWER_MGMT 4 /**< Power Management definitions */ -#define SCARD_CLASS_SECURITY 5 /**< Security Assurance definitions */ -#define SCARD_CLASS_MECHANICAL 6 /**< Mechanical characteristic definitions */ -#define SCARD_CLASS_VENDOR_DEFINED 7 /**< Vendor specific definitions */ -#define SCARD_CLASS_IFD_PROTOCOL 8 /**< Interface Device Protocol options */ -#define SCARD_CLASS_ICC_STATE 9 /**< ICC State specific definitions */ -#define SCARD_CLASS_SYSTEM 0x7fff /**< System-specific definitions */ - -#define SCARD_ATTR_VENDOR_NAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0100) /**< Vendor name. */ -#define SCARD_ATTR_VENDOR_IFD_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0101) /**< Vendor-supplied interface device type (model designation of reader). */ -#define SCARD_ATTR_VENDOR_IFD_VERSION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102) /**< Vendor-supplied interface device version (DWORD in the form 0xMMmmbbbb where MM = major version, mm = minor version, and bbbb = build number). */ -#define SCARD_ATTR_VENDOR_IFD_SERIAL_NO SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0103) /**< Vendor-supplied interface device serial number. */ -#define SCARD_ATTR_CHANNEL_ID SCARD_ATTR_VALUE(SCARD_CLASS_COMMUNICATIONS, 0x0110) /**< DWORD encoded as 0xDDDDCCCC, where DDDD = data channel type and CCCC = channel number */ -#define SCARD_ATTR_ASYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0120) /**< FIXME */ -#define SCARD_ATTR_DEFAULT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0121) /**< Default clock rate, in kHz. */ -#define SCARD_ATTR_MAX_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0122) /**< Maximum clock rate, in kHz. */ -#define SCARD_ATTR_DEFAULT_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0123) /**< Default data rate, in bps. */ -#define SCARD_ATTR_MAX_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0124) /**< Maximum data rate, in bps. */ -#define SCARD_ATTR_MAX_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0125) /**< Maximum bytes for information file size device. */ -#define SCARD_ATTR_SYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0126) /**< FIXME */ -#define SCARD_ATTR_POWER_MGMT_SUPPORT SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, 0x0131) /**< Zero if device does not support power down while smart card is inserted. Nonzero otherwise. */ -#define SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0140) /**< FIXME */ -#define SCARD_ATTR_USER_AUTH_INPUT_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0142) /**< FIXME */ -#define SCARD_ATTR_CHARACTERISTICS SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, 0x0150) /**< DWORD indicating which mechanical characteristics are supported. If zero, no special characteristics are supported. Note that multiple bits can be set */ - -#define SCARD_ATTR_CURRENT_PROTOCOL_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0201) /**< FIXME */ -#define SCARD_ATTR_CURRENT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0202) /**< Current clock rate, in kHz. */ -#define SCARD_ATTR_CURRENT_F SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0203) /**< Clock conversion factor. */ -#define SCARD_ATTR_CURRENT_D SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0204) /**< Bit rate conversion factor. */ -#define SCARD_ATTR_CURRENT_N SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0205) /**< Current guard time. */ -#define SCARD_ATTR_CURRENT_W SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0206) /**< Current work waiting time. */ -#define SCARD_ATTR_CURRENT_IFSC SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0207) /**< Current byte size for information field size card. */ -#define SCARD_ATTR_CURRENT_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0208) /**< Current byte size for information field size device. */ -#define SCARD_ATTR_CURRENT_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0209) /**< Current block waiting time. */ -#define SCARD_ATTR_CURRENT_CWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020a) /**< Current character waiting time. */ -#define SCARD_ATTR_CURRENT_EBC_ENCODING SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020b) /**< Current error block control encoding. */ -#define SCARD_ATTR_EXTENDED_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020c) /**< FIXME */ - -#define SCARD_ATTR_ICC_PRESENCE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0300) /**< Single byte indicating smart card presence */ -#define SCARD_ATTR_ICC_INTERFACE_STATUS SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0301) /**< Single byte. Zero if smart card electrical contact is not active; nonzero if contact is active. */ -#define SCARD_ATTR_CURRENT_IO_STATE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0302) /**< FIXME */ -#define SCARD_ATTR_ATR_STRING SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303) /**< Answer to reset (ATR) string. */ -#define SCARD_ATTR_ICC_TYPE_PER_ATR SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0304) /**< Single byte indicating smart card type */ - -#define SCARD_ATTR_ESC_RESET SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA000) /**< FIXME */ -#define SCARD_ATTR_ESC_CANCEL SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA003) /**< FIXME */ -#define SCARD_ATTR_ESC_AUTHREQUEST SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA005) /**< FIXME */ -#define SCARD_ATTR_MAXINPUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA007) /**< FIXME */ - -#define SCARD_ATTR_DEVICE_UNIT SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0001) /**< Instance of this vendor's reader attached to the computer. The first instance will be device unit 0, the next will be unit 1 (if it is the same brand of reader) and so on. Two different brands of readers will both have zero for this value. */ -#define SCARD_ATTR_DEVICE_IN_USE SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0002) /**< Reserved for future use. */ -#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003) -#define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004) -#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0005) -#define SCARD_ATTR_DEVICE_SYSTEM_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0006) -#define SCARD_ATTR_SUPRESS_T1_IFS_REQUEST SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0007) /**< FIXME */ - -#ifdef UNICODE -#define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_W /**< Reader's display name. */ -#define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_W /**< Reader's system name. */ -#else -#define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_A /**< Reader's display name. */ -#define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_A /**< Reader's system name. */ -#endif - -/** - * Provide source compatibility on different platforms - */ -#define SCARD_CTL_CODE(code) (0x42000000 + (code)) - -/** - * PC/SC v2.02.05 part 10 reader tags - */ -#define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400) - -#define FEATURE_VERIFY_PIN_START 0x01 -#define FEATURE_VERIFY_PIN_FINISH 0x02 -#define FEATURE_MODIFY_PIN_START 0x03 -#define FEATURE_MODIFY_PIN_FINISH 0x04 -#define FEATURE_GET_KEY_PRESSED 0x05 -#define FEATURE_VERIFY_PIN_DIRECT 0x06 /**< Verify PIN */ -#define FEATURE_MODIFY_PIN_DIRECT 0x07 /**< Modify PIN */ -#define FEATURE_MCT_READERDIRECT 0x08 -#define FEATURE_MCT_UNIVERSAL 0x09 -#define FEATURE_IFD_PIN_PROPERTIES 0x0A /**< retrieve properties of the IFD regarding PIN handling */ -#define FEATURE_ABORT 0x0B -#define FEATURE_SET_SPE_MESSAGE 0x0C -#define FEATURE_VERIFY_PIN_DIRECT_APP_ID 0x0D -#define FEATURE_MODIFY_PIN_DIRECT_APP_ID 0x0E -#define FEATURE_WRITE_DISPLAY 0x0F -#define FEATURE_GET_KEY 0x10 -#define FEATURE_IFD_DISPLAY_PROPERTIES 0x11 - -/* structures used (but not defined) in PC/SC Part 10 revision 2.02.05: - * "IFDs with Secure Pin Entry Capabilities" */ - -#include - -/* Set structure elements aligment on bytes - * http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html */ -#if defined(__APPLE__) | defined(sun) -#pragma pack(1) -#else -#pragma pack(push, 1) -#endif - -/** the structure must be 6-bytes long */ -typedef struct -{ - uint8_t tag; - uint8_t length; - uint32_t value; /**< This value is always in BIG ENDIAN format as documented in PCSC v2 part 10 ch 2.2 page 2. You can use ntohl() for example */ -} PCSC_TLV_STRUCTURE; - -/** the wLangId and wPINMaxExtraDigit are 16-bits long so are subject to byte - * ordering */ -#define HOST_TO_CCID_16(x) @host_to_ccid_16@ -#define HOST_TO_CCID_32(x) @host_to_ccid_32@ - -/** structure used with \ref FEATURE_VERIFY_PIN_DIRECT */ -typedef struct -{ - uint8_t bTimerOut; /**< timeout is seconds (00 means use default timeout) */ - uint8_t bTimerOut2; /**< timeout in seconds after first key stroke */ - uint8_t bmFormatString; /**< formatting options */ - uint8_t bmPINBlockString; /**< bits 7-4 bit size of PIN length in APDU, - * bits 3-0 PIN block size in bytes after - * justification and formatting */ - uint8_t bmPINLengthFormat; /**< bits 7-5 RFU, - * bit 4 set if system units are bytes, clear if - * system units are bits, - * bits 3-0 PIN length position in system units */ - uint16_t wPINMaxExtraDigit; /**< 0xXXYY where XX is minimum PIN size in digits, - and YY is maximum PIN size in digits */ - uint8_t bEntryValidationCondition; /**< Conditions under which PIN entry should - * be considered complete */ - uint8_t bNumberMessage; /**< Number of messages to display for PIN verification */ - uint16_t wLangId; /**< Language for messages */ - uint8_t bMsgIndex; /**< Message index (should be 00) */ - uint8_t bTeoPrologue[3]; /**< T=1 block prologue field to use (fill with 00) */ - uint32_t ulDataLength; /**< length of Data to be sent to the ICC */ - uint8_t abData[1]; /**< Data to send to the ICC */ -} PIN_VERIFY_STRUCTURE; - -/** structure used with \ref FEATURE_MODIFY_PIN_DIRECT */ -typedef struct -{ - uint8_t bTimerOut; /**< timeout is seconds (00 means use default timeout) */ - uint8_t bTimerOut2; /**< timeout in seconds after first key stroke */ - uint8_t bmFormatString; /**< formatting options */ - uint8_t bmPINBlockString; /**< bits 7-4 bit size of PIN length in APDU, - * bits 3-0 PIN block size in bytes after - * justification and formatting */ - uint8_t bmPINLengthFormat; /**< bits 7-5 RFU, - * bit 4 set if system units are bytes, clear if - * system units are bits, - * bits 3-0 PIN length position in system units */ - uint8_t bInsertionOffsetOld; /**< Insertion position offset in bytes for - the current PIN */ - uint8_t bInsertionOffsetNew; /**< Insertion position offset in bytes for - the new PIN */ - uint16_t wPINMaxExtraDigit; - /**< 0xXXYY where XX is minimum PIN size in digits, - and YY is maximum PIN size in digits */ - uint8_t bConfirmPIN; /**< Flags governing need for confirmation of new PIN */ - uint8_t bEntryValidationCondition; /**< Conditions under which PIN entry should - * be considered complete */ - uint8_t bNumberMessage; /**< Number of messages to display for PIN verification*/ - uint16_t wLangId; /**< Language for messages */ - uint8_t bMsgIndex1; /**< index of 1st prompting message */ - uint8_t bMsgIndex2; /**< index of 2d prompting message */ - uint8_t bMsgIndex3; /**< index of 3d prompting message */ - uint8_t bTeoPrologue[3]; /**< T=1 block prologue field to use (fill with 00) */ - uint32_t ulDataLength; /**< length of Data to be sent to the ICC */ - uint8_t abData[1]; /**< Data to send to the ICC */ -} PIN_MODIFY_STRUCTURE; - -/** structure used with \ref FEATURE_IFD_PIN_PROPERTIES */ -typedef struct { - uint16_t wLcdLayout; /**< display characteristics */ - uint16_t wLcdMaxCharacters; - uint16_t wLcdMaxLines; - uint8_t bEntryValidationCondition; - uint8_t bTimeOut2; -} PIN_PROPERTIES_STRUCTURE; - -/* restore default structure elements alignment */ -#if defined(__APPLE__) | defined(sun) -#pragma pack() -#else -#pragma pack(pop) -#endif - -#endif - diff --git a/ccid/ccid/Makefile.am b/ccid/ccid/Makefile.am index 1ef09b4..d33fd97 100644 --- a/ccid/ccid/Makefile.am +++ b/ccid/ccid/Makefile.am @@ -1,15 +1,16 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = m4 readers examples contrib src +SUBDIRS = readers examples contrib src EXTRA_DIST = bootstrap ChangeLog SCARDGETATTRIB.txt \ $(AUX_DIST) \ + m4/ax_pthread.m4 \ MacOSX/configure \ MacOSX/convert_reader_h.pl \ MacOSX/debuglog.h \ MacOSX/ifdhandler.h \ MacOSX/pcsclite.h \ - MacOSX/reader.h.in \ + MacOSX/reader.h \ MacOSX/winscard.h \ MacOSX/wintypes.h diff --git a/ccid/ccid/Makefile.in b/ccid/ccid/Makefile.in index 3fac1a5..2634c3b 100644 --- a/ccid/ccid/Makefile.in +++ b/ccid/ccid/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,9 +14,55 @@ @SET_MAKE@ VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -32,16 +78,17 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ - compile config.guess config.sub depcomp install-sh ltmain.sh \ - missing ylwrap +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/config.h.in COPYING ar-lib compile config.guess \ + config.sub depcomp install-sh missing ylwrap ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -49,33 +96,109 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" GZIP_ENV = --best DIST_ARCHIVES = $(distdir).tar.bz2 +DIST_TARGETS = dist-bzip2 distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -90,6 +213,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -116,7 +240,6 @@ LIBTOOL = @LIBTOOL@ # Automatically update the libtool script if it becomes out-of-date. LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -124,6 +247,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -137,11 +261,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -157,15 +284,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -192,7 +321,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -201,24 +329,27 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ usbdropdir = @usbdropdir@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = m4 readers examples contrib src +SUBDIRS = readers examples contrib src EXTRA_DIST = bootstrap ChangeLog SCARDGETATTRIB.txt \ $(AUX_DIST) \ + m4/ax_pthread.m4 \ MacOSX/configure \ MacOSX/convert_reader_h.pl \ MacOSX/debuglog.h \ MacOSX/ifdhandler.h \ MacOSX/pcsclite.h \ - MacOSX/reader.h.in \ + MacOSX/reader.h \ MacOSX/winscard.h \ MacOSX/wintypes.h @@ -228,21 +359,21 @@ all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: -am--refresh: +am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ - cd $(srcdir) && $(AUTOMAKE) --foreign \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -258,21 +389,20 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) + $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ @@ -289,22 +419,25 @@ distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -312,65 +445,20 @@ $(RECURSIVE_TARGETS): else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ @@ -382,45 +470,63 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) - test -d $(distdir) || mkdir $(distdir) + test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -436,65 +542,89 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ + am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) + || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -502,26 +632,31 @@ dist dist-all: distdir distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ - bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ @@ -542,14 +677,24 @@ distcheck: dist && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck - $(am__remove_distdir) + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @cd $(distuninstallcheck_dir) \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -580,16 +725,22 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -612,6 +763,8 @@ dvi-am: html: html-recursive +html-am: + info: info-recursive info-am: @@ -620,18 +773,28 @@ install-data-am: install-dvi: install-dvi-recursive +install-dvi-am: + install-exec-am: install-html: install-html-recursive +install-html-am: + install-info: install-info-recursive +install-info-am: + install-man: install-pdf: install-pdf-recursive +install-pdf-am: + install-ps: install-ps-recursive +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-recursive @@ -654,24 +817,24 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-lzma dist-shar dist-tarZ dist-zip distcheck \ - distclean distclean-generic distclean-hdr distclean-libtool \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am libtool: $(LIBTOOL_DEPS) $(SHELL) ./config.status --recheck @@ -680,6 +843,7 @@ ChangeLog: svn2cl --group-by-day --stdout --include-rev --reparagraph \ | perl -pe 's/ rousseau/ Ludovic Rousseau/; \ s+trunk/Drivers/ccid/++g;' > $@ + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/ccid/ccid/README b/ccid/ccid/README index 061269b..2e4309a 100644 --- a/ccid/ccid/README +++ b/ccid/ccid/README @@ -1,10 +1,13 @@ USB CCID IFD Handler ==================== - This package provides the source code for a generic USB CCID -(Chip/Smart Card Interface Devices) driver. See [1] for the USB CCID -specifications from the USB working group. +This package provides the source code for a generic USB CCID (Chip/Smart +Card Interface Devices) and ICCD (Integrated Circuit(s) Card Devices) +driver. See the USB CCID [1] and ICCD [2] specifications from the USB +working group. +[1] http://www.usb.org/developers/devclass_docs/DWG_Smart-Card_CCID_Rev110.pdf +[2] http://www.usb.org/developers/devclass_docs/DWG_Smart-Card_USB-ICC_ICCD_rev10.pdf Authors: ======== @@ -16,202 +19,42 @@ Authors: directory. I (Ludovic Rousseau) greatly improved this code. -Supported CCID readers: -======================= - -(in alphabetical order) -- ActivCard USB reader 3.0 -- ActivCard Activkey Sim [66] -- Advanced Card Systems ACR 38U-CCID [16] - old versions of this reader have a bug: the reader do timeout when a - special USB frame is sent from the reader. If the frame size if a - multiple of wMaxPacketSize the communication is stopped. -- Alcor Micro AU9520 [46] - Firmware 1.01 is bogus. The time request sent by the card is not - forwarded by the reader to the host. -- Athena ASE IIIe USB V2 [29] -- Athena ASE IIIe KB USB [42] -- Blutronics Bludrive II CCID -- C3PO LTC31 (new model, USB product id 0x0006) [8] -- Cherry XX33 keyboard [?] -- Cherry XX44 keyboard (SmartBoard G83-6744) [18] -- Cherry SmartTerminal ST2000U [35] -- Cherry ST-1044U [27] -- Covadis Alya [63] -- Dell keyboard SK-3106 [?] -- Dell smart card reader keyboard [?] -- Eutron CryptoIdentity [26] -- Eutron Digipass 860 [59] -- Eutron SIM Pocket Combo [25] -- Eutron Smart Pocket [58] -- Gemalto GemPC 433 SL [2] (old name: GemPC 433 SL) -- Gemalto GemPC Card [41] -- Gemalto GemPC PinPad [67] -- Gemalto GemPC Twin [4] -- Gemalto GemCore POS Pro -- Gemalto GemCore SIM Pro -- Gemalto USB Shell Token V2 [3] (old name GemPC Key) -- Kobil KAAN Base [19] -- Kobil KAAN Advanced [20] -- Kobil KAAN SIM III [21] -- Kobil EMV TriCAP Reader [68] -- Kobil KAAN TriB@nk [69] -- Kobil SecOVID Reader III [70] -- Lexar Smart Enterprise Guardian [71] -- OmniKey CardMan 3121 [5] -- RSA SecureID SID800 [50] -- SCM Micro SCR 331 [6] - You shall upgrade the firmware [17] using version 5.18 or later. -- SCM Micro SCR 331-DI [11] - You shall upgrade the firmware [17] using version 6.22 or later. -- SCM Micro SCR 3310 [30] -- SCM Micro SCR 3311 [31] -- SCM Micro SCR 335 [7] - The firmware of this reader can't be upgraded so be sure to buy a - recent model with firmware 5.14 or later -- SCM Micro SCR 355 -- SCM Micro SPR 532 [9] - You shall contact Torsten Maykranz to get a - firmware upgrade. -- SmartEpad (v 2.0) [32] - The firmware gives a very strange description of the reader (like a - dwDefaultClock: 1024.000 MHz). So do not expect a perfect behavior. -- Verisign Secure Storage Token [24] -- Verisign Secure Token [?] -- Xiring Teo [52] -- Xiring Xi Sign PKI [76] - - -Should work but untested by me: -=============================== - -I would like to get these readers to perform test and validation and -move them in the supported list above. If you are one of the -manufacturers, please, contact me. - -- Advanced Card Systems ACR122 [62] -- Advanced Card Systems ACR122U PICC Interface -- Aktiv Rutoken Magistra -- Aladdin eToken PRO USB 72K Java [73] -- Axalto Reflex USB v3 [38] -- Atmel AT91SO [74] -- Atmel AT98SC032CT [77] -- C3PO LTC32 [13] -- C3PO TLTC2USB -- C3PO KBR36 -- Charismathics token -- Cherry SmartBoard, G83-6610 [61] -- Cherry SmartTerminal ST-1200USB -- Covadis Véga [64] -- Gemalto GemPC Express -- Gemalto Gem e-Seal Pro -- Fujitsu Siemens Computers SmartCard USB 2A [53] -- Fujitsu Siemens Computers SmartCard Keyboard USB 2A [54] -- Gemalto PDT -- Giesecke & Devrient StarSign Card Token 350 (ICCD) [57] -- Giesecke & Devrient StarSign Card Token 550 (ICCD) -- HP USB Smart Card Keyboard [44] -- HP USB Smartcard Reader -- HP MFP Smart Card Reader -- id3 Semiconductors CL1356D [45] (tested by me but I don't have the - reader anymore) -- id3 Semiconductors CL1356T [48] (it should be the same firmware as the - CL1356D) -- id3 Semiconductors CL1356A HID -- iMONO 43 in 1 + Sim + Smart Card Reader -- KONA USB SmartCard -- Lenovo Integrated Smart Card Reader -- Lexar/Gemalto Smart Enterprise Guardian [60] -- MSI StarReader SMART [75] -- O2Micro Oz776 (0x7762 and 0x7772 versions) -- Oberthur ID-One Cosmo Card -- OmniKey CardMan 1021 -- OmniKey CardMan 3021 [49] -- OmniKey CardMan 3621 [43] -- OmniKey CardMan 3821 [37] -- OmniKey CardMan 4321 [55] -- OmniKey CardMan 5121 [33] -- OmniKey CardMan 5125 [51] -- OmniKey CardMan 5321 [56] -- OmniKey CardMan 6121 [36] -- Philips JCOP41V221 -- Philips SmartMX (Rainbow/SafeNet Key 4000?) -- Precise Biometrics 200 MC -- Precise Biometrics 250 MC -- Raritan D2CIM-DVUSB VM/CCID -- SchlumbergerSema Cyberflex Access e-gate ICCD -- SCM Micro SCR 331-DI NTTCom [23] -- SCM Micro SCR 3310-NTTCOM [28] -- SCM Micro SCR 3320 [31b] -- SCM Micro SCR 333 [15] -- SCM Micro SCR 3340 ExpressCard54 [34] -- SCM Micro SDI 010 [39] -- Silitek SK-3105 keyboard [12] or C3PO TLTC2USB [14] -- Sitecom USB simcard reader MD-010 -- SpringCard CrazyWriter -- SpringCard CSB6 Basic -- SpringCard CSB6 Secure -- SpringCard CSB6 Ultimate [72] -- SpringCard EasyFinger Standard -- SpringCard EasyFinger Ultimate -- SpringCard Prox'N'Roll -- TianYu CCID SmartKey -- Validy USB Token [65] -- Vasco DP905 -- VMware Virtual USB CCID -- Winbond Electronics (for OEM only) [40] - - -Unsupported or partly supported CCID readers: -============================================= - -- ActivCard USB reader 2.0 [10] - The reader do timeout when a special USB frame is sent from the - reader. If the frame size if a multiple of wMaxPacketSize the - communication is stopped. -- Broadcom Corp 5880 (found in Dell E6500 laptop) - No communication to the device ("Resource temporarily unavailable" - error) -- C3PO LTC31 (old model, USB product id 0x0003) [8] - The reader works fine with Linux kernel 2.4 but does not with Linux - kernel 2.6. The ioctl() syscall returns EINVAL (Invalid argument) -- iDream (THRC2002-2) [47] - PPS fails with a Cryptoflex card - powerup fails with a Setcos card - does work with the belgium eID (the reader is sold for this - application) -- jNet Technology jToken s1 - Reader does not respond at all -- Kobil mIDentity [22] - Time requests are not managed correctly and make the firmware fails. - This is not a problem unless you use a time-consuming APDU like RSA - key generation. - A new firmware will correct the bug. -- Reiner-SCT cyberJack pinpad(a) - Time requests are not managed and the driver may time out without - any response from the reader. This is not a problem unless you use - a time-consuming APDU like RSA key generation. +CCID and ICCD readers: +====================== + +A reader can be in one of these list: +- supported + See http://pcsclite.alioth.debian.org/ccid/supported.html +- should working + See http://pcsclite.alioth.debian.org/ccid/shouldwork.html +- unsupported + See http://pcsclite.alioth.debian.org/ccid/unsupported.html +- disabled + See http://pcsclite.alioth.debian.org/ccid/disabled.html Supported operating systems: ============================ -- GNU/Linux (libusb 0.1.7) -- MacOS X/Darwin (libusb 0.1.8beta, CVS snapshot. See "Known problems") - to libusb) +- GNU/Linux (libusb 1.0) +- MacOS X/Darwin (libusb 1.0) + +See also http://pcsclite.alioth.debian.org/ccid.html for more +information. Debug informations: =================== The driver uses the debug function provided by pcscd. So if pcscd sends -its debug to stderr (pcscd --foreground) then the CCID will also send -its debug to stderr. If pcscd sends its debug to syslog (by default) -then the CCID will also send its debug to syslog. +its debug to stdout (pcscd --foreground) then the CCID driver will also +send its debug to stdout. If pcscd sends its debug to syslog (by +default) then the CCID driver will also send its debug to syslog. You can change the debug level using the Info.plist configuration file. The Info.plist is installed, by default, in /usr/local/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist +or set the environment variable LIBCCID_ifdLogLevel. The debug level is set in the ifdLogLevel field. It is a binary OR combinaison of 4 different levels. @@ -234,19 +77,19 @@ replug your readers. You can also restart pcscd. Voltage selection ================= -You can change the voltage level using the Info.plist configuration file. The -Info.plist is installed, by default, in +You can change the voltage level using the Info.plist configuration +file. The Info.plist is installed, by default, in /usr/local/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist The voltage level is set in the ifdDriverOptions field. It is a binary OR combinaison of 4 different levels. - 0: power on the card at 5V (default value) -- 16: power on the card at 3V and then, if 3V fails then use 5V +- 16: power on the card at 3V and, if 3V fails then use 5V - 32: power on the card at 1.8V, then 3V and then 5V - 48: let the reader decide -By default the voltage level is set to 0 and correspond to 5V. +By default the voltage level is set to 0 and correspond to 5V. You have to restart the driver so it read the configuration file again and use the new debug level value. To restart the driver you just need @@ -254,18 +97,6 @@ to unplug all your CCID readers so the the driver is unloaded and then replug your readers. You can also restart pcscd. -Known problems: -=============== - -MacOSX libusb -""""""""""""" - There is a bug in libusb that crash the libusb library when you - unplug a reader and replug it in another USB socket. So if you - unplug a reader replug it in the same USB socket. - - see http://sourceforge.net/tracker/index.php?func=detail&aid=886778&group_id=1674&atid=101674 - - Licence: ======== @@ -287,11 +118,368 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. History: ======== +1.4.14 - 25 NOvember 2013, Ludovic Rousseau + - Add support of + . Gemalto GemCore SIM Pro firmware 2.0 (using USB) + - report FEATURE_IFD_PIN_PROPERTIES only for pinpad readers + - Generalize the management of (old) readers with bDeviceClass = 0xFF + - some minor bugs removed + + +1.4.13 - 9 October 2013, Ludovic Rousseau + - Add support of + . Access IS ePassport Reader + . Planeta RC700-NFC CCID + - Add support of Windows value for CM_IOCTL_GET_FEATURE_REQUEST + Windows uses 0x313520 for SCARD_CTL_CODE(3400) pcsc-lite uses + 0x42000D48 for SCARD_CTL_CODE(3400) + RDP aplications (like rdesktop) will convert SCardControl() + commands from a Windows application (so using 0x313520) to + pcsc-lite. + - fix multi-slot support for card movement notification (introduced + in 1.4.12) + - Mac OS X: differentiate each libccid library by the dynamic linker + using --prefix=/fake/$BUNDLE_ID + - some minor bugs removed + + +1.4.12 - 12 August 2013, Ludovic Rousseau + - Add support of + . HID OMNIKEY 5127 CK + . HID OMNIKEY 5326 DFR + . HID OMNIKEY 5427 CK + . Ingenico WITEO USB Smart Card Reader (Base and Badge) + . SecuTech SecuTech Token + - Add support of card movement notifications for multi-slot readers + - Check libusb is at least at version 1.0.8 + - Get the serialconfdir value from pcsc-lite pkg config instead of + using $(DESTDIR)/$(sysconfdir)/reader.conf.d/ + - Disable class driver on Mac OS X + - Update the bundle name template to include the vendor name + - some minor bugs removed + + +1.4.11 - 12 June 2013, Ludovic Rousseau + - Add support of + . Gemalto IDBridge CT30 + . Gemalto IDBridge K30 + . SCM Microsystems Inc. SCL010 Contactless Reader + . SCM Microsystems Inc. SDI011 Contactless Reader + . THRC reader + - Better management of time extension requests + - parse: better support of devices with bInterfaceClass = 0xFF + - udev rule file: Remove setting group to pcscd, remove support of + Linux kernel < 2.6.35 for auto power up management + - some minor bugs removed + + +1.4.10 - 16 April 2013, Ludovic Rousseau + - Add support of + . ACS APG8201 USB Reader with PID 0x8202 + . GIS Ltd SmartMouse USB + . Gemalto IDBridge K3000 + . Identive CLOUD 2700 F Smart Card Reader + . Identive CLOUD 2700 R Smart Card Reader + . Identive CLOUD 4500 F Dual Interface Reader + . Identive CLOUD 4510 F Contactless + SAM Reader + . Identive CLOUD 4700 F Dual Interface Reader + . Identive CLOUD 4710 F Contactless + SAM Reader + . Inside Secure AT90SCR050 + . Inside Secure AT90SCR100 + . Inside Secure AT90SCR200 + . SCR3310-NTTCom USB SmartCard Reader + . SafeTech SafeTouch + . SpringCard H512 Series + . SpringCard H663 Series + . SpringCard NFC'Roll + . Yubico Yubikey NEO CCID + . Yubico Yubikey NEO OTP+CCID + - Add support of time extension for Escape commands + + +1.4.9 - 16 January 2013, Ludovic Rousseau + - Add support of + . Aktiv Rutoken PINPad In + . Aktiv Rutoken PINPad Ex + . REINER SCT cyberJack go + - Info.plist: Correctly handle reader names containing & + + +1.4.8 - 22 June 2012, Ludovic Rousseau + - Add support of + . SCR3310-NTTCom USB (was removed in version 1.4.6) + . Inside Secure VaultIC 420 Smart Object + . Inside Secure VaultIC 440 Smart Object + - Wait up to 3 seconds for reader start up + - Add support of new PC/SC V2 part 10 properties: + . dwMaxAPDUDataSize + . wIdVendor + . wIdProduct + - Use helper functions from libPCSCv2part10 to parse the PC/SC v2 + part 10 features + + +1.4.7 - 22 June 2012, Ludovic Rousseau + - Add support of + . ACS ACR101 ICC Reader + . ACS CryptoMate64 + . Alcor Micro AU9522 + . Bit4id CKey4 + . Bit4id cryptokey + . Bit4id iAM + . Bit4id miniLector + . Bit4id miniLector-s + . CCB eSafeLD + . Gemalto Ezio Shield Branch + . KOBIL Systems IDToken + . NXP PR533 + - KOBIL Systems IDToken special cases: + . Give more time (3 seconds instead of 2) to the reader to answer + . Hack for the Kobil IDToken and Geman eID card. The German eID + card is bogus and need to be powered off before a power on + . Add Reader-Info-Commands special APDU/command + - Manufacturer command + - Product name command + - Firmware version command + - Driver version command + - Use auto suspend for CCID devices only (Closes Alioth bug + [#313445] "Do not activate USB suspend for composite devices: + keyboard") + - Fix some error management in the T=1 TPDU state machine + - some minor bugs removed + - some minor improvements added + + +1.4.6 - 6 April 2012, Ludovic Rousseau + - Add support of + . Avtor SC Reader 371 + . Avtor SecureToken + . DIGIPASS KEY 202 + . Fujitsu SmartCase KB SCR eSIG + . Giesecke & Devrient StarSign CUT + . Inside Secure VaultIC 460 Smart Object + . Macally NFC CCID eNetPad reader + . OmniKey 6321 USB + . SCM SDI 011 + . Teridian TSC12xxF + . Vasco DIGIPASS KEY 101 + - Remove support of readers without a USB CCID descriptor file + . 0x08E6:0x34C1:Gemalto Ezio Shield Secure Channel + . 0x08E6:0x34C4:Gemalto Ezio Generic + . 0x04E6:0x511A:SCM SCR 3310 NTTCom + . 0x0783:0x0008:C3PO LTC32 USBv2 with keyboard support + . 0x0783:0x9002:C3PO TLTC2USB + . 0x047B:0x020B:Silitek SK-3105 + - Disable SPE for HP USB CCID Smartcard Keyboard. The reader is + bogus and unsafe. + - Convert "&" in a reader name into "&" to fix a problem on Mac + OS X + - Fix a problem with ICCD type A devices. We now wait for device ready + - Secure PIN Verify and PIN Modify: set the minimum timeout to 90 + seconds + - Add support of wIdVendor and wIdProduct properties + - Add support of dwMaxAPDUDataSize + - Add support of Gemalto firmware features + - some minor bugs removed + + +1.4.5 - 11 October 2011, Ludovic Rousseau + - Add support of + . Alcor Micro AU9540 + . BIFIT USB-Token iBank2key + . BIFIT iBank2Key + . Gemalto Ezio Shield PinPad reader + . Gemalto SA .NET Dual + . Precise Sense MC reader (with fingerprint) + . SDS DOMINO-Key TWIN Pro + . Ubisys 13.56MHz RFID (CCID) + - Add support of bPPDUSupport and FEATURE_CCID_ESC_COMMAND + - SCARD_ATTR_VENDOR_NAME and SCARD_ATTR_VENDOR_IFD_VERSION are not + the vendor name and version of the driver but of the IFD: + InterFace Device i.e. the smart card reader. We then return the + USB iManufacturer string as SCARD_ATTR_VENDOR_NAME and USB + bcdDevice as SCARD_ATTR_VENDOR_IFD_VERSION + - reduce binary size bu removing unused features from simclist + - Fix some warnings reported bu Coverity + + +1.4.4 - 13 May 2011, Ludovic Rousseau + - Add support of + . Gemalto Ezio CB+ + . Gemalto Ezio Generic + . Gemalto Ezio Shield + . Gemalto Ezio Shield PinPad + . Gemalto Ezio Shield Secure Channel + - Activate USB automatic power suspend. The Linux kernel should + power off the reader automatically if it is not used (pcscd is not + running). + - Add support of TLV Properties wLcdMaxCharacters and wLcdMaxLines. + They just duplicate wLcdLayout + - some minor bugs removed + + +1.4.3 - 2 April 2011, Ludovic Rousseau + - Add support of + . Feitian ePass2003 readers + . Neowave Weneo + . SCM SCL011 + . Vasco DIGIPASS 920 + - use :libudev: instead of :libhal: naming scheme. + - Do not install RSA_SecurID_getpasswd and Kobil_mIDentity_switch + and the associated documentation. + - the Secure Pin Entry of the HP USB Smart Card Keyboard is bogus so + disable it + - some minor bugs removed + + +1.4.2 - 22 February 2011, Ludovic Rousseau + - Add support of + . ACS APG8201 PINhandy 1 + . Aktiv Rutoken lite readers + . Feitian SCR310 reader (also known as 301v2) + . Oberthur ID-ONE TOKEN SLIM v2 + . Vasco DIGIPASS KEY 200 + . Vasco DIGIPASS KEY 860 + . Xiring Leo v2 + . Xiring MyLeo + . new Neowave Weneo token + - Add back support of "bogus" Oz776, REINER SCT and BLUDRIVE II + - Ease detection of OpenCT by pcsc-lite + - disable use of interrupt card events for multi slots readers (the + algorithm is bogus and can't be used) + - fix minor problems detected by the clang tool + - some minor bugs removed + + +1.4.1 - 3 December 2010, Ludovic Rousseau + - Add support of + . Akasa AK-CR-03, BZH uKeyCI800-K18 + . Free Software Initiative of Japan Gnuk token readers + . Gemalto Smart Guardian (SG CCID) + . ReinerSCT cyberJack RFID basis + - Remove O2 Micro Oz776 and Blutronics Bludrive II CCID since they + are no more supported since version 1.4.0 + - SecurePINVerify() & SecurePINModify(): Accept big and little + endian byte orders for multibytes fields. The application + should not use HOST_TO_CCID_16() and HOST_TO_CCID_32() any more + and just use the normal byte order of the architecture. + - Need pcsc-lite 1.6.5 for TAG_IFD_POLLING_THREAD_WITH_TIMEOUT + - Add --enable-embedded (default is no) to build libccid for an + embedded system. This will activate the NO_LOG option to disable + logging and limit RAM and disk consumption. + - Remove --enable-udev option since it is not used anymore with + libhal. The udev rules file is now used to change the access + rights of the device and not send a hotplug signal to pcscd. + See http://ludovicrousseau.blogspot.com/2010/09/pcscd-auto-start.html + - some minor bugs removed + + +1.4.0 - 4 August 2010, Ludovic Rousseau + - add support of + . ACS AET65 + . Broadcom 5880 + . C3PO LTC36 + . Dectel CI692 + . Gemalto Hybrid Smartcard Reader + . Kingtrust Multi-Reader + . Tianyu Smart Card Reader + . Todos CX00 + - Add support of the SCM SDI 010 again. At least the contact + interface can be used. + - Use libusb-1.0 instead of libusb-0.1 + - add support of TAG_IFD_STOP_POLLING_THREAD and use of the + asynchronous libusb API to be able to stop a transfer. + - Request pcsc-lite 1.6.2 minimum (instead of 1.6.0) to have + TAG_IFD_STOP_POLLING_THREAD defined + - The O2MICRO OZ776 patch (for OZ776, OZ776_7772, REINER_SCT and + BLUDRIVEII_CCID) is no more supported with libusb-1.0 + - correctly get the IFSC from the ATR (ATR parsing was not always + correct) + - some minor bugs removed + + +1.3.13 - 4 June 2010, Ludovic Rousseau + - much faster warm start (up to 3.8 second gained) + - Add support of SCARD_ATTR_VENDOR_IFD_SERIAL_NO to get the serial + number of the USB device + - some minor bugs removed + + +1.3.12 - 8 May 2010, Ludovic Rousseau + - add support of + . Ask CPL108 + . Atmel AT90SCR050 + . Atmel AT90SCR100 + . Atmel VaultIC420 + . Atmel VaultIC440 + . Atmel VaultIC460 + . Cherry SmartTerminal XX7X + . Covadis Auriga + . German Privacy Foundation Crypto Stick v1.2 + . GoldKey PIV Token + . KOBIL Smart Token + . KOBIL mIDentity 4smart + . KOBIL mIDentity 4smart AES + . KOBIL mIDentity 4smart fullsize AES + . KOBIL mIDentity fullsize + . KOBIL mIDentity visual + . SCM SCR3500 + . Smart SBV280 + . Todos AGM2 CCID + . Vasco DIGIPASS KEY 200 + . Vasco DIGIPASS KEY 860 + . Vasco DP855 + . Vasco DP865 + . id3 CL1356T5 + - remove support of Smart SBV280 on manufacturer request. They use + libusb directly. + - remove support of SCM SDI 010 on manufacturer request since not + supported by my driver + - Enable the Broadcom 5880 reader. It should work after a firmware + upgrade. + - better support of Dell keyboard + - better support of multislot readers (like the GemCore SIM Pro) + - better support of SCM SCR3310 + - better support of ICCD version A devices + - The Covadis Véga-Alpha reader is a GemPC pinpad inside. So we use + the same code to: + . load the strings for the display + . avoid limitation of the reader + - IFDHControl(): the (proprietary) get firmware version escape + command is allowed with a Gemalto reader + . the (proprietary) switch interface escape command is allowed on + the Gemalto GemProx DU + . return IFD_ERROR_NOT_SUPPORTED instead of + IFD_COMMUNICATION_ERROR if the dwControlCode value is not + supported + . return IFD_ERROR_INSUFFICIENT_BUFFER when appropriate + - IFDHGetCapabilities(): add support of SCARD_ATTR_ICC_PRESENCE and + SCARD_ATTR_ICC_INTERFACE_STATUS + - support FEATURE_GET_TLV_PROPERTIES + - add support of IOCTL_FEATURE_GET_TLV_PROPERTIES bMinPINSize & + bMaxPINSize for Gemalto Pinpad V1 & Covadis Véga-Alpha + - support extended APDU of up to 64kB with APDU readers. + - get the language selected during Mac OS X installation as language + to use for Covadis Véga-Alpha and Gemalto GemPC PinPad pinpad + readers + - FEATURE_MCT_READER_DIRECT is also supported by the Kobil mIDentity + visual + - better support of Sun Studio CC + - some minor bugs removed + + 1.3.11 - 28 July 2009, Ludovic Rousseau - - add support of Raritan D2CIM-DVUSB VM/CCID, Feitian SCR301, - Softforum XecureHSM, 2 Neowave Weneo tokens, Synnix STD200, Aktiv - Rutoken ECP, Alcor Micro SCR001, ATMEL AT91SC192192CT-USB, - Panasonic USB Smart Card Reader 7A-Smart, Gemalto GemProx DU and SU + - add support of + . Raritan D2CIM-DVUSB VM/CCID + . Feitian SCR301 + . Softforum XecureHSM + . 2 Neowave Weneo tokens + . Synnix STD200 + . Aktiv Rutoken ECP + . Alcor Micro SCR001 + . ATMEL AT91SC192192CT-USB + . Panasonic USB Smart Card Reader 7A-Smart + . Gemalto GemProx DU and SU - remove support of Reiner-SCT cyberJack pinpad(a) on request of Reiner-SCT. You should user the Reiner-SCT driver instead - define CFBundleName to CCIDCLASSDRIVER so that non class drivers @@ -311,10 +499,15 @@ History: 1.3.10 - 7 March 2009, Ludovic Rousseau - - add support for MSI StarReader SMART, Noname reader (from - Omnikey), Xiring Xi Sign PKI, Realtek 43 in 1 + Sim + Smart Card - Reader, Atmel AT98SC032CT, Aktiv Rutoken Magistra, TianYu CCID - SmartKey, Precise Biometrics 200 MC and 250 MC + - add support for + . Aktiv Rutoken Magistra + . Atmel AT98SC032CT + . MSI StarReader SMART + . Noname reader (from Omnikey) + . Precise Biometrics 200 MC and 250 MC + . Realtek 43 in 1 + Sim + Smart Card Reader + . TianYu CCID SmartKey + . Xiring Xi Sign PKI - add a patch to support the bogus OpenPGP card (on board key generation sometimes timed out) - disable support of the contactless part of SDI010 and SCR331DI @@ -323,12 +516,22 @@ History: 1.3.9 - 18 November 2008, Ludovic Rousseau - - add support for Aladdin eToken PRO USB 72K Java, Cherry - SmartTerminal ST-1200USB, Atmel AT91SO, SpringCard Prox'N'Roll, - CSB6 Basic, EasyFinger Ultimate, CSB6 Ultimate, EasyFinger - Standard, CrazyWriter, CSB6 Secure, KONA USB SmartCard, HP MFP - Smart Card Reader, ACS ACR122U PICC, Gemalto PDT, VMware Virtual - USB CCID + - add support for + . ACS ACR122U PICC + . Aladdin eToken PRO USB 72K Java + . Atmel AT91SO + . CSB6 Basic + . CSB6 Secure + . CSB6 Ultimate + . Cherry SmartTerminal ST-1200USB + . CrazyWriter + . EasyFinger Standard + . EasyFinger Ultimate + . Gemalto PDT + . HP MFP Smart Card Reader + . KONA USB SmartCard + . SpringCard Prox'N'Roll + . VMware Virtual USB CCID - MacOSX/configure: do not overwrite PCSC_CFLAGS, PCSC_LIBS, LIBUSB_CFLAGS and LIBUSB_LIBS if already defined by the user - by default, link statically against libusb on Mac OS X @@ -341,7 +544,8 @@ History: 1.3.8 - 27 June 2008, Ludovic Rousseau - - add support for Oberthur ID-One Cosmo Card + - add support for + . Oberthur ID-One Cosmo Card - do not include the release number in the Info.plist to avoid a diff of a configuration file when upgrading the package. - do not fail compilation if libusb is not available @@ -351,8 +555,10 @@ History: 1.3.7 - 8 June 2008, Ludovic Rousseau - - add support for ActivCard Activkey Sim, Pro-Active CSB6 Ultimate, - id3 Semiconductors CL1356A HID + - add support for + . ActivCard Activkey Sim + . Pro-Active CSB6 Ultimate + . id3 Semiconductors CL1356A HID - src/parse: do not try to parse devices with bInterfaceClass=0xFF by default (use command line argument -p for proprietary class) - configure.in: check if libusb-0.1 is emulated by libusb-compat + @@ -364,8 +570,12 @@ History: 1.3.6 - 30 April 2008, Ludovic Rousseau - - add support for Covadis Alya, Covadis Véga, Precise Biometrics 250 - MC, Vasco DP905, Validy TokenA sl vt + - add support for + . Covadis Alya + . Covadis Véga + . Precise Biometrics 250 MC + . Validy TokenA sl vt + . Vasco DP905 - better support for the O2Micro OZ776, GemCore SIM Pro - the environment variable LIBCCID_ifdLogLevel overwrite the value of ifdLogLevel read from the Info.plist file @@ -719,88 +929,6 @@ History: - First public release -References: -=========== - -[1] http://www.usb.org/developers/devclass_docs/ccid_classspec_1_00a.pdf -[2] http://www.gemalto.com/products/pc_usb_sl/ -[3] http://www.gemalto.com/products/usb_shell_token_v2/ -[4] http://www.gemalto.com/products/pctwin/ -[5] http://www.omnikey.com/?id=products&tx_okprod_pi1[product]=21 -[6] http://scmmicro.com/security/view_product_en.php?PID=3 -[7] http://scmmicro.com/security/view_product_en.php?PID=11 -[8] http://www.c3po.es/ltc31.html -[9] http://scmmicro.com/security/view_product_en.php?PID=13 -[10] http://www.activcard.com/products/usb_reader.html -[11] http://www.scmmicro.com/security/SCR331-DI.html -[12] http://www.silitek.com/prod/getProduct.do?xml_id=4_2&menu_id=4_2_8&cid=1_8_5 -[13] http://www.c3po.es/ltc32.html -[14] http://www.c3po.es/tltc2usb.html -[15] http://scmmicro.com/security/view_product_en.php?PID=10 -[16] http://www.acs.com.hk/Product_Readers.asp?productID=107&PCate=Products_PC_Linked_SmartCard_Readers -[17] http://www.scmmicro.com/support/pcs_downloads.php -[18] http://www.cherrycorp.com/english/advanced-line/advanced-line_smartboard_g83-6744.htm -[19] http://www.kobil.com/e/products/smartcard/kaan-base.php -[20] http://www.kobil.com/e/products/smartcard/kaan-advanced.php -[21] http://www.kobil.com/d/products/smartcard/kaansim3.php -[22] http://www.kobil.com/e/products/index.php?s=midentity -[23] http://www.ntt.com/jpki/SCR331DI.html -[24] http://www.verisign.co.uk/products-services/security-services/unified-authentication/usb-tokens/ -[25] http://www.eutron.com/simpocket.asp -[26] http://www.cryptoidentity.eutron.com/eng/home.asp -[27] http://www.cherry.de/english/advanced-line/advanced_smartterminal_st-1044u.htm -[28] http://www.ntt.com/jpki/scr3310.html -[29] http://www.asedrive.com/product.asp?pid=1 -[30] http://scmmicro.com/security/view_product_en.php?PID=4 -[31] http://scmmicro.com/security/view_product_en.php?PID=5 -[31b] http://scmmicro.com/security/view_product_en.php?PID=6 -[32] http://www.smartepad.com.br/ -[33] http://www.omnikey.com/?id=products&tx_okprod_pi1[product]=37 -[34] http://scmmicro.com/security/view_product_en.php?PID=7 -[35] http://www.cherry.de/deutsch/advanced-line/advanced_smart_terminal_st-2000u.htm -[36] http://www.omnikey.com/index.php?id=products&tx_okprod_pi1[product]=29 -[37] http://www.omnikey.com/index.php?id=products&tx_okprod_pi1[product]=33 -[38] http://www.reflexreaders.com/Products/reflex_usbnew.html -[39] http://scmmicro.com/security/view_product_en.php?PID=19 -[40] http://www.winbond.com.tw/E-WINBONDHTM/partner/b_2_e_4.htm -[41] http://www.gemplus.com/products/gempc_card/ -[42] http://www.asedrive.com/product.asp?pid=2 -[43] http://www.omnikey.com/?id=products&tx_okprod_pi1[product]=31 -[44] http://h18000.www1.hp.com/products/quickspecs/12346_na/12346_na.HTML -[45] http://www.id3semiconductors.com/produits/cl1356D.htm -[46] http://www.alcormicro.com/products_detail.php?main_id=8&p_id=21 -[47] http://www.tai-hao.com/english/products_detail.php?main_id=4&second_id=13&p_id=53&now_rows=1 -[48] http://www.id3semiconductors.com/produits/cl1356T.htm -[49] http://www.omnikey.com/index.php?id=products&tx_okprod_pi1[product]=48 -[50] http://www.rsa.com/products/securid/datasheets/SID800_DS_0507.pdf -[51] http://www.omnikey.com/?id=products&tx_okprod_pi1[product]=39 -[52] http://www.teobyxiring.com/ -[53] http://www.fujitsu-siemens.com/solutions/business_solutions/security/security_products/smartcase_scr_usbex.html -[54] http://www.fujitsu-siemens.com/solutions/business_solutions/security/security_products/smartcase_kbpc_cx.html -[55] http://omnikey.aaitg.com/?id=products&tx_okprod_pi1[product]=50 -[56] http://omnikey.aaitg.com/?id=products&tx_okprod_pi1[product]=41 -[57] http://www.gi-de.com/portal/page?_pageid=42,126834&_dad=portal&_schema=PORTAL -[58] http://www.eutronsec.com/infosecurity/Contents/ProductLine/Details.aspx?IDProd=26&IDFamiglia=3 -[59] http://www.eutronsec.com/infosecurity/Contents/ProductLine/Details.aspx?IDProd=62&IDFamiglia=39 -[60] http://www.lexar.com/enterprise/ent_ppsd.html -[61] http://www.cherry.de/deutsch/produkte/chipkartentastaturen_g-6610.htm -[62] http://acs.com.hk/acr122.php -[63] http://covadis.ch/Alya.239.0.html -[64] http://covadis.ch/Vega.104.0.html -[65] http://www.validy.com/en/products/token/ -[66] http://www.actividentity.com/products/activkey_usb_tokens__home.php -[67] http://www.gemalto.com/products/pc_pinpad/ -[68] http://www.kobil.com/index.php?id=71&type=7&L -[69] http://www.kobil.com/index.php?id=555&type=7&L=0 -[70] http://www.kobil.com/index.php?id=128&type=7&L=1%22 -[71] http://www.lexar.com/enterprise/ent_ppsd.html -[72] http://www.springcard.com/products/csb6.html -[73] http://www.aladdin.com/etoken/devices/pro-usb.aspx -[74] http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3981 -[75] http://global.msi.com.tw/index.php?func=proddesc&maincat_no=132&prod_no=1411 -[76] http://www.xiring.com/pageLibre00012c0e.php -[77] http://www.atmel.com/dyn/products/product_card.asp?part_id=4063 - -$Id: README 4347 2009-07-28 20:52:50Z rousseau $ +$Id: README 6795 2013-11-25 18:09:17Z rousseau $ vim:ts=20 diff --git a/ccid/ccid/SCARDGETATTRIB.txt b/ccid/ccid/SCARDGETATTRIB.txt index 47654ca..e6c697a 100644 --- a/ccid/ccid/SCARDGETATTRIB.txt +++ b/ccid/ccid/SCARDGETATTRIB.txt @@ -31,15 +31,29 @@ supported attributes SCARD_ATTR_ATR_STRING ATR of the card +SCARD_ATTR_ICC_INTERFACE_STATUS + Single byte. Zero if smart card electrical contact is not active; + nonzero if contact is active. + +SCARD_ATTR_ICC_PRESENCE + Single byte indicating smart card presence: + 0 = not present + 1 = card present but not swallowed (applies only if reader supports + smart card swallowing) + 2 = card present (and swallowed if reader supports smart card swallowing) + 4 = card confiscated. + SCARD_ATTR_VENDOR_IFD_VERSION Vendor-supplied interface device version DWORD in the form 0xMMmmbbbb where MM = major version, mm = minor version, and bbbb = build number + It is the bcdDevice USB field. SCARD_ATTR_VENDOR_NAME - name of the IFD (driver) vendor + name of the IFD (reader) vendor. It is the iManufacturer USB field + (if any). SCARD_ATTR_MAXINPUT maximum size of an APDU supported by the reader. @@ -49,6 +63,9 @@ SCARD_ATTR_MAXINPUT for example). It is a problem for T=1 cards when the reader works in APDU mode instead of TPDU and for T=0 cards. +SCARD_ATTR_VENDOR_IFD_SERIAL_NO + reader serial number (if available). + Sample code =========== diff --git a/ccid/ccid/aclocal.m4 b/ccid/ccid/aclocal.m4 index e06e89f..b1244b2 100644 --- a/ccid/ccid/aclocal.m4 +++ b/ccid/ccid/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.10.2 -*- Autoconf -*- +# generated automatically by aclocal 1.14 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,15 +11,17 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, -[m4_warning([this file was generated for autoconf 2.63. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # @@ -46,8 +48,12 @@ To do so, use the procedure documented by the package, typically `autoreconf'.]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi @@ -60,7 +66,6 @@ if test -n "$PKG_CONFIG"; then AC_MSG_RESULT([no]) PKG_CONFIG="" fi - fi[]dnl ])# PKG_PROG_PKG_CONFIG @@ -69,34 +74,32 @@ fi[]dnl # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) + m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) - # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried fi[]dnl ])# _PKG_CONFIG @@ -138,16 +141,17 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - ifelse([$4], , [AC_MSG_ERROR(dnl + m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS @@ -155,29 +159,28 @@ $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) +_PKG_TEXT])[]dnl + ]) elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT -To get pkg-config, see .])], - [$4]) +To get pkg-config, see .])[]dnl + ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) + $3 fi[]dnl ])# PKG_CHECK_MODULES -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -189,10 +192,10 @@ fi[]dnl # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.10' +[am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.10.2], [], +m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -208,22 +211,82 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.10.2])dnl +[AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -242,7 +305,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you +# harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -268,26 +331,24 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 8 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -301,16 +362,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -320,7 +379,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -333,12 +392,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -346,8 +406,9 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -365,6 +426,16 @@ AC_CACHE_CHECK([dependency style of $depcc], if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -376,35 +447,49 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -437,7 +522,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -447,80 +532,85 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 4 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[# Autoconf 2.62 quotes --file arguments for eval, but not when files -# are listed without --file. Let's play safe and only enable the eval -# if we detect the quoting. -case $CONFIG_FILES in -*\'*) eval set x "$CONFIG_FILES" ;; -*) set x $CONFIG_FILES ;; -esac -shift -for mf -do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done done -done +} ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -529,7 +619,7 @@ done # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will +# is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -537,32 +627,23 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) - # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 13 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -575,7 +656,7 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.60])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -604,55 +685,121 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -AC_REQUIRE([AM_PROG_MKDIR_P])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi]) +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header @@ -675,7 +822,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -686,17 +833,22 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -710,21 +862,18 @@ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) -# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1998-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # AM_PROG_LEX # ----------- # Autoconf leaves LEX=: if lex or flex can't be found. Change that to a # "missing" invocation, for better error output. AC_DEFUN([AM_PROG_LEX], -[AC_PREREQ(2.50)dnl +[AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then @@ -734,42 +883,47 @@ fi]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) - AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST(MAINT)dnl + AC_SUBST([MAINT])dnl ] ) -AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) - # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -777,7 +931,7 @@ AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. @@ -787,24 +941,24 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) @@ -812,52 +966,14 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -865,73 +981,51 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# ------------------------------ +# -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- +# ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -942,47 +1036,126 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -992,9 +1165,85 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1002,27 +1251,27 @@ AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006 Free Software Foundation, Inc. +# Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1034,20 +1283,23 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -1057,80 +1309,120 @@ AC_DEFUN([_AM_SUBST_NOTMAKE]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR -m4_include([m4/acx_pthread.m4]) +m4_include([m4/as-ac-expand.m4]) +m4_include([m4/ax_pthread.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) diff --git a/ccid/ccid/ar-lib b/ccid/ccid/ar-lib new file mode 100755 index 0000000..fe2301e --- /dev/null +++ b/ccid/ccid/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2013 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <. # # This program is free software; you can redistribute it and/or modify @@ -17,8 +17,7 @@ scriptversion=2005-05-14.22 # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -29,21 +28,224 @@ scriptversion=2005-05-14.22 # bugs to or send patches to # . +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + case $1 in '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] -Wrapper for compilers which do not understand `-c -o'. -Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the -right script to run: please start by reading the file `INSTALL'. +right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF @@ -53,11 +255,13 @@ EOF echo "compile $scriptversion" exit $? ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; esac ofile= cfile= -eat= for arg do @@ -66,8 +270,8 @@ do else case $1 in -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - # So we strip `-o arg' only if arg is an object. + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) @@ -94,22 +298,22 @@ do done if test -z "$ofile" || test -z "$cfile"; then - # If no `-o' option was seen then we might have been invoked from a + # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no - # `.c' file was seen then we are probably linking. That is also + # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. -# Note: use `[/.-]' here to ensure that we don't use the same name +# Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break @@ -124,9 +328,9 @@ trap "rmdir '$lockdir'; exit 1" 1 2 15 ret=$? if test -f "$cofile"; then - mv "$cofile" "$ofile" + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then - mv "${cofile}bj" "$ofile" + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" @@ -138,5 +342,6 @@ exit $ret # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: diff --git a/ccid/ccid/config.guess b/ccid/ccid/config.guess index da83314..b79252d 100755 --- a/ccid/ccid/config.guess +++ b/ccid/ccid/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 -# Free Software Foundation, Inc. +# Copyright 1992-2013 Free Software Foundation, Inc. -timestamp='2009-04-27' +timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,26 +15,22 @@ timestamp='2009-04-27' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner. # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -56,8 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -139,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward @@ -170,7 +184,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null + | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? @@ -180,7 +194,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in fi ;; *) - os=netbsd + os=netbsd ;; esac # The OS release @@ -201,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} @@ -223,7 +241,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on @@ -269,7 +287,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead @@ -295,12 +316,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo s390-ibm-zvmoe exit ;; *:OS400:*:*) - echo powerpc-ibm-os400 + echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -333,6 +354,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" @@ -391,23 +415,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; @@ -477,8 +501,8 @@ EOF echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ @@ -491,7 +515,7 @@ EOF else echo i586-dg-dgux${UNAME_RELEASE} fi - exit ;; + exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; @@ -548,7 +572,7 @@ EOF echo rs6000-ibm-aix3.2 fi exit ;; - *:AIX:*:[456]) + *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 @@ -591,52 +615,52 @@ EOF 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac + esac ;; + esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + sed 's/^ //' << EOF >$dummy.c - #define _HPUX_SOURCE - #include - #include + #define _HPUX_SOURCE + #include + #include - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa @@ -656,7 +680,7 @@ EOF # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null + grep -q __LP64__ then HP_ARCH="hppa2.0w" else @@ -727,22 +751,22 @@ EOF exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd - exit ;; + exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd - exit ;; + exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd - exit ;; + exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd - exit ;; + exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; @@ -766,14 +790,14 @@ EOF exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} @@ -785,34 +809,39 @@ EOF echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; - *:Interix*:[3456]*) - case ${UNAME_MACHINE} in + *:Interix*:*) + case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; - EM64T | authenticamd | genuineintel) + authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) @@ -822,6 +851,9 @@ EOF [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we @@ -842,210 +874,157 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo cris-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) - echo frv-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - mips64:Linux:*:*) + mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU - #undef mips64 - #undef mips64el + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el + CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 + CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both @@ -1053,11 +1032,11 @@ EOF echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. + # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) @@ -1074,7 +1053,7 @@ EOF i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) @@ -1089,7 +1068,7 @@ EOF fi exit ;; i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. + # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; @@ -1117,13 +1096,13 @@ EOF exit ;; pc:*:*:*) # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp - exit ;; + exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; @@ -1158,8 +1137,8 @@ EOF /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ @@ -1182,7 +1161,7 @@ EOF rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) @@ -1202,10 +1181,10 @@ EOF echo ns32k-sni-sysv fi exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm @@ -1231,11 +1210,11 @@ EOF exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + echo mips-nec-sysv${UNAME_RELEASE} else - echo mips-unknown-sysv${UNAME_RELEASE} + echo mips-unknown-sysv${UNAME_RELEASE} fi - exit ;; + exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; @@ -1248,6 +1227,9 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1274,9 +1256,21 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) @@ -1290,7 +1284,10 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit ;; - NSE-?:NONSTOP_KERNEL:*:*) + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) @@ -1335,13 +1332,13 @@ EOF echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} + echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` + UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; @@ -1359,11 +1356,11 @@ EOF i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - eval $set_cc_for_build cat >$dummy.c < printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" + "" #endif - ); exit (0); + ); exit (0); #endif #endif diff --git a/ccid/ccid/config.h.in b/ccid/ccid/config.h.in index f960af9..a8bc752 100644 --- a/ccid/ccid/config.h.in +++ b/ccid/ccid/config.h.in @@ -1,4 +1,4 @@ -/* config.h.in. Generated from configure.in by autoheader. */ +/* config.h.in. Generated from configure.ac by autoheader. */ /* bundle directory name */ #undef BUNDLE @@ -6,10 +6,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H -/* Define to 1 if you have the declaration of `TAG_IFD_POLLING_THREAD', and to - 0 if you don't. */ -#undef HAVE_DECL_TAG_IFD_POLLING_THREAD - /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H @@ -22,6 +18,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUSB_H + /* Define to 1 if you have the `memcpy' function. */ #undef HAVE_MEMCPY @@ -31,6 +30,9 @@ /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT @@ -76,18 +78,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H -/* Define if usb_detach_kernel_driver_np() is available */ -#undef HAVE_USB_DETACH_KERNEL_DRIVER_NP - -/* Define to 1 if you have the header file. */ -#undef HAVE_USB_H - /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O +/* Disable logging support */ +#undef NO_LOG /* Name of package */ #undef PACKAGE @@ -104,6 +100,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION @@ -123,9 +122,6 @@ /* composite device are seen as multi-slots */ #undef USE_COMPOSITE_AS_MULTISLOT -/* use libusb usb_interrupt_read() instead of polling */ -#undef USE_USB_INTERRUPT - /* Version number of package */ #undef VERSION diff --git a/ccid/ccid/config.sub b/ccid/ccid/config.sub index a39437d..9633db7 100755 --- a/ccid/ccid/config.sub +++ b/ccid/ccid/config.sub @@ -1,44 +1,40 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 -# Free Software Foundation, Inc. +# Copyright 1992-2013 Free Software Foundation, Inc. -timestamp='2009-04-17' +timestamp='2013-08-10' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. @@ -72,8 +68,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -120,13 +115,18 @@ esac # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] @@ -149,10 +149,13 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; + -bluegene*) + os=-cnk + ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 @@ -167,10 +170,10 @@ case $os in os=-chorusos basic_machine=$1 ;; - -chorusrdb) - os=-chorusrdb + -chorusrdb) + os=-chorusrdb basic_machine=$1 - ;; + ;; -hiux*) os=-hiuxwe2 ;; @@ -215,6 +218,12 @@ case $os in -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; -lynx*) os=-lynxos ;; @@ -239,20 +248,27 @@ case $basic_machine in # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ + | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ | bfin \ - | c4x | clipper \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ + | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ + | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -270,32 +286,45 @@ case $basic_machine in | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ - | nios | nios2 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | or32 \ + | open8 \ + | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ + | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -305,6 +334,21 @@ case $basic_machine in basic_machine=mt-unknown ;; + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. @@ -319,25 +363,30 @@ case $basic_machine in # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ + | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ + | be32-* | be64-* \ | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ + | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -355,28 +404,34 @@ case $basic_machine in | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ - | nios-* | nios2-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ - | romp-* | rs6000-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ | tron-* \ - | v850-* | v850e-* | vax-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) @@ -401,7 +456,7 @@ case $basic_machine in basic_machine=a29k-amd os=-udi ;; - abacus) + abacus) basic_machine=abacus-unknown ;; adobe68k) @@ -467,11 +522,24 @@ case $basic_machine in basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; c90) basic_machine=c90-cray os=-unicos ;; - cegcc) + cegcc) basic_machine=arm-unknown os=-cegcc ;; @@ -503,7 +571,7 @@ case $basic_machine in basic_machine=craynv-cray os=-unicosmp ;; - cr16) + cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; @@ -661,7 +729,6 @@ case $basic_machine in i370-ibm* | ibm*) basic_machine=i370-ibm ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 @@ -719,8 +786,15 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; mingw32) - basic_machine=i386-pc + basic_machine=i686-pc os=-mingw32 ;; mingw32ce) @@ -755,10 +829,18 @@ case $basic_machine in ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; + msys) + basic_machine=i686-pc + os=-msys + ;; mvs) basic_machine=i370-ibm os=-mvs ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; ncr3000) basic_machine=i486-ncr os=-sysv4 @@ -823,6 +905,12 @@ case $basic_machine in np1) basic_machine=np1-gould ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; nsr-tandem) basic_machine=nsr-tandem ;; @@ -905,9 +993,10 @@ case $basic_machine in ;; power) basic_machine=power-ibm ;; - ppc) basic_machine=powerpc-unknown + ppc | ppcbe) basic_machine=powerpc-unknown ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown @@ -932,7 +1021,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1001,6 +1094,9 @@ case $basic_machine in basic_machine=i860-stratus os=-sysv4 ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; sun2) basic_machine=m68000-sun ;; @@ -1057,20 +1153,8 @@ case $basic_machine in basic_machine=t90-cray os=-unicos ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; tile*) - basic_machine=tile-unknown + basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) @@ -1140,6 +1224,9 @@ case $basic_machine in xps | xps100) basic_machine=xps100-honeywell ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; ymp) basic_machine=ymp-cray os=-unicos @@ -1237,9 +1324,12 @@ esac if [ x"$os" != x"" ] then case $os in - # First match some system type aliases - # that might get confused with valid system types. + # First match some system type aliases + # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; @@ -1260,22 +1350,23 @@ case $os in # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -kopensolaris* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ @@ -1283,7 +1374,7 @@ case $os in | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1322,7 +1413,7 @@ case $os in -opened*) os=-openedition ;; - -os400*) + -os400*) os=-os400 ;; -wince*) @@ -1371,7 +1462,7 @@ case $os in -sinix*) os=-sysv4 ;; - -tpf*) + -tpf*) os=-tpf ;; -triton*) @@ -1407,15 +1498,14 @@ case $os in -aros*) os=-aros ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; + -nacl*) + ;; -none) ;; *) @@ -1438,10 +1528,10 @@ else # system, and we'll never get to this point. case $basic_machine in - score-*) + score-*) os=-elf ;; - spu-*) + spu-*) os=-elf ;; *-acorn) @@ -1453,8 +1543,23 @@ case $basic_machine in arm*-semi) os=-aout ;; - c4x-* | tic4x-*) - os=-coff + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff ;; # This must come before the *-dec entry. pdp10-*) @@ -1474,14 +1579,11 @@ case $basic_machine in ;; m68000-sun) os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 ;; m68*-cisco) os=-aout ;; - mep-*) + mep-*) os=-elf ;; mips*-cisco) @@ -1490,6 +1592,9 @@ case $basic_machine in mips*-*) os=-elf ;; + or1k-*) + os=-elf + ;; or32-*) os=-coff ;; @@ -1508,7 +1613,7 @@ case $basic_machine in *-ibm) os=-aix ;; - *-knuth) + *-knuth) os=-mmixware ;; *-wec) @@ -1613,7 +1718,7 @@ case $basic_machine in -sunos*) vendor=sun ;; - -aix*) + -cnk*|-aix*) vendor=ibm ;; -beos*) diff --git a/ccid/ccid/configure b/ccid/ccid/configure index 00897b4..4fa3536 100755 --- a/ccid/ccid/configure +++ b/ccid/ccid/configure @@ -1,18 +1,20 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63 for ccid 1.3.11. +# Generated by GNU Autoconf 2.69 for ccid 1.4.14. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -20,23 +22,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -44,7 +38,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -55,7 +55,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -78,13 +78,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -94,15 +87,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -114,12 +108,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -131,330 +129,352 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - # CDPATH. -$as_unset CDPATH - +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST else - as_have_required=no + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes else - exitcode=1 - echo positional parameters were not saved. + as_have_required=no fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - case $as_dir in + as_found=: + case $as_dir in #( /*) for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi done;; esac + as_found=false done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } IFS=$as_save_IFS - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break fi - fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" -fi -fi +} # as_fn_mkdir_p +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error -exitcode=0 -if as_func_success; then - : +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. + as_expr=false fi -if as_func_ret_success; then - : +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. + as_basename=false fi -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname else - exitcode=1 - echo positional parameters were not saved. + as_dirname=false fi -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -468,262 +488,87 @@ test \$exitcode = 0") || { :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` - ;; -esac - -ECHO=${lt_ECHO-echo} -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<_LT_EOF -$* -_LT_EOF - exit 0 -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test -z "$lt_ECHO"; then - if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if { echo_test_string=`eval $cmd`; } 2>/dev/null && - { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null - then - break - fi - done - fi - - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : - else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - if test "X$ECHO" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - ECHO='print -r' - elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - ECHO='printf %s\n' - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - ECHO="$CONFIG_SHELL $0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null - then - break - fi - prev="$cmd" - done +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - ECHO=echo - fi - fi - fi - fi +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' fi +else + as_ln_s='cp -pR' fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false fi +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +SHELL=${CONFIG_SHELL-/bin/sh} -exec 7<&0 &1 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -738,14 +583,14 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='ccid' PACKAGE_TARNAME='ccid' -PACKAGE_VERSION='1.3.11' -PACKAGE_STRING='ccid 1.3.11' +PACKAGE_VERSION='1.4.14' +PACKAGE_STRING='ccid 1.4.14' PACKAGE_BUGREPORT='' +PACKAGE_URL='' ac_unique_file="src/ifdhandler.c" ac_default_prefix=/usr/local @@ -785,15 +630,18 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='LTLIBOBJS +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS LIBOBJS +sysconfdir_exp +bindir_exp +serialconfdir ccidtwindir usbdropdir bundle ac_aux_dir NOCLASS -UDEV_FALSE -UDEV_TRUE WITHOUT_PCSC_FALSE WITHOUT_PCSC_TRUE WITH_TWIN_SERIAL_FALSE @@ -801,11 +649,10 @@ WITH_TWIN_SERIAL_TRUE PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC -acx_pthread_config +ax_pthread_config SYMBOL_VISIBILITY WITH_LIBUSB_FALSE WITH_LIBUSB_TRUE -LIBUSBCONFIG LIBUSB_LIBS LIBUSB_CFLAGS DYN_LIB_EXT @@ -816,9 +663,9 @@ OTOOL LIPO NMEDIT DSYMUTIL -lt_ECHO +MANIFEST_TOOL RANLIB -AR +DLLTOOL OBJDUMP NM ac_ct_DUMPBIN @@ -831,7 +678,11 @@ EGREP GREP PCSC_LIBS PCSC_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH PKG_CONFIG +ac_ct_AR +AR LEXLIB LEX_OUTPUT_ROOT LEX @@ -840,6 +691,7 @@ CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE +am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -864,6 +716,10 @@ build_os build_vendor build_cpu build +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__untar am__tar AMTAR @@ -917,6 +773,7 @@ bindir program_transform_name prefix exec_prefix +PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -927,25 +784,27 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_maintainer_mode enable_dependency_tracking -enable_shared enable_static +enable_shared with_pic enable_fast_install with_gnu_ld +with_sysroot enable_libtool_lock enable_libusb -enable_usb_interrupt enable_composite_as_multislot enable_multi_thread enable_bundle enable_usbdropdir enable_twinserial enable_ccidtwindir +enable_serialconfdir enable_pcsclite -enable_udev enable_class +enable_embedded ' ac_precious_vars='build_alias host_alias @@ -957,6 +816,8 @@ LIBS CPPFLAGS CPP PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR PCSC_CFLAGS PCSC_LIBS LIBUSB_CFLAGS @@ -1023,8 +884,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -1069,8 +931,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1096,8 +957,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1301,8 +1161,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1318,8 +1177,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1349,17 +1207,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1368,7 +1226,7 @@ Try \`$0 --help' for more information." >&2 $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1376,15 +1234,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1407,8 +1263,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1422,8 +1277,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1438,11 +1291,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1481,13 +1332,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1513,7 +1362,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures ccid 1.3.11 to adapt to many kinds of systems. +\`configure' configures ccid 1.4.14 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1527,7 +1376,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1583,7 +1432,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ccid 1.3.11:";; + short | recursive ) echo "Configuration of ccid 1.4.14:";; esac cat <<\_ACEOF @@ -1591,18 +1440,21 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --disable-libusb do not use libusb - --enable-usb-interrupt force the use of USB interrupt even with an old - libusb --enable-composite-as-multislot composite device are seen as multi-slots --disable-multi-thread disable multi threading @@ -1613,16 +1465,22 @@ Optional Features: --enable-ccidtwindir=DIR directory to install the serial Twin driver (default to pcscd config or $(prefix)/pcsc/drivers/serial) + --enable-serialconfdir=dir + directory containing serial drivers (default to + pcscd config) --disable-pcsclite do not use pcsc-lite debug support - --enable-udev udev support for pcscd hotplug --disable-class remove the CCIDCLASSDRIVER from Info.plist + --enable-embedded limit RAM and CPU ressources by disabling features + (log) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command @@ -1630,10 +1488,14 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path PCSC_CFLAGS C compiler flags for PCSC, overriding pkg-config PCSC_LIBS linker flags for PCSC, overriding pkg-config LIBUSB_CFLAGS @@ -1643,6 +1505,7 @@ Some influential environment variables: Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. +Report bugs to the package provider. _ACEOF ac_status=$? fi @@ -1705,22 +1568,427 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ccid configure 1.3.11 -generated by GNU Autoconf 2.63 +ccid configure 1.4.14 +generated by GNU Autoconf 2.69 -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ccid $as_me 1.3.11, which was -generated by GNU Autoconf 2.63. Invocation command line was +It was created by ccid $as_me 1.4.14, which was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -1756,8 +2024,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done IFS=$as_save_IFS } >&5 @@ -1794,9 +2062,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1812,13 +2080,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args '$ac_arg'" + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1830,11 +2098,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -1843,13 +2109,13 @@ _ASBOX case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -1868,11 +2134,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -1885,11 +2149,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -1903,11 +2165,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -1921,46 +2181,53 @@ _ASBOX exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h +$as_echo "/* confdefs.h */" > confdefs.h + # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -1971,19 +2238,23 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -1991,7 +2262,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -2006,11 +2277,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -2020,17 +2291,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -2042,43 +2313,20 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi - - - - - - - - - - - - - - - - - - - - - - - - +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2105,9 +2353,7 @@ for ac_dir in . "$srcdir"/.; do fi done if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in . \"$srcdir\"/." >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in . \"$srcdir\"/." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -2119,7 +2365,7 @@ ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -am__api_version='1.10' +am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2135,10 +2381,10 @@ am__api_version='1.10' # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then +if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2146,11 +2392,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2158,7 +2404,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2187,7 +2433,7 @@ case $as_dir/ in ;; esac -done + done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -2203,7 +2449,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -2214,51 +2460,73 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi - + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$2" = conftest.file ) then # Ok. : else - { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -$as_echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2272,20 +2540,136 @@ program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then + if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2293,9 +2677,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2305,11 +2689,12 @@ do esac done done -done + done IFS=$as_save_IFS fi + test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2317,26 +2702,19 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then +if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2347,24 +2725,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2372,11 +2750,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2384,7 +2762,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2394,11 +2772,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2412,15 +2790,52 @@ else fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -2436,7 +2851,7 @@ fi # Define the identity of the package. PACKAGE='ccid' - VERSION='1.3.11' + VERSION='1.4.14' cat >>confdefs.h <<_ACEOF @@ -2464,119 +2879,111 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + # We need awk for the "check" target. The system "awk" is bad on # some platforms. -# Always define AMTAR for backward compatibility. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + -AMTAR=${AMTAR-"${am_missing_run}tar"} -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi +# silent build by default +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' # Default install dir @@ -2585,35 +2992,27 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Automake boilerplate. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then +if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && - { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -$as_echo "$as_me: error: invalid value of canonical build" >&2;} - { (exit 1); exit 1; }; };; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -2629,28 +3028,24 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then +if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -$as_echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -2672,16 +3067,17 @@ ac_config_headers="$ac_config_headers config.h" # Options -{ $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then +if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi - { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= @@ -2704,9 +3100,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2717,24 +3113,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2744,9 +3140,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2757,24 +3153,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2783,7 +3179,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2797,9 +3193,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2810,24 +3206,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2837,9 +3233,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2851,18 +3247,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -2881,10 +3277,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2896,9 +3292,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -2909,24 +3305,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2940,9 +3336,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -2953,24 +3349,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2983,7 +3379,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2994,57 +3390,37 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3060,8 +3436,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -3077,17 +3453,17 @@ do done rm -f $ac_rmfiles -if { (ac_try="$ac_link_default" +if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3104,7 +3480,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3123,84 +3499,41 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi - +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" +if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3215,32 +3548,83 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then +if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3252,17 +3636,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" +if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -3275,31 +3659,23 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then +if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3313,37 +3689,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -3352,20 +3707,16 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then +if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3376,35 +3727,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3415,36 +3742,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_compile "$LINENO"; then : - ac_c_werror_flag=$ac_save_c_werror_flag +else + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3455,42 +3758,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -3507,23 +3785,18 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then +if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -3575,32 +3848,9 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then + if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -3611,23 +3861,84 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main () +{ + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu + DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" @@ -3636,50 +3947,51 @@ ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then +if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3693,17 +4005,18 @@ fi depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then +if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3721,6 +4034,11 @@ else if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -3732,35 +4050,49 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -3784,7 +4116,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -3799,151 +4131,20 @@ else fi -if test "x$CC" != xcc; then - { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest2.$ac_objext && { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest2.$ac_objext && { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - -cat >>confdefs.h <<\_ACEOF -#define NO_MINUS_C_MINUS_O 1 -_ACEOF - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then + if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -3958,11 +4159,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -3971,300 +4168,113 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP +if ac_fn_c_try_cpp "$LINENO"; then : -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. -continue -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext done -IFS=$as_save_IFS +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi -rm -rf conftest.one conftest.two conftest.dir + done + ac_cv_prog_CPP=$CPP fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -4272,7 +4282,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -4282,23 +4292,23 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi -{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi @@ -4307,9 +4317,9 @@ for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LEX+set}" = set; then +if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then @@ -4320,24 +4330,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then - { $as_echo "$as_me:$LINENO: result: $LEX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4353,7 +4363,8 @@ a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } -e { yyless (input () != 0); } +e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ + yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% @@ -4366,20 +4377,20 @@ main (void) return ! yylex () + ! yywrap (); } _ACEOF -{ (ac_try="$LEX conftest.l" +{ { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ $as_echo "$as_me:$LINENO: checking lex output file root" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } -if test "${ac_cv_prog_lex_root+set}" = set; then +if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else @@ -4388,19 +4399,17 @@ if test -f lex.yy.c; then elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else - { { $as_echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 -$as_echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then - { $as_echo "$as_me:$LINENO: checking lex library" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } -if test "${ac_cv_lib_lex+set}" = set; then +if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else @@ -4408,55 +4417,29 @@ else ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_lex" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi -{ $as_echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } -if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then +if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the @@ -4465,52 +4448,25 @@ else ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" -cat >conftest.$ac_ext <<_ACEOF -#define YYTEXT_POINTER 1 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then -cat >>confdefs.h <<\_ACEOF -#define YYTEXT_POINTER 1 -_ACEOF +$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c @@ -4519,15 +4475,191 @@ fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + + + + + if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKG_CONFIG+set}" = set; then +if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in @@ -4540,14 +4672,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS ;; @@ -4555,10 +4687,10 @@ esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4568,9 +4700,9 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in @@ -4583,14 +4715,14 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS ;; @@ -4598,10 +4730,10 @@ esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4610,7 +4742,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4623,72 +4755,71 @@ fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 - { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi - fi # check pcsc-lite version -PCSC_NEEDED_VERSION="1.3.3" +PCSC_NEEDED_VERSION="1.8.3" if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libpcsclite\"") >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcsclite\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcsclite") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then pkg_failed=no -{ $as_echo "$as_me:$LINENO: checking for PCSC" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCSC" >&5 $as_echo_n "checking for PCSC... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$PCSC_CFLAGS"; then - pkg_cv_PCSC_CFLAGS="$PCSC_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libpcsclite >= \$PCSC_NEEDED_VERSION\"") >&5 +if test -n "$PCSC_CFLAGS"; then + pkg_cv_PCSC_CFLAGS="$PCSC_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcsclite >= \$PCSC_NEEDED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcsclite >= $PCSC_NEEDED_VERSION") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then pkg_cv_PCSC_CFLAGS=`$PKG_CONFIG --cflags "libpcsclite >= $PCSC_NEEDED_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$PCSC_LIBS"; then - pkg_cv_PCSC_LIBS="$PCSC_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libpcsclite >= \$PCSC_NEEDED_VERSION\"") >&5 +if test -n "$PCSC_LIBS"; then + pkg_cv_PCSC_LIBS="$PCSC_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcsclite >= \$PCSC_NEEDED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcsclite >= $PCSC_NEEDED_VERSION") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then pkg_cv_PCSC_LIBS=`$PKG_CONFIG --libs "libpcsclite >= $PCSC_NEEDED_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -4696,55 +4827,52 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - PCSC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libpcsclite >= $PCSC_NEEDED_VERSION"` + PCSC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpcsclite >= $PCSC_NEEDED_VERSION" 2>&1` else - PCSC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libpcsclite >= $PCSC_NEEDED_VERSION"` + PCSC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpcsclite >= $PCSC_NEEDED_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PCSC_PKG_ERRORS" >&5 - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } if test -f /usr/local/lib/pkgconfig/libpcsclite.pc -a "x$PKG_CONFIG" != x ; then - { { $as_echo "$as_me:$LINENO: error: use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure" >&5 -$as_echo "$as_me: error: use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure" "$LINENO" 5 else - { $as_echo "$as_me:$LINENO: WARNING: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&5 $as_echo "$as_me: WARNING: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&2;} fi elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if test -f /usr/local/lib/pkgconfig/libpcsclite.pc -a "x$PKG_CONFIG" != x ; then - { { $as_echo "$as_me:$LINENO: error: use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure" >&5 -$as_echo "$as_me: error: use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure" "$LINENO" 5 else - { $as_echo "$as_me:$LINENO: WARNING: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&5 $as_echo "$as_me: WARNING: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&2;} fi else PCSC_CFLAGS=$pkg_cv_PCSC_CFLAGS PCSC_LIBS=$pkg_cv_PCSC_LIBS - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - : + fi else - { $as_echo "$as_me:$LINENO: WARNING: libpcsclite not found by pkg-config" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libpcsclite not found by pkg-config" >&5 $as_echo "$as_me: WARNING: libpcsclite not found by pkg-config" >&2;} fi saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $PCSC_CFLAGS" +PCSC_ERROR_MSG="install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..." -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then +if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4755,10 +4883,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4775,7 +4903,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4790,26 +4918,24 @@ esac $ac_path_GREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then +if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4823,10 +4949,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4843,7 +4969,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4858,12 +4984,10 @@ esac $ac_path_EGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4871,21 +4995,17 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4900,48 +5020,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4951,18 +5046,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4972,14 +5063,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -5006,544 +5093,72 @@ main () return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -if test "${ac_cv_header_ifdhandler_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for ifdhandler.h" >&5 -$as_echo_n "checking for ifdhandler.h... " >&6; } -if test "${ac_cv_header_ifdhandler_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ifdhandler_h" >&5 -$as_echo "$ac_cv_header_ifdhandler_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking ifdhandler.h usability" >&5 -$as_echo_n "checking ifdhandler.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking ifdhandler.h presence" >&5 -$as_echo_n "checking ifdhandler.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: ifdhandler.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: ifdhandler.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for ifdhandler.h" >&5 -$as_echo_n "checking for ifdhandler.h... " >&6; } -if test "${ac_cv_header_ifdhandler_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_ifdhandler_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ifdhandler_h" >&5 -$as_echo "$ac_cv_header_ifdhandler_h" >&6; } - -fi -if test "x$ac_cv_header_ifdhandler_h" = x""yes; then - : -else - { { $as_echo "$as_me:$LINENO: error: ifdhandler.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..." >&5 -$as_echo "$as_me: error: ifdhandler.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..." >&2;} - { (exit 1); exit 1; }; } -fi - - -{ $as_echo "$as_me:$LINENO: checking whether IFD_NO_SUCH_DEVICE is declared" >&5 -$as_echo_n "checking whether IFD_NO_SUCH_DEVICE is declared... " >&6; } -if test "${ac_cv_have_decl_IFD_NO_SUCH_DEVICE+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef IFD_NO_SUCH_DEVICE - (void) IFD_NO_SUCH_DEVICE; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl_IFD_NO_SUCH_DEVICE=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl_IFD_NO_SUCH_DEVICE=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_IFD_NO_SUCH_DEVICE" >&5 -$as_echo "$ac_cv_have_decl_IFD_NO_SUCH_DEVICE" >&6; } -if test "x$ac_cv_have_decl_IFD_NO_SUCH_DEVICE" = x""yes; then - : -else - { { $as_echo "$as_me:$LINENO: error: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&5 -$as_echo "$as_me: error: install pcsc-lite $PCSC_NEEDED_VERSION or later" >&2;} - { (exit 1); exit 1; }; } -fi - -{ $as_echo "$as_me:$LINENO: checking whether TAG_IFD_POLLING_THREAD is declared" >&5 -$as_echo_n "checking whether TAG_IFD_POLLING_THREAD is declared... " >&6; } -if test "${ac_cv_have_decl_TAG_IFD_POLLING_THREAD+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef TAG_IFD_POLLING_THREAD - (void) TAG_IFD_POLLING_THREAD; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl_TAG_IFD_POLLING_THREAD=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl_TAG_IFD_POLLING_THREAD=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_TAG_IFD_POLLING_THREAD" >&5 -$as_echo "$ac_cv_have_decl_TAG_IFD_POLLING_THREAD" >&6; } -if test "x$ac_cv_have_decl_TAG_IFD_POLLING_THREAD" = x""yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_TAG_IFD_POLLING_THREAD 1 -_ACEOF - - -else - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_TAG_IFD_POLLING_THREAD 0 -_ACEOF - - -fi - - -if test "${ac_cv_header_reader_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for reader.h" >&5 -$as_echo_n "checking for reader.h... " >&6; } -if test "${ac_cv_header_reader_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_reader_h" >&5 -$as_echo "$ac_cv_header_reader_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking reader.h usability" >&5 -$as_echo_n "checking reader.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } +$as_echo "#define STDC_HEADERS 1" >>confdefs.h -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking reader.h presence" >&5 -$as_echo_n "checking reader.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - ac_header_preproc=no fi -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } +done -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: reader.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: reader.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: reader.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: reader.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: reader.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: reader.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: reader.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: reader.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: reader.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: reader.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: reader.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: reader.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: reader.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: reader.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: reader.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: reader.h: in the future, the compiler will take precedence" >&2;} - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for reader.h" >&5 -$as_echo_n "checking for reader.h... " >&6; } -if test "${ac_cv_header_reader_h+set}" = set; then - $as_echo_n "(cached) " >&6 +ac_fn_c_check_header_mongrel "$LINENO" "ifdhandler.h" "ac_cv_header_ifdhandler_h" "$ac_includes_default" +if test "x$ac_cv_header_ifdhandler_h" = xyes; then : + else - ac_cv_header_reader_h=$ac_header_preproc + as_fn_error $? "$PCSC_ERROR_MSG" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_reader_h" >&5 -$as_echo "$ac_cv_header_reader_h" >&6; } -fi -if test "x$ac_cv_header_reader_h" = x""yes; then - : + +ac_fn_c_check_header_mongrel "$LINENO" "reader.h" "ac_cv_header_reader_h" "$ac_includes_default" +if test "x$ac_cv_header_reader_h" = xyes; then : + else - { { $as_echo "$as_me:$LINENO: error: reader.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..." >&5 -$as_echo "$as_me: error: reader.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "$PCSC_ERROR_MSG" "$LINENO" 5 fi CPPFLAGS="$saved_CPPFLAGS" # Add libtool support. +# Static lib is disabled by default. Use --enable-static if needed case `pwd` in *\ * | *\ *) - { $as_echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac -macro_version='2.2.6' -macro_revision='1.3012' +macro_version='2.4.2' +macro_revision='1.3337' @@ -5559,9 +5174,78 @@ macro_revision='1.3012' ltmain="$ac_aux_dir/ltmain.sh" -{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then +if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ @@ -5569,7 +5253,7 @@ else ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - $as_unset ac_script || ac_script= + { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST @@ -5578,10 +5262,10 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue + as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in @@ -5598,7 +5282,7 @@ case `"$ac_path_SED" --version 2>&1` in $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" @@ -5613,19 +5297,17 @@ esac $ac_path_SED_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -5643,9 +5325,9 @@ Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; then +if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 @@ -5659,10 +5341,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue + as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in @@ -5679,7 +5361,7 @@ case `"$ac_path_FGREP" --version 2>&1` in $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" @@ -5694,12 +5376,10 @@ esac $ac_path_FGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP @@ -5707,7 +5387,7 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -5733,7 +5413,7 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then +if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no @@ -5742,7 +5422,7 @@ fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) @@ -5772,13 +5452,13 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi -if test "${lt_cv_path_LD+set}" = set; then +if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then @@ -5809,18 +5489,16 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - { $as_echo "$as_me:$LINENO: result: $LD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then +if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. @@ -5833,7 +5511,7 @@ case `$LD -v 2>&1 &5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -5845,9 +5523,9 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ $as_echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test "${lt_cv_path_NM+set}" = set; then +if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then @@ -5894,20 +5572,23 @@ else : ${lt_cv_path_NM=no} fi fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$ac_tool_prefix"; then - for ac_prog in "dumpbin -symbols" "link -dump -symbols" + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DUMPBIN+set}" = set; then +if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then @@ -5918,24 +5599,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5945,13 +5626,13 @@ fi fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in "dumpbin -symbols" "link -dump -symbols" + for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then @@ -5962,24 +5643,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -5992,7 +5673,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6000,6 +5681,15 @@ esac fi fi + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" @@ -6012,33 +5702,33 @@ test -z "$NM" && NM=nm -{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } -if test "${lt_cv_nm_interface+set}" = set; then +if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:6022: $ac_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:6025: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:6028: output\"" >&5) + (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments -{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } -if test "${lt_cv_sys_max_cmd_len+set}" = set; then +if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 @@ -6071,6 +5761,11 @@ else lt_cv_sys_max_cmd_len=8192; ;; + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. @@ -6096,6 +5791,11 @@ else lt_cv_sys_max_cmd_len=196608 ;; + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not @@ -6122,7 +5822,8 @@ else ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else @@ -6135,8 +5836,8 @@ else # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` @@ -6156,10 +5857,10 @@ else fi if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:$LINENO: result: none" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -6173,27 +5874,27 @@ max_cmd_len=$lt_cv_sys_max_cmd_len : ${MV="mv -f"} : ${RM="rm -f"} -{ $as_echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,, \ + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes -{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } -{ $as_echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes -{ $as_echo "$as_me:$LINENO: result: $lt_shell_append" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } @@ -6228,14 +5929,88 @@ esac -{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } -if test "${lt_cv_ld_reload_flag+set}" = set; then +if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in @@ -6244,6 +6019,11 @@ case $reload_flag in esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' @@ -6264,9 +6044,9 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then +if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then @@ -6277,24 +6057,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6304,9 +6084,9 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then @@ -6317,24 +6097,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6343,7 +6123,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6363,9 +6143,9 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } -if test "${lt_cv_deplibs_check_method+set}" = set; then +if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' @@ -6407,16 +6187,18 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; -cegcc) +cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' @@ -6442,7 +6224,7 @@ freebsd* | dragonfly*) fi ;; -gnu*) +haiku*) lt_cv_deplibs_check_method=pass_all ;; @@ -6454,11 +6236,11 @@ hpux10.20* | hpux11*) lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac @@ -6479,8 +6261,8 @@ irix5* | irix6* | nonstopux*) lt_cv_deplibs_check_method=pass_all ;; -# This must be Linux ELF. -linux* | k*bsd*-gnu) +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; @@ -6547,28 +6329,194 @@ sysv4 | sysv4.3*) siemens) lt_cv_deplibs_check_method=pass_all ;; - pc) - lt_cv_deplibs_check_method=pass_all + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO @@ -6577,11 +6525,13 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AR+set}" = set; then +if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then @@ -6592,36 +6542,40 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:$LINENO: result: $AR" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi + test -n "$AR" && break + done fi -if test -z "$ac_cv_prog_AR"; then +if test -z "$AR"; then ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then +if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then @@ -6632,49 +6586,109 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="ar" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi + + test -n "$ac_ct_AR" && break +done + if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi -else - AR="$ac_cv_prog_AR" fi -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + @@ -6684,9 +6698,9 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then +if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -6697,24 +6711,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6724,9 +6738,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -6737,24 +6751,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6763,7 +6777,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6783,9 +6797,9 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then +if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -6796,24 +6810,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6823,9 +6837,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -6836,24 +6850,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -6862,7 +6876,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -6887,15 +6901,27 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + @@ -6940,9 +6966,9 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then +if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else @@ -7003,8 +7029,8 @@ esac lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -7028,6 +7054,7 @@ for ac_symprfx in "" "_"; do # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ @@ -7040,6 +7067,7 @@ for ac_symprfx in "" "_"; do else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no @@ -7058,18 +7086,18 @@ void nm_test_func(void){} int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm - if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 - (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -7081,6 +7109,18 @@ _LT_EOF if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + #ifdef __cplusplus extern "C" { #endif @@ -7092,7 +7132,7 @@ _LT_EOF cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ -const struct { +LT_DLSYM_CONST struct { const char *name; void *address; } @@ -7118,19 +7158,19 @@ static const void *lt_preloaded_setup() { _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi @@ -7160,13 +7200,32 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:$LINENO: result: failed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else - { $as_echo "$as_me:$LINENO: result: ok" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + @@ -7181,15 +7240,45 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then +if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi @@ -7201,11 +7290,11 @@ case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" @@ -7219,12 +7308,12 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 7222 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) @@ -7258,11 +7347,11 @@ x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in @@ -7270,7 +7359,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) - LD="${LD-ld} -m elf_i386" + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" @@ -7311,9 +7407,9 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if test "${lt_cv_cc_needs_belf+set}" = set; then +if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c @@ -7322,11 +7418,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7337,38 +7429,13 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -7376,25 +7443,38 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; -sparc*-*solaris*) +*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" @@ -7410,15 +7490,132 @@ esac need_locks="$enable_libtool_lock" +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DSYMUTIL+set}" = set; then +if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then @@ -7429,24 +7626,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7456,9 +7653,9 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then @@ -7469,24 +7666,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7495,7 +7692,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7508,9 +7705,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_NMEDIT+set}" = set; then +if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then @@ -7521,24 +7718,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7548,9 +7745,9 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then @@ -7561,24 +7758,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7587,7 +7784,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7600,9 +7797,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIPO+set}" = set; then +if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then @@ -7613,24 +7810,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:$LINENO: result: $LIPO" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7640,9 +7837,9 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then @@ -7653,24 +7850,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7679,7 +7876,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7692,9 +7889,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL+set}" = set; then +if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then @@ -7705,24 +7902,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7732,9 +7929,9 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then @@ -7745,24 +7942,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7771,7 +7968,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7784,9 +7981,9 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL64+set}" = set; then +if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then @@ -7797,24 +7994,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { $as_echo "$as_me:$LINENO: result: $OTOOL64" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7824,9 +8021,9 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then @@ -7837,24 +8034,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -7863,7 +8060,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -7899,9 +8096,9 @@ fi - { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } -if test "${lt_cv_apple_cc_single_mod+set}" = set; then +if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no @@ -7917,7 +8114,13 @@ else $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 @@ -7926,22 +8129,19 @@ else rm -f conftest.* fi fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if test "${lt_cv_ld_exported_symbols_list+set}" = set; then +if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7952,43 +8152,53 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - lt_cv_ld_exported_symbols_list=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_ld_exported_symbols_list=no +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; @@ -8016,7 +8226,7 @@ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi - if test "$DSYMUTIL" != ":"; then + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -8024,62 +8234,13 @@ $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } ;; esac - for ac_header in dlfcn.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DLFCN_H 1 _ACEOF fi @@ -8088,37 +8249,30 @@ done -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then - enableval=$enable_shared; p=${PACKAGE-default} +# Set options +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; + yes) enable_static=yes ;; + no) enable_static=no ;; *) - enable_shared=no + enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then - enable_shared=yes + enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else - enable_shared=yes + enable_static=no fi @@ -8129,27 +8283,34 @@ fi - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then - enableval=$enable_static; p=${PACKAGE-default} + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; + yes) enable_shared=yes ;; + no) enable_shared=no ;; *) - enable_static=no + enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then - enable_static=yes + enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else - enable_static=yes + enable_shared=yes fi @@ -8161,9 +8322,25 @@ fi + # Check whether --with-pic was given. -if test "${with_pic+set}" = set; then - withval=$with_pic; pic_mode="$withval" +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac else pic_mode=default fi @@ -8178,7 +8355,7 @@ test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then +if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -8234,6 +8411,11 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + @@ -8259,9 +8441,9 @@ if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi -{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } -if test "${lt_cv_objdir+set}" = set; then +if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null @@ -8274,7 +8456,7 @@ else fi rmdir .libs 2>/dev/null fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir @@ -8289,19 +8471,6 @@ _ACEOF - - - - - - - - - - - - - case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some @@ -8314,23 +8483,6 @@ aix3*) ;; esac -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - # Global variables: ofile=libtool can_build_shared=yes @@ -8359,7 +8511,7 @@ for cc_temp in $compiler""; do *) break;; esac done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it @@ -8367,9 +8519,9 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then +if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in @@ -8420,10 +8572,10 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -8433,9 +8585,9 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:$LINENO: checking for file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then +if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in @@ -8486,10 +8638,10 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -8568,11 +8720,16 @@ if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac - { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no @@ -8588,15 +8745,15 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8591: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8595: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes @@ -8605,7 +8762,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then @@ -8625,8 +8782,6 @@ fi lt_prog_compiler_pic= lt_prog_compiler_static= -{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -8674,6 +8829,12 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='-fno-common' ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag @@ -8716,6 +8877,15 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='-fPIC' ;; esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in @@ -8757,7 +8927,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_static='-non_shared' ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -8778,7 +8948,13 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; - pgcc* | pgf77* | pgf90* | pgf95*) + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' @@ -8790,25 +8966,40 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' ;; esac ;; @@ -8840,7 +9031,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in - f77* | f90* | f95*) + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; @@ -8897,21 +9088,25 @@ case $host_os in lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac -{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -$as_echo "$lt_prog_compiler_pic" >&6; } - - - - +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if test "${lt_cv_prog_compiler_pic_works+set}" = set; then +if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no @@ -8927,15 +9122,15 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8930: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8934: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes @@ -8944,7 +9139,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then @@ -8964,13 +9159,18 @@ fi + + + + + # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test "${lt_cv_prog_compiler_static_works+set}" = set; then +if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no @@ -8983,7 +9183,7 @@ else if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes @@ -8996,7 +9196,7 @@ else LDFLAGS="$save_LDFLAGS" fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then @@ -9011,9 +9211,9 @@ fi - { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then +if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no @@ -9032,16 +9232,16 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9035: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:9039: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes @@ -9058,7 +9258,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } @@ -9066,9 +9266,9 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } - { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then +if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no @@ -9087,16 +9287,16 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9090: $lt_compile\"" >&5) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:9094: \$? = $ac_status" >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes @@ -9113,7 +9313,7 @@ else $RM conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } @@ -9122,7 +9322,7 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* @@ -9130,10 +9330,10 @@ $as_echo_n "checking if we can lock with hard links... " >&6; } touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then - { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi @@ -9146,7 +9346,7 @@ fi - { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= @@ -9162,7 +9362,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported @@ -9206,13 +9405,39 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie openbsd*) with_gnu_ld=no ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' @@ -9230,6 +9455,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie fi supports_anon_versioning=no case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... @@ -9245,11 +9471,12 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie ld_shlibs=no cat <<_LT_EOF 1>&2 -*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. _LT_EOF fi @@ -9285,10 +9512,12 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' @@ -9306,6 +9535,11 @@ _LT_EOF fi ;; + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no @@ -9321,7 +9555,7 @@ _LT_EOF archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; - gnu* | linux* | tpf* | k*bsd*-gnu) + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in @@ -9331,15 +9565,16 @@ _LT_EOF if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then - tmp_addflag= + tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -9350,13 +9585,17 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; - xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 @@ -9372,17 +9611,16 @@ _LT_EOF fi case $cc_basename in - xlf*) + xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld='-rpath $libdir' - archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -9396,8 +9634,8 @@ _LT_EOF archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; @@ -9415,8 +9653,8 @@ _LT_EOF _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi @@ -9462,8 +9700,8 @@ _LT_EOF *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi @@ -9503,8 +9741,10 @@ _LT_EOF else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi @@ -9592,11 +9832,13 @@ _LT_EOF allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -9607,54 +9849,34 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -fi -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_link "$LINENO"; then : + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi fi -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + aix_libpath=$lt_cv_aix_libpath_ +fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' @@ -9663,11 +9885,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi else # Determine the default libpath from the value encoded in an # empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -9678,59 +9902,44 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -fi -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_link "$LINENO"; then : + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi fi -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + aix_libpath=$lt_cv_aix_libpath_ +fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' @@ -9762,20 +9971,64 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes=yes + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac ;; darwin* | rhapsody*) @@ -9785,7 +10038,12 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='' + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in @@ -9793,7 +10051,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=echo + output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" @@ -9811,10 +10069,6 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_shlibpath_var=no ;; - freebsd1*) - ld_shlibs=no - ;; - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little @@ -9827,7 +10081,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) + freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes @@ -9836,7 +10090,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no @@ -9844,7 +10098,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hpux9*) if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi @@ -9859,14 +10113,13 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes @@ -9878,16 +10131,16 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ;; hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then + if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else @@ -9899,7 +10152,46 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + ;; esac fi @@ -9927,52 +10219,39 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat >conftest.$ac_ext <<_ACEOF -int foo(void) {} + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - + lt_cv_irix_exported_symbol=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' @@ -10034,17 +10313,17 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' @@ -10054,13 +10333,13 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' @@ -10073,9 +10352,9 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' - archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) @@ -10224,7 +10503,7 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ fi fi -{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no @@ -10261,46 +10540,52 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc=no - else - archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -$as_echo "$archive_cmds_need_lc" >&6; } + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi @@ -10458,12 +10743,7 @@ esac - - - - - - { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then @@ -10471,16 +10751,23 @@ if test "$GCC" = yes; then darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= @@ -10493,7 +10780,7 @@ if test "$GCC" = yes; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; @@ -10513,7 +10800,13 @@ BEGIN {RS=" "; FS="/|\n";} { if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi @@ -10539,7 +10832,7 @@ need_version=unknown case $host_os in aix3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH @@ -10548,7 +10841,7 @@ aix3*) ;; aix[4-9]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes @@ -10601,7 +10894,7 @@ amigaos*) m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; @@ -10613,7 +10906,7 @@ beos*) ;; bsdi[45]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -10632,8 +10925,9 @@ cygwin* | mingw* | pw32* | cegcc*) need_version=no need_lib_prefix=no - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + case $GCC,$cc_basename in + yes,*) + # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ @@ -10654,36 +10948,83 @@ cygwin* | mingw* | pw32* | cegcc*) cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' ;; *) + # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' ;; esac - dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; @@ -10704,7 +11045,7 @@ darwin* | rhapsody*) ;; dgux*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' @@ -10712,10 +11053,6 @@ dgux*) shlibpath_var=LD_LIBRARY_PATH ;; -freebsd1*) - dynamic_linker=no - ;; - freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -10723,7 +11060,7 @@ freebsd* | dragonfly*) objformat=`/usr/bin/objformat` else case $host_os in - freebsd[123]*) objformat=aout ;; + freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi @@ -10741,7 +11078,7 @@ freebsd* | dragonfly*) esac shlibpath_var=LD_LIBRARY_PATH case $host_os in - freebsd2*) + freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) @@ -10760,13 +11097,16 @@ freebsd* | dragonfly*) esac ;; -gnu*) - version_type=linux +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no + dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -10812,12 +11152,14 @@ hpux9* | hpux10* | hpux11*) soname_spec='${libname}${release}${shared_ext}$major' ;; esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 ;; interix[3-9]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' @@ -10833,7 +11175,7 @@ irix5* | irix6* | nonstopux*) nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; @@ -10870,9 +11212,9 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; -# This must be Linux ELF. -linux* | k*bsd*-gnu) - version_type=linux +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -10880,16 +11222,17 @@ linux* | k*bsd*-gnu) finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -10900,43 +11243,19 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then - shlibpath_overrides_runpath=yes +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes fi - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir fi -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install @@ -10945,7 +11264,7 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -10989,7 +11308,7 @@ netbsd*) ;; newsos6) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -11058,7 +11377,7 @@ rdos*) ;; solaris*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -11083,7 +11402,7 @@ sunos4*) ;; sysv4 | sysv4.3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -11107,7 +11426,7 @@ sysv4 | sysv4.3*) sysv4*MP*) if test -d /usr/nec ;then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH @@ -11138,7 +11457,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -11148,7 +11467,7 @@ tpf*) ;; uts4*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -11158,7 +11477,7 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no @@ -11260,7 +11579,12 @@ fi - { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || @@ -11285,7 +11609,7 @@ else # directories. hardcode_action=unsupported fi -{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || @@ -11319,195 +11643,25 @@ else ;; mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_dl_dlopen=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 -$as_echo_n "checking for shl_load... " >&6; } -if test "${ac_cv_func_shl_load+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shl_load || defined __stub___shl_load -choke me -#endif - -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_shl_load=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; - ac_cv_func_shl_load=no -fi + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -$as_echo "$ac_cv_func_shl_load" >&6; } -if test "x$ac_cv_func_shl_load" = x""yes; then - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11516,81 +11670,52 @@ cat >>conftest.$ac_ext <<_ACEOF #ifdef __cplusplus extern "C" #endif -char shl_load (); +char dlopen (); int main () { -return shl_load (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_dld_shl_load=yes +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_shl_load=no + ac_cv_lib_dl_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = x""yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 -$as_echo_n "checking for dlopen... " >&6; } -if test "${ac_cv_func_dlopen+set}" = set; then - $as_echo_n "(cached) " >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes -#ifdef __STDC__ -# include -#else -# include -#endif +fi + + ;; -#undef dlopen + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC @@ -11598,72 +11723,41 @@ cat >>conftest.$ac_ext <<_ACEOF #ifdef __cplusplus extern "C" #endif -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_dlopen || defined __stub___dlopen -choke me -#endif - +char shl_load (); int main () { -return dlopen (); +return shl_load (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_dlopen=yes +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_dlopen=no + ac_cv_lib_dld_shl_load=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -$as_echo "$ac_cv_func_dlopen" >&6; } -if test "x$ac_cv_func_dlopen" = x""yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else - { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then +if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11681,57 +11775,28 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then +if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11749,57 +11814,28 @@ return dlopen (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = x""yes; then +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then +if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -11817,43 +11853,18 @@ return dld_link (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = x""yes; then +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi @@ -11892,9 +11903,9 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then +if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -11903,7 +11914,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11906 "configure" +#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11944,7 +11955,13 @@ else # endif #endif -void fnord() { int i=42;} +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -11953,7 +11970,11 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } /* dlclose (self); */ } else @@ -11962,11 +11983,11 @@ int main () return status; } _LT_EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -11983,14 +12004,14 @@ rm -fr conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then +if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -11999,7 +12020,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12002 "configure" +#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12040,7 +12061,13 @@ else # endif #endif -void fnord() { int i=42;} +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -12049,7 +12076,11 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } /* dlclose (self); */ } else @@ -12058,11 +12089,11 @@ int main () return status; } _LT_EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -12079,7 +12110,7 @@ rm -fr conftest* fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi @@ -12118,12 +12149,12 @@ fi striplib= old_striplib= -{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough @@ -12132,15 +12163,15 @@ else if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac @@ -12158,12 +12189,12 @@ fi # Report which library types will actually be built - { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } - { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no @@ -12184,14 +12215,14 @@ $as_echo_n "checking whether to build shared libraries... " >&6; } fi ;; esac - { $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } - { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:$LINENO: result: $enable_static" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } @@ -12218,6 +12249,8 @@ CC="$lt_save_CC" + + ac_config_commands="$ac_config_commands libtool" @@ -12227,20 +12260,17 @@ CC="$lt_save_CC" + # Automatically update the libtool script if it becomes out-of-date. # Checks for header files. -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -12255,48 +12285,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -12306,18 +12311,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -12327,14 +12328,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -12349,248 +12346,70 @@ cat >>conftest.$ac_ext <<_ACEOF # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - - - - - - - - - - - - -for ac_header in errno.h fcntl.h stdlib.h unistd.h termios.h string.h errno.h sys/time.h sys/types.h stdarg.h arpa/inet.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : - ac_header_preproc=no +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} +$as_echo "#define STDC_HEADERS 1" >>confdefs.h - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +for ac_header in errno.h fcntl.h stdlib.h unistd.h termios.h string.h sys/time.h sys/types.h stdarg.h arpa/inet.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else - { { $as_echo "$as_me:$LINENO: error: some header files not found" >&5 -$as_echo "$as_me: error: some header files not found" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "some header files not found" "$LINENO" 5 fi done # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if test "${ac_cv_c_const+set}" = set; then +if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { -/* FIXME: Include the comments suggested by Paul. */ + #ifndef __cplusplus - /* Ultrix mips cc rejects this. */ + /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; - const charset cs; + const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; @@ -12607,8 +12426,9 @@ main () ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; @@ -12624,10 +12444,10 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this saying + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; @@ -12640,140 +12460,24 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_c_const=no + ac_cv_c_const=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -cat >>confdefs.h <<\_ACEOF -#define const /**/ -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 -$as_echo_n "checking for size_t... " >&6; } -if test "${ac_cv_type_size_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_size_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof ((size_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +$as_echo "#define const /**/" >>confdefs.h - ac_cv_type_size_t=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -$as_echo "$ac_cv_type_size_t" >&6; } -if test "x$ac_cv_type_size_t" = x""yes; then - : else cat >>confdefs.h <<_ACEOF @@ -12782,16 +12486,12 @@ _ACEOF fi -{ $as_echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if test "${ac_cv_header_time+set}" = set; then +if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -12806,145 +12506,28 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_time=no + ac_cv_header_time=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then -cat >>confdefs.h <<\_ACEOF -#define TIME_WITH_SYS_TIME 1 -_ACEOF +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi # Checks for library functions. - - - - - - for ac_func in select strerror strncpy memcpy strlcpy strlcat -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -12956,97 +12539,82 @@ done # Select OS specific versions of source files. -case "$host" in -*-*-darwin*) - BUNDLE_HOST="MacOS" +BUNDLE_HOST=`uname | sed -e s,/,_,` +DYN_LIB_EXT="so" +case "$BUNDLE_HOST" in +Darwin) + BUNDLE_HOST=MacOS DYN_LIB_EXT="dylib" ;; -*-*-freebsd*) - BUNDLE_HOST="FreeBSD" - DYN_LIB_EXT="so" +SunOS) + BUNDLE_HOST=Solaris ;; -*-*-openbsd*) - BUNDLE_HOST="OpenBSD" - DYN_LIB_EXT="so.0.0" - ;; -*-*-solaris*) - BUNDLE_HOST="Solaris" - DYN_LIB_EXT="so" - ;; -*-*-dragonfly*) - BUNDLE_HOST="DragonFly" - DYN_LIB_EXT="so" - ;; -*) - BUNDLE_HOST="Linux" - DYN_LIB_EXT="so" -esac + esac # --disable-libusb # Check whether --enable-libusb was given. -if test "${enable_libusb+set}" = set; then +if test "${enable_libusb+set}" = set; then : enableval=$enable_libusb; use_libusb="${enableval}" else use_libusb=yes fi -use_usb_interrupt=no - # check if libusb is used +LIBUSB_NEEDED_VERSION="1.0.8" if test "x$use_libusb" != xno ; then if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libusb\"") >&5 - ($PKG_CONFIG --exists --print-errors "libusb") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then pkg_failed=no -{ $as_echo "$as_me:$LINENO: checking for LIBUSB" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBUSB" >&5 $as_echo_n "checking for LIBUSB... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$LIBUSB_CFLAGS"; then - pkg_cv_LIBUSB_CFLAGS="$LIBUSB_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libusb\"") >&5 - ($PKG_CONFIG --exists --print-errors "libusb") 2>&5 +if test -n "$LIBUSB_CFLAGS"; then + pkg_cv_LIBUSB_CFLAGS="$LIBUSB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0 >= \$LIBUSB_NEEDED_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0 >= $LIBUSB_NEEDED_VERSION") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_LIBUSB_CFLAGS=`$PKG_CONFIG --cflags "libusb" 2>/dev/null` + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBUSB_CFLAGS=`$PKG_CONFIG --cflags "libusb-1.0 >= $LIBUSB_NEEDED_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$LIBUSB_LIBS"; then - pkg_cv_LIBUSB_LIBS="$LIBUSB_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libusb\"") >&5 - ($PKG_CONFIG --exists --print-errors "libusb") 2>&5 +if test -n "$LIBUSB_LIBS"; then + pkg_cv_LIBUSB_LIBS="$LIBUSB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0 >= \$LIBUSB_NEEDED_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0 >= $LIBUSB_NEEDED_VERSION") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_LIBUSB_LIBS=`$PKG_CONFIG --libs "libusb" 2>/dev/null` + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBUSB_LIBS=`$PKG_CONFIG --libs "libusb-1.0 >= $LIBUSB_NEEDED_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -13054,424 +12622,241 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - LIBUSB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libusb"` + LIBUSB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libusb-1.0 >= $LIBUSB_NEEDED_VERSION" 2>&1` else - LIBUSB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libusb"` + LIBUSB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libusb-1.0 >= $LIBUSB_NEEDED_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBUSB_PKG_ERRORS" >&5 - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - # Extract the first word of "libusb-config", so it can be a program name with args. -set dummy libusb-config; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIBUSBCONFIG+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$LIBUSBCONFIG"; then - ac_cv_prog_LIBUSBCONFIG="$LIBUSBCONFIG" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIBUSBCONFIG="yes" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: install libusb $LIBUSB_NEEDED_VERSION or later" >&5 +$as_echo "$as_me: WARNING: install libusb $LIBUSB_NEEDED_VERSION or later" >&2;} + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBUSB" >&5 +$as_echo_n "checking for LIBUSB... " >&6; } +if test -n "$LIBUSB_CFLAGS"; then + pkg_cv_LIBUSB_CFLAGS="$LIBUSB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBUSB_CFLAGS=`$PKG_CONFIG --cflags "libusb-1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes fi + else + pkg_failed=untried fi -LIBUSBCONFIG=$ac_cv_prog_LIBUSBCONFIG -if test -n "$LIBUSBCONFIG"; then - { $as_echo "$as_me:$LINENO: result: $LIBUSBCONFIG" >&5 -$as_echo "$LIBUSBCONFIG" >&6; } +if test -n "$LIBUSB_LIBS"; then + pkg_cv_LIBUSB_LIBS="$LIBUSB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBUSB_LIBS=`$PKG_CONFIG --libs "libusb-1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } + pkg_failed=yes +fi + else + pkg_failed=untried fi - if test "$LIBUSBCONFIG" = "yes" ; then - LIBUSB_CFLAGS="$LIBUSB_CFLAGS `libusb-config --cflags`" - LIBUSB_LIBS="$LIBUSB_LIBS `libusb-config --libs`" - else - { $as_echo "$as_me:$LINENO: WARNING: libusb-config not found." >&5 -$as_echo "$as_me: WARNING: libusb-config not found." >&2;} - fi - -elif test $pkg_failed = untried; then +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } - # Extract the first word of "libusb-config", so it can be a program name with args. -set dummy libusb-config; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIBUSBCONFIG+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$LIBUSBCONFIG"; then - ac_cv_prog_LIBUSBCONFIG="$LIBUSBCONFIG" # Let the user override the test. +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIBUSBCONFIG="yes" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBUSB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libusb-1.0" 2>&1` + else + LIBUSB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libusb-1.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBUSB_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libusb-1.0) were not met: -fi -fi -LIBUSBCONFIG=$ac_cv_prog_LIBUSBCONFIG -if test -n "$LIBUSBCONFIG"; then - { $as_echo "$as_me:$LINENO: result: $LIBUSBCONFIG" >&5 -$as_echo "$LIBUSBCONFIG" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi +$LIBUSB_PKG_ERRORS +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. +Alternatively, you may set the environment variables LIBUSB_CFLAGS +and LIBUSB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. - if test "$LIBUSBCONFIG" = "yes" ; then - LIBUSB_CFLAGS="$LIBUSB_CFLAGS `libusb-config --cflags`" - LIBUSB_LIBS="$LIBUSB_LIBS `libusb-config --libs`" - else - { $as_echo "$as_me:$LINENO: WARNING: libusb-config not found." >&5 -$as_echo "$as_me: WARNING: libusb-config not found." >&2;} - fi +Alternatively, you may set the environment variables LIBUSB_CFLAGS +and LIBUSB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } else LIBUSB_CFLAGS=$pkg_cv_LIBUSB_CFLAGS LIBUSB_LIBS=$pkg_cv_LIBUSB_LIBS - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - : -fi fi - saved_CPPFLAGS="$CPPFLAGS" - saved_LIBS="$LIBS" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } - CPPFLAGS="$CPPFLAGS $LIBUSB_CFLAGS" - LIBS="$LDFLAGS $LIBUSB_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: install libusb $LIBUSB_NEEDED_VERSION or later" >&5 +$as_echo "$as_me: WARNING: install libusb $LIBUSB_NEEDED_VERSION or later" >&2;} +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBUSB" >&5 +$as_echo_n "checking for LIBUSB... " >&6; } -for ac_header in usb.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 +if test -n "$LIBUSB_CFLAGS"; then + pkg_cv_LIBUSB_CFLAGS="$LIBUSB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0") 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBUSB_CFLAGS=`$PKG_CONFIG --cflags "libusb-1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no + pkg_failed=yes fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + else + pkg_failed=untried +fi +if test -n "$LIBUSB_LIBS"; then + pkg_cv_LIBUSB_LIBS="$LIBUSB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libusb-1.0") 2>&5 ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBUSB_LIBS=`$PKG_CONFIG --libs "libusb-1.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no + pkg_failed=yes +fi + else + pkg_failed=untried fi -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes else - eval "$as_ac_Header=\$ac_header_preproc" + _pkg_short_errors_supported=no fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + if test $_pkg_short_errors_supported = yes; then + LIBUSB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libusb-1.0" 2>&1` + else + LIBUSB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libusb-1.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBUSB_PKG_ERRORS" >&5 -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + as_fn_error $? "Package requirements (libusb-1.0) were not met: -else - { { $as_echo "$as_me:$LINENO: error: usb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=..." >&5 -$as_echo "$as_me: error: usb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=..." >&2;} - { (exit 1); exit 1; }; } -fi +$LIBUSB_PKG_ERRORS -done +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. +Alternatively, you may set the environment variables LIBUSB_CFLAGS +and LIBUSB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. - { $as_echo "$as_me:$LINENO: checking for usb_init" >&5 -$as_echo_n "checking for usb_init... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +Alternatively, you may set the environment variables LIBUSB_CFLAGS +and LIBUSB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char usb_init (); -int -main () -{ -return usb_init (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + LIBUSB_CFLAGS=$pkg_cv_LIBUSB_CFLAGS + LIBUSB_LIBS=$pkg_cv_LIBUSB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } - { { $as_echo "$as_me:$LINENO: error: libusb not found, use ./configure LIBUSB_LIBS=..." >&5 -$as_echo "$as_me: error: libusb not found, use ./configure LIBUSB_LIBS=..." >&2;} - { (exit 1); exit 1; }; } fi -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - - { $as_echo "$as_me:$LINENO: checking for usb_interrupt_read" >&5 -$as_echo_n "checking for usb_interrupt_read... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char usb_interrupt_read (); -int -main () -{ -return usb_interrupt_read (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + LIBUSB_CFLAGS=$pkg_cv_LIBUSB_CFLAGS + LIBUSB_LIBS=$pkg_cv_LIBUSB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } - { { $as_echo "$as_me:$LINENO: error: your libusb is too old. install version 0.1.12 or above" >&5 -$as_echo "$as_me: error: your libusb is too old. install version 0.1.12 or above" >&2;} - { (exit 1); exit 1; }; } fi -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +fi - { $as_echo "$as_me:$LINENO: checking for usb_detach_kernel_driver_np" >&5 -$as_echo_n "checking for usb_detach_kernel_driver_np... " >&6; } -if test "${ac_cv_func_usb_detach_kernel_driver_np+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + + CPPFLAGS="$CPPFLAGS $LIBUSB_CFLAGS" + LIBS="$LDFLAGS $LIBUSB_LIBS" + + for ac_header in libusb.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libusb.h" "ac_cv_header_libusb_h" "$ac_includes_default" +if test "x$ac_cv_header_libusb_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBUSB_H 1 _ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define usb_detach_kernel_driver_np to an innocuous variant, in case declares usb_detach_kernel_driver_np. - For example, HP-UX 11i declares gettimeofday. */ -#define usb_detach_kernel_driver_np innocuous_usb_detach_kernel_driver_np -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char usb_detach_kernel_driver_np (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ +else + as_fn_error $? "libusb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=..." "$LINENO" 5 +fi + +done -#ifdef __STDC__ -# include -#else -# include -#endif -#undef usb_detach_kernel_driver_np + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libusb_init" >&5 +$as_echo_n "checking for libusb_init... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC @@ -13479,84 +12864,28 @@ cat >>conftest.$ac_ext <<_ACEOF #ifdef __cplusplus extern "C" #endif -char usb_detach_kernel_driver_np (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_usb_detach_kernel_driver_np || defined __stub___usb_detach_kernel_driver_np -choke me -#endif - +char libusb_init (); int main () { -return usb_detach_kernel_driver_np (); +return libusb_init (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_usb_detach_kernel_driver_np=yes +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_usb_detach_kernel_driver_np=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_usb_detach_kernel_driver_np" >&5 -$as_echo "$ac_cv_func_usb_detach_kernel_driver_np" >&6; } -if test "x$ac_cv_func_usb_detach_kernel_driver_np" = x""yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_USB_DETACH_KERNEL_DRIVER_NP 1 -_ACEOF - + as_fn_error $? "libusb not found, use ./configure LIBUSB_LIBS=..." "$LINENO" 5 fi - +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" LIBS="$saved_LIBS" use_libusb=yes - - { $as_echo "$as_me:$LINENO: checking if libusb is emulated by libusb-compat" >&5 -$as_echo_n "checking if libusb is emulated by libusb-compat... " >&6; } - a=`$PKG_CONFIG --variable=emulated libusb` - if test "x$a" = "x1"; - then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - use_usb_interrupt=yes - else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - fi - fi @@ -13569,81 +12898,44 @@ else fi -# --enable-usb-interrupt -# Check whether --enable-usb-interrupt was given. -if test "${enable_usb_interrupt+set}" = set; then - enableval=$enable_usb_interrupt; use_usb_interrupt="${enableval}" -fi - - -if test "x$use_usb_interrupt" = xyes; then - -cat >>confdefs.h <<\_ACEOF -#define USE_USB_INTERRUPT 1 -_ACEOF - -fi - # --enable-composite-as-multislot use_composite_as_multislot=no # Check whether --enable-composite-as-multislot was given. -if test "${enable_composite_as_multislot+set}" = set; then +if test "${enable_composite_as_multislot+set}" = set; then : enableval=$enable_composite_as_multislot; use_composite_as_multislot="${enableval}" fi if test "x$use_composite_as_multislot" = xyes; then -cat >>confdefs.h <<\_ACEOF -#define USE_COMPOSITE_AS_MULTISLOT 1 -_ACEOF +$as_echo "#define USE_COMPOSITE_AS_MULTISLOT 1" >>confdefs.h fi # check if the compiler support -fvisibility=hidden (GCC >= 4) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" -{ $as_echo "$as_me:$LINENO: checking for -fvisibility=hidden" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fvisibility=hidden" >&5 $as_echo_n "checking for -fvisibility=hidden... " >&6; } -cat >conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ char foo; _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SYMBOL_VISIBILITY="-fvisibility=hidden" else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$saved_CFLAGS" # --disable-multi-thread # Check whether --enable-multi-thread was given. -if test "${enable_multi_thread+set}" = set; then +if test "${enable_multi_thread+set}" = set; then : enableval=$enable_multi_thread; multithread="${enableval}" else multithread=yes @@ -13653,14 +12945,13 @@ fi if test "${multithread}" != no ; then - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -acx_pthread_ok=no +ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). @@ -13674,13 +12965,9 @@ if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:$LINENO: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -13698,41 +12985,14 @@ return pthread_join (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - acx_pthread_ok=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test x"$acx_pthread_ok" = xno; then +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi @@ -13750,7 +13010,7 @@ fi # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -13772,8 +13032,8 @@ acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -m # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case "${host_cpu}-${host_os}" in - *solaris*) +case ${host_os} in + solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based @@ -13783,71 +13043,75 @@ case "${host_cpu}-${host_os}" in # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do case $flag in none) - { $as_echo "$as_me:$LINENO: checking whether pthreads work without any flags" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) - { $as_echo "$as_me:$LINENO: checking whether pthreads work with $flag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; - pthread-config) - # Extract the first word of "pthread-config", so it can be a program name with args. + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_acx_pthread_config+set}" = set; then +if ${ac_cv_prog_ax_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$acx_pthread_config"; then - ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_acx_pthread_config="yes" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS - test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi fi -acx_pthread_config=$ac_cv_prog_acx_pthread_config -if test -n "$acx_pthread_config"; then - { $as_echo "$as_me:$LINENO: result: $acx_pthread_config" >&5 -$as_echo "$acx_pthread_config" >&6; } +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +$as_echo "$ax_pthread_config" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; *) - { $as_echo "$as_me:$LINENO: checking for the pthreads library -l$flag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; @@ -13867,62 +13131,36 @@ $as_echo_n "checking for the pthreads library -l$flag... " >&6; } # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; } int main () { -pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - acx_pthread_ok=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" - { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 -$as_echo "$acx_pthread_ok" >&6; } - if test "x$acx_pthread_ok" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = xyes; then break; fi @@ -13932,66 +13170,35 @@ done fi # Various other checks: -if test "x$acx_pthread_ok" = xyes; then +if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:$LINENO: checking for joinable pthread attribute" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { -int attr=$attr; return attr; +int attr = $attr; return attr /* ; */ ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - done - { $as_echo "$as_me:$LINENO: result: $attr_name" >&5 +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then @@ -14001,31 +13208,73 @@ _ACEOF fi - { $as_echo "$as_me:$LINENO: checking if more special flags are required for pthreads" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + case ${host_os} in + aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; + osf* | hpux*) flag="-D_REENTRANT";; + solaris*) + if test "$GCC" = "yes"; then + flag="-D_REENTRANT" + else + flag="-mt -D_REENTRANT" + fi + ;; esac - { $as_echo "$as_me:$LINENO: result: ${flag}" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include +int +main () +{ +int i = PTHREAD_PRIO_INHERIT; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then : + +$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + +fi + LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then + if test x"$GCC" != xyes; then for ac_prog in xlc_r cc_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then +if ${ac_cv_prog_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then @@ -14036,24 +13285,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:$LINENO: result: $PTHREAD_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -14064,7 +13313,7 @@ test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" else PTHREAD_CC=$CC - fi + fi else PTHREAD_CC="$CC" fi @@ -14074,19 +13323,15 @@ fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then +if test x"$ax_pthread_ok" = xyes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_PTHREAD 1 -_ACEOF +$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h : else - acx_pthread_ok=no - { { $as_echo "$as_me:$LINENO: error: POSIX thread support required" >&5 -$as_echo "$as_me: error: POSIX thread support required" >&2;} - { (exit 1); exit 1; }; } + ax_pthread_ok=no + as_fn_error $? "POSIX thread support required" "$LINENO" 5 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -14101,7 +13346,7 @@ fi # --enable-bundle=NAME # Check whether --enable-bundle was given. -if test "${enable_bundle+set}" = set; then +if test "${enable_bundle+set}" = set; then : enableval=$enable_bundle; bundle="${enableval}" else bundle=false @@ -14118,7 +13363,7 @@ _ACEOF # --enable-usbdropdir=DIR # Check whether --enable-usbdropdir was given. -if test "${enable_usbdropdir+set}" = set; then +if test "${enable_usbdropdir+set}" = set; then : enableval=$enable_usbdropdir; usbdropdir="${enableval}" else usbdropdir=false @@ -14133,14 +13378,12 @@ cat >>confdefs.h <<_ACEOF _ACEOF if test "${usbdropdir}" = "" ; then - { { $as_echo "$as_me:$LINENO: error: use --enable-usbdropdir=DIR" >&5 -$as_echo "$as_me: error: use --enable-usbdropdir=DIR" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "use --enable-usbdropdir=DIR" "$LINENO" 5 fi # --enable-twinserial # Check whether --enable-twinserial was given. -if test "${enable_twinserial+set}" = set; then +if test "${enable_twinserial+set}" = set; then : enableval=$enable_twinserial; twinserial="${enableval}" else twinserial=no @@ -14157,19 +13400,31 @@ fi # --enable-ccidtwindir=DIR # Check whether --enable-ccidtwindir was given. -if test "${enable_ccidtwindir+set}" = set; then +if test "${enable_ccidtwindir+set}" = set; then : enableval=$enable_ccidtwindir; ccidtwindir="${enableval}" else ccidtwindir=false fi if test "${ccidtwindir}" = false ; then - ccidtwindir=`$PKG_CONFIG libpcsclite --variable=usbdropdir`/serial + ccidtwindir=$usbdropdir/serial +fi + +# --enable-serialconfdir=DIR +# Check whether --enable-serialconfdir was given. +if test "${enable_serialconfdir+set}" = set; then : + enableval=$enable_serialconfdir; serialconfdir="${enableval}" +else + serialconfdir=false +fi + +if test "${serialconfdir}" = false ; then + serialconfdir=`$PKG_CONFIG libpcsclite --variable=serialconfdir` fi # --disable-pcsclite # Check whether --enable-pcsclite was given. -if test "${enable_pcsclite+set}" = set; then +if test "${enable_pcsclite+set}" = set; then : enableval=$enable_pcsclite; pcsclite="${enableval}" else pcsclite=yes @@ -14182,13 +13437,9 @@ if test "${pcsclite}" != no ; then OLD_CFLAGS="$CFLAGS" LIBS="$LIBS $PCSC_LIBS" CFLAGS="$CFLAGS $PCSC_CFLAGS" - { $as_echo "$as_me:$LINENO: checking for SCardEstablishContext" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SCardEstablishContext" >&5 $as_echo_n "checking for SCardEstablishContext... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -14206,41 +13457,14 @@ return SCardEstablishContext (); return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { { $as_echo "$as_me:$LINENO: error: SCardEstablishContext() not found, install pcsc-lite 1.2.9-beta9 or later,or use PCSC_LIBS=... ./configure" >&5 -$as_echo "$as_me: error: SCardEstablishContext() not found, install pcsc-lite 1.2.9-beta9 or later,or use PCSC_LIBS=... ./configure" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "SCardEstablishContext() not found, install pcsc-lite 1.2.9-beta9 or later,or use PCSC_LIBS=... ./configure" "$LINENO" 5 fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS="$OLD_LIBS" CFLAGS="$OLD_CFLAGS" @@ -14255,26 +13479,9 @@ else fi -# --enable-udev -# Check whether --enable-udev was given. -if test "${enable_udev+set}" = set; then - enableval=$enable_udev; udev="${enableval}" -else - udev=no -fi - - if test "${udev}" != "no"; then - UDEV_TRUE= - UDEV_FALSE='#' -else - UDEV_TRUE='#' - UDEV_FALSE= -fi - - # --disable-class # Check whether --enable-class was given. -if test "${enable_class+set}" = set; then +if test "${enable_class+set}" = set; then : enableval=$enable_class; class="${enableval}" else class=yes @@ -14285,6 +13492,18 @@ if test "${class}" != yes ; then fi +# --enable-embedded +# Check whether --enable-embedded was given. +if test "${enable_embedded+set}" = set; then : + enableval=$enable_embedded; use_embedded="${enableval}" +fi + + +if test x$use_embedded = xyes; then + +$as_echo "#define NO_LOG 1" >>confdefs.h + +fi # Setup dist stuff @@ -14292,13 +13511,70 @@ fi + + EXP_VAR=bindir_exp + FROM_VAR=$bindir + + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + full_var=$new_full_var + bindir_exp="$full_var" + + + prefix=$prefix_save + exec_prefix=$exec_prefix_save + + + EXP_VAR=sysconfdir_exp + FROM_VAR=$sysconfdir + + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + full_var=$new_full_var + sysconfdir_exp="$full_var" + + + prefix=$prefix_save + exec_prefix=$exec_prefix_save + + cat << EOF libccid has been configured with following options: Version: ${PACKAGE_VERSION} -User binaries: $(eval eval eval echo "${bindir}") -Configuration files: $(eval eval eval echo "${sysconfdir}") +User binaries: $(eval eval eval echo "${bindir_exp}") +Configuration files: $(eval eval eval echo "${sysconfdir_exp}") Host: ${host} @@ -14321,21 +13597,20 @@ SYMBOL_VISIBILITY: ${SYMBOL_VISIBILITY} NOCLASS: ${NOCLASS} libusb support: ${use_libusb} -use USB interrupt: ${use_usb_interrupt} composite as multislot: ${use_composite_as_multislot} multi threading: ${multithread} bundle directory name: ${bundle} USB drop directory: ${usbdropdir} serial Twin support: ${twinserial} serial twin install dir: ${ccidtwindir} +serial config directory: ${serialconfdir} compiled for pcsc-lite: ${pcsclite} -udev support: ${udev} class driver: ${class} EOF # Write Makefiles. -ac_config_files="$ac_config_files Makefile m4/Makefile src/Makefile readers/Makefile contrib/Makefile contrib/Kobil_mIDentity_switch/Makefile contrib/RSA_SecurID/Makefile examples/Makefile" +ac_config_files="$ac_config_files Makefile src/Makefile readers/Makefile contrib/Makefile contrib/Kobil_mIDentity_switch/Makefile contrib/RSA_SecurID/Makefile examples/Makefile" cat >confcache <<\_ACEOF @@ -14365,13 +13640,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -14379,8 +13654,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -14402,12 +13677,23 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -14421,77 +13707,70 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_LIBUSB_TRUE}" && test -z "${WITH_LIBUSB_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"WITH_LIBUSB\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"WITH_LIBUSB\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"WITH_LIBUSB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_TWIN_SERIAL_TRUE}" && test -z "${WITH_TWIN_SERIAL_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"WITH_TWIN_SERIAL\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"WITH_TWIN_SERIAL\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"WITH_TWIN_SERIAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITHOUT_PCSC_TRUE}" && test -z "${WITHOUT_PCSC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"WITHOUT_PCSC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"WITHOUT_PCSC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${UDEV_TRUE}" && test -z "${UDEV_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"UDEV\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"UDEV\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"WITHOUT_PCSC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -: ${CONFIG_STATUS=./config.status} +: "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -14501,17 +13780,18 @@ cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -14519,23 +13799,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -14543,7 +13815,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -14554,7 +13832,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -14577,13 +13855,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -14593,15 +13864,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -14613,12 +13885,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -14630,7 +13906,89 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -14644,8 +14002,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -14665,76 +14027,25 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -14749,49 +14060,85 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -14801,13 +14148,19 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Save the log message, to keep $[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ccid $as_me 1.3.11, which was -generated by GNU Autoconf 2.63. Invocation command line was +This file was extended by ccid $as_me 1.4.14, which was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -14839,13 +14192,15 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTION]... [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit + --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -14864,16 +14219,17 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -ccid config.status 1.3.11 -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +ccid config.status 1.4.14 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" -Copyright (C) 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -14891,11 +14247,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -14909,27 +14270,29 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - { $as_echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -14937,11 +14300,10 @@ Try \`$0 --help' for more information." >&2 ac_cs_silent=: ;; # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" + *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac @@ -14958,7 +14320,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -14992,131 +14354,154 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' -macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' -enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' -pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' -host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' -host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' -host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' -build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' -build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' -build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' -SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' -Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' -GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' -EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' -FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' -LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' -NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' -LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' -ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' -exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' -lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' -reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' -AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' -STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' -RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' -compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' -GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' -SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' -ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' -need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' -LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' -libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' -fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' -version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' -runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' -libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' -soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' -old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' -striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + # Quote evaled strings. -for var in SED \ +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ GREP \ EGREP \ FGREP \ @@ -15129,8 +14514,13 @@ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ +archiver_list_spec \ STRIP \ RANLIB \ CC \ @@ -15140,14 +14530,14 @@ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -SHELL \ -ECHO \ +nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_wl \ lt_prog_compiler_pic \ +lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ +MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ @@ -15161,9 +14551,7 @@ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ -fix_srcfile_path \ exclude_expsyms \ include_expsyms \ file_list_spec \ @@ -15171,12 +14559,13 @@ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ +install_override_mode \ finish_eval \ old_striplib \ striplib; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -15198,14 +14587,15 @@ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ +postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -15213,12 +14603,6 @@ sys_lib_dlsearch_path_spec; do esac done -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` - ;; -esac - ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' @@ -15251,7 +14635,6 @@ do "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "readers/Makefile") CONFIG_FILES="$CONFIG_FILES readers/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; @@ -15259,9 +14642,7 @@ do "contrib/RSA_SecurID/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/RSA_SecurID/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -15284,26 +14665,24 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -15311,7 +14690,13 @@ $debug || if test -n "$CONFIG_FILES"; then -ac_cr=' ' +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -15319,7 +14704,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -15328,24 +14713,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -15353,7 +14732,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -15367,7 +14746,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -15381,7 +14760,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -15401,7 +14780,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -15433,23 +14812,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -15461,7 +14846,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -15473,13 +14858,11 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -15564,9 +14947,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -$as_echo "$as_me: error: could not setup config headers machinery" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -15579,9 +14960,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -15600,7 +14979,7 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -15609,12 +14988,10 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" + as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -15625,7 +15002,7 @@ $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -15637,10 +15014,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -15668,47 +15043,7 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in @@ -15765,7 +15100,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= - ac_sed_dataroot=' /datarootdir/ { p @@ -15775,12 +15109,11 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p -' +/@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -15790,7 +15123,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -15818,27 +15151,24 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$tmp/stdin" + rm -f "$ac_tmp/stdin" case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -15847,27 +15177,21 @@ $as_echo "$as_me: error: could not create $ac_file" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -$as_echo "$as_me: error: could not create -" >&2;} - { (exit 1); exit 1; }; } + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -15905,34 +15229,35 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || # Autoconf 2.62 quotes --file arguments for eval, but not when files -# are listed without --file. Let's play safe and only enable the eval -# if we detect the quoting. -case $CONFIG_FILES in -*\'*) eval set x "$CONFIG_FILES" ;; -*) set x $CONFIG_FILES ;; -esac -shift -for mf -do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ @@ -15955,28 +15280,26 @@ $as_echo X"$mf" | q } s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ @@ -15999,51 +15322,12 @@ $as_echo X"$file" | q } s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" done -done +} ;; "libtool":C) @@ -16066,7 +15350,8 @@ done # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. @@ -16102,18 +15387,27 @@ available_tags="" macro_version=$macro_version macro_revision=$macro_revision -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - # Whether or not to build static libraries. build_old_libs=$enable_static +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + # The host system. host_alias=$host_alias host=$host @@ -16163,9 +15457,11 @@ SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP @@ -16173,13 +15469,30 @@ OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method -# Command to use when deplibs_check_method == "file_magic". +# Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + # The archiver. AR=$lt_AR + +# Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + # A symbol stripping program. STRIP=$lt_STRIP @@ -16188,6 +15501,9 @@ RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + # A C compiler. LTCC=$lt_CC @@ -16206,14 +15522,14 @@ global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix -# The name of the directory that contains temporary libtool files. -objdir=$objdir +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot -# An echo program that does not interpret backslashes. -ECHO=$lt_ECHO +# The name of the directory that contains temporary libtool files. +objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD @@ -16221,6 +15537,9 @@ MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL @@ -16277,6 +15596,9 @@ library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds @@ -16316,6 +15638,10 @@ striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds @@ -16328,12 +15654,12 @@ with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static @@ -16383,10 +15709,6 @@ no_undefined_flag=$lt_no_undefined_flag # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec -# If ld is used when linking, flag to hardcode \$libdir into a binary -# during linking. This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator @@ -16420,9 +15742,6 @@ inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path=$lt_fix_srcfile_path - # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols @@ -16438,6 +15757,9 @@ include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + # Specify filename containing input files. file_list_spec=$lt_file_list_spec @@ -16470,212 +15792,169 @@ ltmain="$ac_aux_dir/ltmain.sh" # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? - sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - case $xsi_shell in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac -} - -# func_basename file -func_basename () -{ - func_basename_result="${1##*/}" -} - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}" -} - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -func_stripname () -{ - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"} -} - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=${1%%=*} - func_opt_split_arg=${1#*=} -} - -# func_lo2o object -func_lo2o () -{ - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=${1%.*}.lo -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=$(( $* )) -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=${#1} -} - -_LT_EOF - ;; - *) # Bourne compatible functions. - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; - esac -} - -# sed scripts: -my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' -my_sed_long_arg='1s/^-[^=]*=//' - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` -} - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "$@"` -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` -} - -_LT_EOF -esac - -case $lt_shell_append in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$1+=\$2" -} -_LT_EOF - ;; - *) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$1=\$$1\$2" -} - -_LT_EOF - ;; - esac - - - sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" @@ -16685,15 +15964,12 @@ _LT_EOF done # for ac_tag -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -16714,10 +15990,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/ccid/ccid/configure.in b/ccid/ccid/configure.ac similarity index 63% rename from ccid/ccid/configure.in rename to ccid/ccid/configure.ac index 8ebd4b6..ab71e73 100644 --- a/ccid/ccid/configure.in +++ b/ccid/ccid/configure.ac @@ -1,15 +1,19 @@ # Process this file with autoconf to produce a configure script. # You may need to use autoconf 2.56 or newer -# $Id: configure.in 4347 2009-07-28 20:52:50Z rousseau $ +# $Id: configure.ac 6795 2013-11-25 18:09:17Z rousseau $ # Require autoconf 2.61 -AC_PREREQ(2.61) +AC_PREREQ([2.69]) -AC_INIT(ccid, 1.3.11) +AC_INIT([ccid],[1.4.14]) AC_CONFIG_SRCDIR(src/ifdhandler.c) AC_CONFIG_AUX_DIR([.]) -AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip) +AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip subdir-objects) +AC_CONFIG_MACRO_DIR([m4]) + +# silent build by default +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) # Default install dir AC_PREFIX_DEFAULT(/usr/local) @@ -18,7 +22,7 @@ AC_PREFIX_DEFAULT(/usr/local) AC_CANONICAL_HOST # create a config.h file (Automake will add -DHAVE_CONFIG_H) -AM_CONFIG_HEADER(config.h) +AC_CONFIG_HEADERS([config.h]) # Options AM_MAINTAINER_MODE @@ -31,10 +35,11 @@ AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_LN_S AM_PROG_LEX +AM_PROG_AR PKG_PROG_PKG_CONFIG # check pcsc-lite version -PCSC_NEEDED_VERSION="1.3.3" +PCSC_NEEDED_VERSION="1.8.3" PKG_CHECK_EXISTS([libpcsclite], [PKG_CHECK_MODULES(PCSC, libpcsclite >= $PCSC_NEEDED_VERSION, [], [ @@ -49,23 +54,22 @@ PKG_CHECK_EXISTS([libpcsclite], saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $PCSC_CFLAGS" -AC_CHECK_HEADER(ifdhandler.h,, - [AC_MSG_ERROR([ifdhandler.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=...])]) -AC_CHECK_DECL(IFD_NO_SUCH_DEVICE,, [AC_MSG_ERROR([install pcsc-lite $PCSC_NEEDED_VERSION or later])], [#include ]) -AC_CHECK_DECLS(TAG_IFD_POLLING_THREAD,,, [#include ]) -AC_CHECK_HEADER(reader.h,, - [AC_MSG_ERROR([reader.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=...])]) +PCSC_ERROR_MSG="install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..." +AC_CHECK_HEADER(ifdhandler.h,, [AC_MSG_ERROR([$PCSC_ERROR_MSG])]) +AC_CHECK_HEADER(reader.h,, [AC_MSG_ERROR([$PCSC_ERROR_MSG])]) CPPFLAGS="$saved_CPPFLAGS" # Add libtool support. -AM_PROG_LIBTOOL +# Static lib is disabled by default. Use --enable-static if needed +LT_INIT(disable-static) +LT_INIT # Automatically update the libtool script if it becomes out-of-date. AC_SUBST(LIBTOOL_DEPS) # Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADERS(errno.h fcntl.h stdlib.h unistd.h termios.h string.h errno.h sys/time.h sys/types.h stdarg.h arpa/inet.h,, +AC_CHECK_HEADERS(errno.h fcntl.h stdlib.h unistd.h termios.h string.h sys/time.h sys/types.h stdarg.h arpa/inet.h,, [AC_MSG_ERROR([some header files not found])]) # Checks for typedefs, structures, and compiler characteristics. @@ -79,52 +83,31 @@ AC_CHECK_FUNCS(select strerror strncpy memcpy strlcpy strlcat) # Select OS specific versions of source files. AC_SUBST(BUNDLE_HOST) AC_SUBST(DYN_LIB_EXT) -case "$host" in -*-*-darwin*) - BUNDLE_HOST="MacOS" +BUNDLE_HOST=`uname | sed -e s,/,_,` +DYN_LIB_EXT="so" +case "$BUNDLE_HOST" in +Darwin) + BUNDLE_HOST=MacOS DYN_LIB_EXT="dylib" ;; -*-*-freebsd*) - BUNDLE_HOST="FreeBSD" - DYN_LIB_EXT="so" - ;; -*-*-openbsd*) - BUNDLE_HOST="OpenBSD" - DYN_LIB_EXT="so.0.0" - ;; -*-*-solaris*) - BUNDLE_HOST="Solaris" - DYN_LIB_EXT="so" +SunOS) + BUNDLE_HOST=Solaris ;; -*-*-dragonfly*) - BUNDLE_HOST="DragonFly" - DYN_LIB_EXT="so" - ;; -*) - BUNDLE_HOST="Linux" - DYN_LIB_EXT="so" -esac + esac # --disable-libusb AC_ARG_ENABLE(libusb, - AC_HELP_STRING([--disable-libusb],[do not use libusb]), + AS_HELP_STRING([--disable-libusb],[do not use libusb]), [ use_libusb="${enableval}" ], [ use_libusb=yes ] ) -use_usb_interrupt=no - # check if libusb is used +LIBUSB_NEEDED_VERSION="1.0.8" if test "x$use_libusb" != xno ; then - PKG_CHECK_EXISTS([libusb], [ - PKG_CHECK_MODULES(LIBUSB, libusb, [], + PKG_CHECK_EXISTS([libusb-1.0], [ + PKG_CHECK_MODULES(LIBUSB, libusb-1.0 >= $LIBUSB_NEEDED_VERSION, [], [ - AC_CHECK_PROG([LIBUSBCONFIG], [libusb-config], [yes]) - - if test "$LIBUSBCONFIG" = "yes" ; then - LIBUSB_CFLAGS="$LIBUSB_CFLAGS `libusb-config --cflags`" - LIBUSB_LIBS="$LIBUSB_LIBS `libusb-config --libs`" - else - AC_MSG_WARN([libusb-config not found.]) - fi + AC_MSG_WARN([install libusb $LIBUSB_NEEDED_VERSION or later]) + PKG_CHECK_MODULES(LIBUSB, libusb-1.0) ]) ]) @@ -134,56 +117,26 @@ if test "x$use_libusb" != xno ; then CPPFLAGS="$CPPFLAGS $LIBUSB_CFLAGS" LIBS="$LDFLAGS $LIBUSB_LIBS" - AC_CHECK_HEADERS(usb.h, [], - [ AC_MSG_ERROR([usb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=...]) ]) + AC_CHECK_HEADERS(libusb.h, [], + [ AC_MSG_ERROR([libusb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=...]) ]) - AC_MSG_CHECKING([for usb_init]) - AC_TRY_LINK_FUNC(usb_init, [ AC_MSG_RESULT([yes]) ], + AC_MSG_CHECKING([for libusb_init]) + AC_TRY_LINK_FUNC(libusb_init, [ AC_MSG_RESULT([yes]) ], [ AC_MSG_ERROR([libusb not found, use ./configure LIBUSB_LIBS=...]) ]) - AC_MSG_CHECKING([for usb_interrupt_read]) - AC_TRY_LINK_FUNC(usb_interrupt_read, [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_ERROR([your libusb is too old. install version 0.1.12 or above]) ]) - - AC_CHECK_FUNC(usb_detach_kernel_driver_np, - [ AC_DEFINE(HAVE_USB_DETACH_KERNEL_DRIVER_NP, 1, [Define if usb_detach_kernel_driver_np() is available]) ]) - CPPFLAGS="$saved_CPPFLAGS" LIBS="$saved_LIBS" use_libusb=yes - - AC_MSG_CHECKING([if libusb is emulated by libusb-compat]) - a=`$PKG_CONFIG --variable=emulated libusb` - if test "x$a" = "x1"; - then - AC_MSG_RESULT([yes]) - use_usb_interrupt=yes - else - AC_MSG_RESULT([no]) - fi - fi AC_SUBST(LIBUSB_CFLAGS) AC_SUBST(LIBUSB_LIBS) AM_CONDITIONAL(WITH_LIBUSB, test "${use_libusb}" != "no") -# --enable-usb-interrupt -AC_ARG_ENABLE(usb-interrupt, - AC_HELP_STRING([--enable-usb-interrupt], [force the use of USB - interrupt even with an old libusb]), - [ use_usb_interrupt="${enableval}" ] ) - -if test "x$use_usb_interrupt" = xyes; then - AC_DEFINE(USE_USB_INTERRUPT, 1, [use libusb usb_interrupt_read() - instead of polling]) -fi - # --enable-composite-as-multislot use_composite_as_multislot=no AC_ARG_ENABLE(composite-as-multislot, - AC_HELP_STRING([--enable-composite-as-multislot], - [composite device are seen as multi-slots]), + AS_HELP_STRING([--enable-composite-as-multislot],[composite device are seen as multi-slots]), [ use_composite_as_multislot="${enableval}" ] ) if test "x$use_composite_as_multislot" = xyes; then @@ -194,7 +147,7 @@ fi saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" AC_MSG_CHECKING([for -fvisibility=hidden]) -AC_COMPILE_IFELSE([char foo;], +AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])], [ AC_MSG_RESULT([yes]) SYMBOL_VISIBILITY="-fvisibility=hidden" ], AC_MSG_RESULT([no])) @@ -203,11 +156,11 @@ AC_SUBST(SYMBOL_VISIBILITY) # --disable-multi-thread AC_ARG_ENABLE(multi-thread, - AC_HELP_STRING([--disable-multi-thread],[disable multi threading]), + AS_HELP_STRING([--disable-multi-thread],[disable multi threading]), [ multithread="${enableval}" ], [ multithread=yes ] ) if test "${multithread}" != no ; then - ACX_PTHREAD( + AX_PTHREAD( [ AC_DEFINE(HAVE_PTHREAD, 1, [Define if you have POSIX threads libraries and header files.]) ], [ AC_MSG_ERROR([POSIX thread support required]) ]) @@ -217,7 +170,7 @@ fi # --enable-bundle=NAME AC_ARG_ENABLE(bundle, - AC_HELP_STRING([--enable-bundle=NAME],[bundle directory name + AS_HELP_STRING([--enable-bundle=NAME],[bundle directory name (default ifd-ccid.bundle)]), [bundle="${enableval}"], [bundle=false]) if test "${bundle}" = false ; then @@ -227,7 +180,7 @@ AC_DEFINE_UNQUOTED(BUNDLE, "$bundle", [bundle directory name]) # --enable-usbdropdir=DIR AC_ARG_ENABLE(usbdropdir, - AC_HELP_STRING([--enable-usbdropdir=DIR],[directory containing USB + AS_HELP_STRING([--enable-usbdropdir=DIR],[directory containing USB drivers (default to pcscd config or $(prefix)/pcsc/drivers)]), [usbdropdir="${enableval}"], [usbdropdir=false]) if test "${usbdropdir}" = false ; then @@ -240,22 +193,31 @@ fi # --enable-twinserial AC_ARG_ENABLE(twinserial, - AC_HELP_STRING([--enable-twinserial],[also compile and install the serial Twin driver]), + AS_HELP_STRING([--enable-twinserial],[also compile and install the serial Twin driver]), [twinserial="${enableval}"], [twinserial=no]) AM_CONDITIONAL(WITH_TWIN_SERIAL, test "${twinserial}" != "no") # --enable-ccidtwindir=DIR AC_ARG_ENABLE(ccidtwindir, - AC_HELP_STRING([--enable-ccidtwindir=DIR],[directory to install the + AS_HELP_STRING([--enable-ccidtwindir=DIR],[directory to install the serial Twin driver (default to pcscd config or $(prefix)/pcsc/drivers/serial)]), [ccidtwindir="${enableval}"], [ccidtwindir=false]) if test "${ccidtwindir}" = false ; then - ccidtwindir=`$PKG_CONFIG libpcsclite --variable=usbdropdir`/serial + ccidtwindir=$usbdropdir/serial +fi + +# --enable-serialconfdir=DIR +AC_ARG_ENABLE(serialconfdir, + AS_HELP_STRING([--enable-serialconfdir=dir],[directory containing + serial drivers (default to pcscd config)]), + [serialconfdir="${enableval}"], [serialconfdir=false]) +if test "${serialconfdir}" = false ; then + serialconfdir=`$PKG_CONFIG libpcsclite --variable=serialconfdir` fi # --disable-pcsclite AC_ARG_ENABLE(pcsclite, - AC_HELP_STRING([--disable-pcsclite],[do not use pcsc-lite debug support]), + AS_HELP_STRING([--disable-pcsclite],[do not use pcsc-lite debug support]), [ pcsclite="${enableval}" ], [ pcsclite=yes ] ) if test "${pcsclite}" != no ; then @@ -275,35 +237,40 @@ if test "${pcsclite}" != no ; then fi AM_CONDITIONAL(WITHOUT_PCSC, test "${pcsclite}" != "yes") -# --enable-udev -AC_ARG_ENABLE(udev, - AC_HELP_STRING([--enable-udev],[udev support for pcscd hotplug]), - [udev="${enableval}"], [udev=no]) -AM_CONDITIONAL(UDEV, test "${udev}" != "no") - # --disable-class AC_ARG_ENABLE(class, - AC_HELP_STRING([--disable-class],[remove the CCIDCLASSDRIVER from Info.plist]), + AS_HELP_STRING([--disable-class],[remove the CCIDCLASSDRIVER from Info.plist]), [class="${enableval}"], [class=yes]) if test "${class}" != yes ; then NOCLASS="--no-class" fi AC_SUBST(NOCLASS) +# --enable-embedded +AC_ARG_ENABLE(embedded, + AS_HELP_STRING([--enable-embedded],[limit RAM and CPU ressources by disabling features (log)]), + [ use_embedded="${enableval}" ]) + +if test x$use_embedded = xyes; then + AC_DEFINE(NO_LOG, 1, [Disable logging support]) +fi # Setup dist stuff AC_SUBST(ac_aux_dir) AC_SUBST(bundle) AC_SUBST(usbdropdir) AC_SUBST(ccidtwindir) +AC_SUBST(serialconfdir) +AS_AC_EXPAND(bindir_exp,$bindir) +AS_AC_EXPAND(sysconfdir_exp,$sysconfdir) cat << EOF libccid has been configured with following options: Version: ${PACKAGE_VERSION} -User binaries: $(eval eval eval echo "${bindir}") -Configuration files: $(eval eval eval echo "${sysconfdir}") +User binaries: $(eval eval eval echo "${bindir_exp}") +Configuration files: $(eval eval eval echo "${sysconfdir_exp}") Host: ${host} @@ -326,22 +293,20 @@ SYMBOL_VISIBILITY: ${SYMBOL_VISIBILITY} NOCLASS: ${NOCLASS} libusb support: ${use_libusb} -use USB interrupt: ${use_usb_interrupt} composite as multislot: ${use_composite_as_multislot} multi threading: ${multithread} bundle directory name: ${bundle} USB drop directory: ${usbdropdir} serial Twin support: ${twinserial} serial twin install dir: ${ccidtwindir} +serial config directory: ${serialconfdir} compiled for pcsc-lite: ${pcsclite} -udev support: ${udev} class driver: ${class} EOF # Write Makefiles. AC_CONFIG_FILES(Makefile - m4/Makefile src/Makefile readers/Makefile contrib/Makefile diff --git a/ccid/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c b/ccid/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c index 9406e1e..874abe0 100644 --- a/ccid/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c +++ b/ccid/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c @@ -26,7 +26,7 @@ This tool is needed to activate the smartcard interface on the kobil midentity usb device (vendor 0x04D6 id 0x4081) Kobil's own implementation was a kernel usb driver which did just send a -usb_control_msg in the probe routine. +libusb_control_transfer in the probe routine. We do the same via libusb and call this program from our /sbin/hotblug script if the mIDentity gets added. @@ -39,7 +39,7 @@ Here the interesting part of the kernel driver inside the probe function: if (dev->descriptor.idVendor == KOBIL_VENDOR_ID){ printk("!!!!! DEVICE FOUND !!! !\n"); - ret = usb_control_msg(dev, + ret = libusb_control_transfer(dev, send_pipe, 0x09, 0x22, @@ -58,13 +58,15 @@ findintfep() in order to understand why. #include #include -#include +#include +#include +#include #include #include "config.h" #define KOBIL_VENDOR_ID 0x0D46 -#define MID_DEVICE_ID 0x4081 +#define MID_DEVICE_ID 0x4081 #define KOBIL_TIMEOUT 5000 #define VAL_STARTUP_4080 1 #define VAL_STARTUP_4000 2 @@ -78,99 +80,117 @@ findintfep() in order to understand why. #define wIndex 0x0002 /* this was originally 0x0001 */ -static int kobil_midentity_control_msg(usb_dev_handle *usb) +static int kobil_midentity_control_msg(libusb_device_handle *usb) { - int ret; + int ret; - char switchCmd[10]; + unsigned char switchCmd[10]; - unsigned char Sleep = 1; - unsigned char hardDisk = 1; + unsigned char Sleep = 1; + unsigned char hardDisk = 1; - unsigned char param = ((hardDisk)<<4) | (Sleep); + unsigned char param = ((hardDisk) << 4) | (Sleep); - memset(switchCmd, 0x0, sizeof(switchCmd)); - switchCmd[0] = HIDCMD_SWITCH_DEVICE>>8; - switchCmd[1] = HIDCMD_SWITCH_DEVICE; - switchCmd[5] = VAL_STARTUP_4000; - switchCmd[9] = param; + memset(switchCmd, 0x0, sizeof(switchCmd)); + switchCmd[0] = HIDCMD_SWITCH_DEVICE >> 8; + switchCmd[1] = HIDCMD_SWITCH_DEVICE; + switchCmd[5] = VAL_STARTUP_4000; + switchCmd[9] = param; - ret = usb_control_msg(usb, bmRequestType, bRequest, wValue, wIndex, - switchCmd, sizeof(switchCmd), KOBIL_TIMEOUT); + ret = libusb_control_transfer(usb, bmRequestType, bRequest, wValue, wIndex, + switchCmd, sizeof(switchCmd), KOBIL_TIMEOUT); - return(!(ret==sizeof(switchCmd))); + return(!(ret==sizeof(switchCmd))); } -static int kobil_midentity_claim_interface(usb_dev_handle *usb, int ifnum) +static int kobil_midentity_claim_interface(libusb_device_handle *usb, int ifnum) { - int rv; + int rv; - printf("claiming interface #%d ...\n", ifnum); - rv = usb_claim_interface(usb, ifnum); - if (rv == 0) + printf("claiming interface #%d ... ", ifnum); + rv = libusb_claim_interface(usb, ifnum); + if (rv == 0) { printf("success\n"); - return(rv); - } - -#ifdef HAVE_USB_DETACH_KERNEL_DRIVER_NP - printf("failed with error %d, trying to detach kernel driver ....\n", rv); - rv = usb_detach_kernel_driver_np(usb, ifnum); - if (rv == 0) - { + return rv; + } + else + printf("failed\n"); + + printf("failed with error %d, trying to detach kernel driver ....\n", rv); + rv = libusb_detach_kernel_driver(usb, ifnum); + if (rv == 0) + { printf("success, claiming interface again ..."); - rv = usb_claim_interface(usb, ifnum); + rv = libusb_claim_interface(usb, ifnum); if (rv == 0) { printf("success\n"); - return(rv); + return rv; } - } -#endif - printf("failed with error %d, giving up.\n", rv); - return(rv); + else + printf("failed\n"); + } + + printf("failed with error %d, giving up.\n", rv); + return rv; } int main(int argc, char *argv[]) { - struct usb_bus *bus; - struct usb_device *dev = NULL; - struct usb_device *found_dev = NULL; - usb_dev_handle *usb = NULL; - int rv; + libusb_device **devs, *dev; + libusb_device *found_dev = NULL; + struct libusb_device_handle *usb = NULL; + int rv, i; + ssize_t cnt; - usb_init(); + (void)argc; + (void)argv; + + rv = libusb_init(NULL); + if (rv < 0) + { + (void)printf("libusb_init() failed\n"); + return rv; + } - usb_find_busses(); - usb_find_devices(); + cnt = libusb_get_device_list(NULL, &devs); + if (cnt < 0) + { + (void)printf("libusb_get_device_list() failed\n"); + return (int)cnt; + } - for (bus = usb_busses; bus; bus = bus->next) + /* for every device */ + i = 0; + while ((dev = devs[i++]) != NULL) { - for (dev = bus->devices; dev; dev = dev->next) - { - printf("vendor/product: %04X %04X\n", - dev->descriptor.idVendor, dev->descriptor.idProduct); - if (dev->descriptor.idVendor == KOBIL_VENDOR_ID - && dev->descriptor.idProduct ==MID_DEVICE_ID) - { - found_dev = dev; - } + struct libusb_device_descriptor desc; + + rv = libusb_get_device_descriptor(dev, &desc); + if (rv < 0) { + (void)printf("failed to get device descriptor\n"); + continue; } + + printf("vendor/product: %04X %04X\n", desc.idVendor, desc.idProduct); + if (desc.idVendor == KOBIL_VENDOR_ID && desc.idProduct == MID_DEVICE_ID) + found_dev = dev; } - if (found_dev == NULL) + if (found_dev == NULL) { printf("device not found. aborting.\n"); if (0 != geteuid()) printf("Try to rerun this program as root.\n"); exit(1); - } + } printf("Device found, opening ... "); - usb = usb_open(found_dev); - if (!usb) + rv = libusb_open(found_dev, &usb); + if (rv < 0) { printf("failed, aborting.\n"); exit(2); @@ -180,13 +200,14 @@ int main(int argc, char *argv[]) rv = kobil_midentity_claim_interface(usb, 0); if (rv < 0) { - usb_close(usb); + libusb_close(usb); exit(3); } + rv = kobil_midentity_claim_interface(usb, 1); if (rv < 0) { - usb_close(usb); + libusb_close(usb); exit(3); } @@ -197,8 +218,8 @@ int main(int argc, char *argv[]) else printf("failed with error %d, giving up.\n", rv); - usb_close(usb); + libusb_close(usb); - return 0; + return 0; } diff --git a/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.am b/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.am index 987615a..dc6a66b 100644 --- a/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.am +++ b/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.am @@ -1,10 +1,10 @@ -sbin_PROGRAMS = Kobil_mIDentity_switch +noinst_PROGRAMS = Kobil_mIDentity_switch Kobil_mIDentity_switch_SOURCES = Kobil_mIDentity_switch.c Kobil_mIDentity_switch_CFLAGS = $(LIBUSB_CFLAGS) Kobil_mIDentity_switch_LDADD = $(LIBUSB_LIBS) -doc_DATA = README_Kobil_mIDentity_switch.txt +noinst_DATA = README_Kobil_mIDentity_switch.txt -man_MANS = Kobil_mIDentity_switch.8 +noinst_MANS = Kobil_mIDentity_switch.8 -EXTRA_DIST = $(doc_DATA) $(man_MANS) +EXTRA_DIST = $(noinst_DATA) $(noinst_MANS) diff --git a/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.in b/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.in index e7d8ce6..8e0cba6 100644 --- a/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.in +++ b/ccid/ccid/contrib/Kobil_mIDentity_switch/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,9 +16,55 @@ VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -33,62 +79,101 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -sbin_PROGRAMS = Kobil_mIDentity_switch$(EXEEXT) +noinst_PROGRAMS = Kobil_mIDentity_switch$(EXEEXT) subdir = contrib/Kobil_mIDentity_switch -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" \ - "$(DESTDIR)$(docdir)" -sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(sbin_PROGRAMS) +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) am_Kobil_mIDentity_switch_OBJECTS = \ Kobil_mIDentity_switch-Kobil_mIDentity_switch.$(OBJEXT) Kobil_mIDentity_switch_OBJECTS = $(am_Kobil_mIDentity_switch_OBJECTS) am__DEPENDENCIES_1 = Kobil_mIDentity_switch_DEPENDENCIES = $(am__DEPENDENCIES_1) -Kobil_mIDentity_switch_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +Kobil_mIDentity_switch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(Kobil_mIDentity_switch_SOURCES) DIST_SOURCES = $(Kobil_mIDentity_switch_SOURCES) -man8dir = $(mandir)/man8 -NROFF = nroff -MANS = $(man_MANS) -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -docDATA_INSTALL = $(INSTALL_DATA) -DATA = $(doc_DATA) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -103,6 +188,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -127,7 +213,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -135,6 +220,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -148,11 +234,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -168,15 +257,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -203,7 +294,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -212,9 +302,11 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ @@ -223,9 +315,9 @@ usbdropdir = @usbdropdir@ Kobil_mIDentity_switch_SOURCES = Kobil_mIDentity_switch.c Kobil_mIDentity_switch_CFLAGS = $(LIBUSB_CFLAGS) Kobil_mIDentity_switch_LDADD = $(LIBUSB_LIBS) -doc_DATA = README_Kobil_mIDentity_switch.txt -man_MANS = Kobil_mIDentity_switch.8 -EXTRA_DIST = $(doc_DATA) $(man_MANS) +noinst_DATA = README_Kobil_mIDentity_switch.txt +noinst_MANS = Kobil_mIDentity_switch.8 +EXTRA_DIST = $(noinst_DATA) $(noinst_MANS) all: all-am .SUFFIXES: @@ -239,9 +331,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/Kobil_mIDentity_switch/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign contrib/Kobil_mIDentity_switch/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Kobil_mIDentity_switch/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu contrib/Kobil_mIDentity_switch/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -259,37 +351,20 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-sbinPROGRAMS: $(sbin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" - @list='$(sbin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-sbinPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ - rm -f "$(DESTDIR)$(sbindir)/$$f"; \ - done - -clean-sbinPROGRAMS: - @list='$(sbin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -Kobil_mIDentity_switch$(EXEEXT): $(Kobil_mIDentity_switch_OBJECTS) $(Kobil_mIDentity_switch_DEPENDENCIES) +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +Kobil_mIDentity_switch$(EXEEXT): $(Kobil_mIDentity_switch_OBJECTS) $(Kobil_mIDentity_switch_DEPENDENCIES) $(EXTRA_Kobil_mIDentity_switch_DEPENDENCIES) @rm -f Kobil_mIDentity_switch$(EXEEXT) - $(Kobil_mIDentity_switch_LINK) $(Kobil_mIDentity_switch_OBJECTS) $(Kobil_mIDentity_switch_LDADD) $(LIBS) + $(AM_V_CCLD)$(Kobil_mIDentity_switch_LINK) $(Kobil_mIDentity_switch_OBJECTS) $(Kobil_mIDentity_switch_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -300,151 +375,97 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< Kobil_mIDentity_switch-Kobil_mIDentity_switch.o: Kobil_mIDentity_switch.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -MT Kobil_mIDentity_switch-Kobil_mIDentity_switch.o -MD -MP -MF $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.o `test -f 'Kobil_mIDentity_switch.c' || echo '$(srcdir)/'`Kobil_mIDentity_switch.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='Kobil_mIDentity_switch.c' object='Kobil_mIDentity_switch-Kobil_mIDentity_switch.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -MT Kobil_mIDentity_switch-Kobil_mIDentity_switch.o -MD -MP -MF $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.o `test -f 'Kobil_mIDentity_switch.c' || echo '$(srcdir)/'`Kobil_mIDentity_switch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='Kobil_mIDentity_switch.c' object='Kobil_mIDentity_switch-Kobil_mIDentity_switch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.o `test -f 'Kobil_mIDentity_switch.c' || echo '$(srcdir)/'`Kobil_mIDentity_switch.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.o `test -f 'Kobil_mIDentity_switch.c' || echo '$(srcdir)/'`Kobil_mIDentity_switch.c Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj: Kobil_mIDentity_switch.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -MT Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj -MD -MP -MF $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj `if test -f 'Kobil_mIDentity_switch.c'; then $(CYGPATH_W) 'Kobil_mIDentity_switch.c'; else $(CYGPATH_W) '$(srcdir)/Kobil_mIDentity_switch.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='Kobil_mIDentity_switch.c' object='Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -MT Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj -MD -MP -MF $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj `if test -f 'Kobil_mIDentity_switch.c'; then $(CYGPATH_W) 'Kobil_mIDentity_switch.c'; else $(CYGPATH_W) '$(srcdir)/Kobil_mIDentity_switch.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Tpo $(DEPDIR)/Kobil_mIDentity_switch-Kobil_mIDentity_switch.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='Kobil_mIDentity_switch.c' object='Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj `if test -f 'Kobil_mIDentity_switch.c'; then $(CYGPATH_W) 'Kobil_mIDentity_switch.c'; else $(CYGPATH_W) '$(srcdir)/Kobil_mIDentity_switch.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(Kobil_mIDentity_switch_CFLAGS) $(CFLAGS) -c -o Kobil_mIDentity_switch-Kobil_mIDentity_switch.obj `if test -f 'Kobil_mIDentity_switch.c'; then $(CYGPATH_W) 'Kobil_mIDentity_switch.c'; else $(CYGPATH_W) '$(srcdir)/Kobil_mIDentity_switch.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -install-man8: $(man8_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.8*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $$i; then file=$$i; \ - else file=$(srcdir)/$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 8*) ;; \ - *) ext='8' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ - done -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.8*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 8*) ;; \ - *) ext='8' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ - done -install-docDATA: $(doc_DATA) - @$(NORMAL_INSTALL) - test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" - @list='$(doc_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ - $(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ - done -uninstall-docDATA: - @$(NORMAL_UNINSTALL) - @list='$(doc_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ - rm -f "$(DESTDIR)$(docdir)/$$f"; \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -465,23 +486,24 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) +all-am: Makefile $(PROGRAMS) $(DATA) installdirs: - for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(docdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -492,23 +514,29 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am @@ -523,26 +551,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: -install-data-am: install-docDATA install-man +install-data-am: install-dvi: install-dvi-am -install-exec-am: install-sbinPROGRAMS +install-dvi-am: + +install-exec-am: install-html: install-html-am +install-html-am: + install-info: install-info-am -install-man: install-man8 +install-info-am: + +install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -563,27 +603,24 @@ ps: ps-am ps-am: -uninstall-am: uninstall-docDATA uninstall-man uninstall-sbinPROGRAMS - -uninstall-man: uninstall-man8 +uninstall-am: .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-sbinPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-docDATA install-dvi install-dvi-am install-exec \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-man8 install-pdf \ - install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-docDATA uninstall-man uninstall-man8 \ - uninstall-sbinPROGRAMS + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/ccid/ccid/contrib/Makefile.in b/ccid/ccid/contrib/Makefile.in index e8bd657..ddcce4b 100644 --- a/ccid/ccid/contrib/Makefile.in +++ b/ccid/ccid/contrib/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,9 +14,55 @@ @SET_MAKE@ VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -32,34 +78,103 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = RSA_SecurID Kobil_mIDentity_switch DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -74,6 +189,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -98,7 +214,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -106,6 +221,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -119,11 +235,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -139,15 +258,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -174,7 +295,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -183,9 +303,11 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ @@ -205,9 +327,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign contrib/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu contrib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -225,6 +347,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -233,22 +356,25 @@ clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -256,65 +382,20 @@ $(RECURSIVE_TARGETS): else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ @@ -326,38 +407,49 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -378,29 +470,41 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ + am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ @@ -420,16 +524,22 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -448,6 +558,8 @@ dvi-am: html: html-recursive +html-am: + info: info-recursive info-am: @@ -456,18 +568,28 @@ install-data-am: install-dvi: install-dvi-recursive +install-dvi-am: + install-exec-am: install-html: install-html-recursive +install-html-am: + install-info: install-info-recursive +install-info-am: + install-man: install-pdf: install-pdf-recursive +install-pdf-am: + install-ps: install-ps-recursive +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-recursive @@ -488,22 +610,21 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/ccid/ccid/contrib/RSA_SecurID/Makefile.am b/ccid/ccid/contrib/RSA_SecurID/Makefile.am index 95c2040..0ed51e7 100644 --- a/ccid/ccid/contrib/RSA_SecurID/Makefile.am +++ b/ccid/ccid/contrib/RSA_SecurID/Makefile.am @@ -1,9 +1,9 @@ -bin_PROGRAMS = RSA_SecurID_getpasswd +noinst_PROGRAMS = RSA_SecurID_getpasswd RSA_SecurID_getpasswd_SOURCES = RSA_SecurID_getpasswd.c RSA_SecurID_getpasswd_CFLAGS = $(PCSC_CFLAGS) RSA_SecurID_getpasswd_LDADD = $(PCSC_LIBS) -man_MANS = RSA_SecurID_getpasswd.1 +noinst_MANS = RSA_SecurID_getpasswd.1 -EXTRA_DIST = $(man_MANS) +EXTRA_DIST = $(noinst_MANS) diff --git a/ccid/ccid/contrib/RSA_SecurID/Makefile.in b/ccid/ccid/contrib/RSA_SecurID/Makefile.in index 45653ff..5f5eb91 100644 --- a/ccid/ccid/contrib/RSA_SecurID/Makefile.in +++ b/ccid/ccid/contrib/RSA_SecurID/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,9 +15,55 @@ @SET_MAKE@ VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -32,53 +78,100 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -bin_PROGRAMS = RSA_SecurID_getpasswd$(EXEEXT) +noinst_PROGRAMS = RSA_SecurID_getpasswd$(EXEEXT) subdir = contrib/RSA_SecurID -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) am_RSA_SecurID_getpasswd_OBJECTS = \ RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.$(OBJEXT) RSA_SecurID_getpasswd_OBJECTS = $(am_RSA_SecurID_getpasswd_OBJECTS) am__DEPENDENCIES_1 = RSA_SecurID_getpasswd_DEPENDENCIES = $(am__DEPENDENCIES_1) -RSA_SecurID_getpasswd_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +RSA_SecurID_getpasswd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(RSA_SecurID_getpasswd_SOURCES) DIST_SOURCES = $(RSA_SecurID_getpasswd_SOURCES) -man1dir = $(mandir)/man1 -NROFF = nroff -MANS = $(man_MANS) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -93,6 +186,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -117,7 +211,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -125,6 +218,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -138,11 +232,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -158,15 +255,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -193,7 +292,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -202,9 +300,11 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ @@ -213,8 +313,8 @@ usbdropdir = @usbdropdir@ RSA_SecurID_getpasswd_SOURCES = RSA_SecurID_getpasswd.c RSA_SecurID_getpasswd_CFLAGS = $(PCSC_CFLAGS) RSA_SecurID_getpasswd_LDADD = $(PCSC_LIBS) -man_MANS = RSA_SecurID_getpasswd.1 -EXTRA_DIST = $(man_MANS) +noinst_MANS = RSA_SecurID_getpasswd.1 +EXTRA_DIST = $(noinst_MANS) all: all-am .SUFFIXES: @@ -228,9 +328,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/RSA_SecurID/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign contrib/RSA_SecurID/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/RSA_SecurID/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu contrib/RSA_SecurID/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -248,37 +348,20 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -RSA_SecurID_getpasswd$(EXEEXT): $(RSA_SecurID_getpasswd_OBJECTS) $(RSA_SecurID_getpasswd_DEPENDENCIES) +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +RSA_SecurID_getpasswd$(EXEEXT): $(RSA_SecurID_getpasswd_OBJECTS) $(RSA_SecurID_getpasswd_DEPENDENCIES) $(EXTRA_RSA_SecurID_getpasswd_DEPENDENCIES) @rm -f RSA_SecurID_getpasswd$(EXEEXT) - $(RSA_SecurID_getpasswd_LINK) $(RSA_SecurID_getpasswd_OBJECTS) $(RSA_SecurID_getpasswd_LDADD) $(LIBS) + $(AM_V_CCLD)$(RSA_SecurID_getpasswd_LINK) $(RSA_SecurID_getpasswd_OBJECTS) $(RSA_SecurID_getpasswd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -289,134 +372,97 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o: RSA_SecurID_getpasswd.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -MT RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o -MD -MP -MF $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o `test -f 'RSA_SecurID_getpasswd.c' || echo '$(srcdir)/'`RSA_SecurID_getpasswd.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='RSA_SecurID_getpasswd.c' object='RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -MT RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o -MD -MP -MF $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o `test -f 'RSA_SecurID_getpasswd.c' || echo '$(srcdir)/'`RSA_SecurID_getpasswd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='RSA_SecurID_getpasswd.c' object='RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o `test -f 'RSA_SecurID_getpasswd.c' || echo '$(srcdir)/'`RSA_SecurID_getpasswd.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.o `test -f 'RSA_SecurID_getpasswd.c' || echo '$(srcdir)/'`RSA_SecurID_getpasswd.c RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj: RSA_SecurID_getpasswd.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -MT RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj -MD -MP -MF $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj `if test -f 'RSA_SecurID_getpasswd.c'; then $(CYGPATH_W) 'RSA_SecurID_getpasswd.c'; else $(CYGPATH_W) '$(srcdir)/RSA_SecurID_getpasswd.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='RSA_SecurID_getpasswd.c' object='RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -MT RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj -MD -MP -MF $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj `if test -f 'RSA_SecurID_getpasswd.c'; then $(CYGPATH_W) 'RSA_SecurID_getpasswd.c'; else $(CYGPATH_W) '$(srcdir)/RSA_SecurID_getpasswd.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Tpo $(DEPDIR)/RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='RSA_SecurID_getpasswd.c' object='RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj `if test -f 'RSA_SecurID_getpasswd.c'; then $(CYGPATH_W) 'RSA_SecurID_getpasswd.c'; else $(CYGPATH_W) '$(srcdir)/RSA_SecurID_getpasswd.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(RSA_SecurID_getpasswd_CFLAGS) $(CFLAGS) -c -o RSA_SecurID_getpasswd-RSA_SecurID_getpasswd.obj `if test -f 'RSA_SecurID_getpasswd.c'; then $(CYGPATH_W) 'RSA_SecurID_getpasswd.c'; else $(CYGPATH_W) '$(srcdir)/RSA_SecurID_getpasswd.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -install-man1: $(man1_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $$i; then file=$$i; \ - else file=$(srcdir)/$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -437,23 +483,24 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) +all-am: Makefile $(PROGRAMS) installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -464,23 +511,30 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -494,26 +548,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: -install-data-am: install-man +install-data-am: install-dvi: install-dvi-am -install-exec-am: install-binPROGRAMS +install-dvi-am: + +install-exec-am: install-html: install-html-am +install-html-am: + install-info: install-info-am -install-man: install-man1 +install-info-am: + +install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -534,26 +600,24 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-man - -uninstall-man: uninstall-man1 +uninstall-am: .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man1 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-man \ - uninstall-man1 +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/ccid/ccid/contrib/RSA_SecurID/RSA_SecurID_getpasswd.c b/ccid/ccid/contrib/RSA_SecurID/RSA_SecurID_getpasswd.c index 61cf6ac..fb566af 100644 --- a/ccid/ccid/contrib/RSA_SecurID/RSA_SecurID_getpasswd.c +++ b/ccid/ccid/contrib/RSA_SecurID/RSA_SecurID_getpasswd.c @@ -26,7 +26,7 @@ #define PCSC_ERROR_EXIT(rv, text) \ if (rv != SCARD_S_SUCCESS) \ { \ - printf(text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \ + printf(text ": %s (0x%ulX)\n", pcsc_stringify_error(rv), rv); \ goto end; \ } @@ -51,7 +51,7 @@ int main(void) rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); if (rv != SCARD_S_SUCCESS) { - printf("SCardEstablishContext: Cannot Connect to Resource Manager %lX\n", rv); + printf("SCardEstablishContext: Cannot Connect to Resource Manager %ulX\n", rv); return 1; } @@ -101,7 +101,8 @@ int main(void) PCSC_ERROR_EXIT(rv, "SCardTransmit") if ((length != 2) || (bRecvBuffer[0] != 0x90) || (bRecvBuffer[1] != 0x00)) { - printf("cmd1 failed: %02X%02X\n", bRecvBuffer[0], bRecvBuffer[1]); + printf("cmd1 failed (%uld): %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); goto end; } @@ -112,8 +113,8 @@ int main(void) PCSC_ERROR_EXIT(rv, "SCardTransmit") if ((length != 6) || (bRecvBuffer[4] != 0x90) || (bRecvBuffer[5] != 0x00)) { - printf("cmd2 failed (%ld) : %02X%02X\n", length, bRecvBuffer[4], - bRecvBuffer[5]); + printf("cmd2 failed (%uld) : %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); goto end; } @@ -127,8 +128,8 @@ int main(void) PCSC_ERROR_EXIT(rv, "SCardTransmit") if ((length != 2) || (bRecvBuffer[0] != 0x90) || (bRecvBuffer[1] != 0x00)) { - printf("cmd2 failed (%ld) : %02X%02X\n", length, bRecvBuffer[0], - bRecvBuffer[1]); + printf("cmd3 failed (%uld): %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); goto end; } @@ -139,8 +140,8 @@ int main(void) PCSC_ERROR_EXIT(rv, "SCardTransmit") if ((length != 7) || (bRecvBuffer[5] != 0x90) || (bRecvBuffer[6] != 0x00)) { - printf("cmd3 failed (%ld): %02X%02X\n", length, bRecvBuffer[5], - bRecvBuffer[6]); + printf("cmd4 failed (%uld): %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); goto end; } @@ -150,7 +151,7 @@ int main(void) /* We try to leave things as clean as possible */ rv = SCardReleaseContext(hContext); if (rv != SCARD_S_SUCCESS) - printf("SCardReleaseContext: %s (0x%lX)\n", pcsc_stringify_error(rv), + printf("SCardReleaseContext: %s (0x%ulX)\n", pcsc_stringify_error(rv), rv); /* free allocated memory */ diff --git a/ccid/ccid/depcomp b/ccid/ccid/depcomp index e5f9736..4ebd5b3 100755 --- a/ccid/ccid/depcomp +++ b/ccid/ccid/depcomp @@ -1,10 +1,9 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2007-03-29.01 +scriptversion=2013-05-30.07; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software -# Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,9 +16,7 @@ scriptversion=2007-03-29.01 # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -30,9 +27,9 @@ scriptversion=2007-03-29.01 case $1 in '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] @@ -42,11 +39,11 @@ as side-effects. Environment variables: depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. + tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . @@ -59,6 +56,66 @@ EOF ;; esac +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 @@ -71,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" +# Avoid interferences from the environment. +gccflag= dashmflag= + # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case @@ -82,9 +142,32 @@ if test "$depmode" = hp; then fi if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc fi case "$depmode" in @@ -107,8 +190,7 @@ gcc3) done "$@" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -116,13 +198,17 @@ gcc3) ;; gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then @@ -130,31 +216,31 @@ gcc) fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. + # The second -e expression handles DOS-style file names with drive + # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. +## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory +## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as -## well. +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -172,8 +258,7 @@ sgi) "$@" -MDupdate "$tmpdepfile" fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -181,43 +266,41 @@ sgi) if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the + # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> $depfile - echo >> $depfile - + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> $depfile + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" ;; +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the + # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u @@ -230,9 +313,7 @@ aix) "$@" -M fi stat=$? - - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi @@ -241,44 +322,100 @@ aix) do test -f "$tmpdepfile" && break done - if test -f "$tmpdepfile"; then - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : + # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi @@ -290,8 +427,8 @@ icc) sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -302,9 +439,8 @@ hp2) # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + set_dir_from "$object" + set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d @@ -315,8 +451,7 @@ hp2) "$@" +Maked fi stat=$? - if test $stat -eq 0; then : - else + if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi @@ -326,72 +461,107 @@ hp2) test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add `dependent.h:' lines. - sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" else - echo "#dummy" > "$depfile" + make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; #nosideeffect) # This comment above is used by automake to tell side-effect @@ -404,13 +574,13 @@ dashmstdout) # Remove the call to Libtool. if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do + while test "X$1" != 'X--mode=compile'; do shift done shift fi - # Remove `-o $object'. + # Remove '-o $object'. IFS=" " for arg do @@ -430,18 +600,18 @@ dashmstdout) done test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' + # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; @@ -455,41 +625,51 @@ makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do + while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift - cleared=no - for arg in "$@"; do + cleared=no eat=no + for arg + do case $cleared in no) set ""; shift cleared=yes ;; esac + if test $eat = yes; then + eat=no + continue + fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done - obj_suffix="`echo $object | sed 's/^.*\././'`" + obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; @@ -500,13 +680,13 @@ cpp) # Remove the call to Libtool. if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do + while test "X$1" != 'X--mode=compile'; do shift done shift fi - # Remove `-o $object'. + # Remove '-o $object'. IFS=" " for arg do @@ -525,10 +705,10 @@ cpp) esac done - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" @@ -538,35 +718,56 @@ cpp) msvisualcpp) # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. + # always write the preprocessed file to stdout. "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + IFS=" " for arg do case "$arg" in + -o) + shift + ;; + $object) + shift + ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; + set fnord "$@" + shift + shift + ;; *) - set fnord "$@" "$arg" - shift - shift - ;; + set fnord "$@" "$arg" + shift + shift + ;; esac done - "$@" -E | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + none) exec "$@" ;; @@ -585,5 +786,6 @@ exit 0 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: diff --git a/ccid/ccid/examples/GPL-2 b/ccid/ccid/examples/GPL-2 new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/ccid/ccid/examples/GPL-2 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ccid/ccid/examples/Makefile.am b/ccid/ccid/examples/Makefile.am index 0279fad..6e5505a 100644 --- a/ccid/ccid/examples/Makefile.am +++ b/ccid/ccid/examples/Makefile.am @@ -1,7 +1,8 @@ # Process this file with automake to create Makefile.in. noinst_PROGRAMS = scardcontrol -scardcontrol_SOURCES = scardcontrol.c +scardcontrol_SOURCES = scardcontrol.c PCSCv2part10.c PCSCv2part10.h scardcontrol_CFLAGS = $(PCSC_CFLAGS) $(PTHREAD_CFLAGS) scardcontrol_LDADD = $(PCSC_LIBS) $(PTHREAD_LIBS) +EXTRA_DIST = GPL-2 diff --git a/ccid/ccid/examples/Makefile.in b/ccid/ccid/examples/Makefile.in index e9a1b70..619dcf0 100644 --- a/ccid/ccid/examples/Makefile.in +++ b/ccid/ccid/examples/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,9 +17,55 @@ # Process this file with automake to create Makefile.in. VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -36,45 +82,98 @@ build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = scardcontrol$(EXEEXT) subdir = examples -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) -am_scardcontrol_OBJECTS = scardcontrol-scardcontrol.$(OBJEXT) +am_scardcontrol_OBJECTS = scardcontrol-scardcontrol.$(OBJEXT) \ + scardcontrol-PCSCv2part10.$(OBJEXT) scardcontrol_OBJECTS = $(am_scardcontrol_OBJECTS) am__DEPENDENCIES_1 = scardcontrol_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) -scardcontrol_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +scardcontrol_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(scardcontrol_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(scardcontrol_SOURCES) DIST_SOURCES = $(scardcontrol_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -89,6 +188,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -113,7 +213,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -121,6 +220,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -134,11 +234,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -154,15 +257,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -189,7 +294,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -198,17 +302,20 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ usbdropdir = @usbdropdir@ -scardcontrol_SOURCES = scardcontrol.c +scardcontrol_SOURCES = scardcontrol.c PCSCv2part10.c PCSCv2part10.h scardcontrol_CFLAGS = $(PCSC_CFLAGS) $(PTHREAD_CFLAGS) scardcontrol_LDADD = $(PCSC_LIBS) $(PTHREAD_LIBS) +EXTRA_DIST = GPL-2 all: all-am .SUFFIXES: @@ -222,9 +329,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign examples/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -242,16 +349,20 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -scardcontrol$(EXEEXT): $(scardcontrol_OBJECTS) $(scardcontrol_DEPENDENCIES) + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +scardcontrol$(EXEEXT): $(scardcontrol_OBJECTS) $(scardcontrol_DEPENDENCIES) $(EXTRA_scardcontrol_DEPENDENCIES) @rm -f scardcontrol$(EXEEXT) - $(scardcontrol_LINK) $(scardcontrol_OBJECTS) $(scardcontrol_LDADD) $(LIBS) + $(AM_V_CCLD)$(scardcontrol_LINK) $(scardcontrol_OBJECTS) $(scardcontrol_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -259,42 +370,60 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scardcontrol-PCSCv2part10.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scardcontrol-scardcontrol.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< scardcontrol-scardcontrol.o: scardcontrol.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -MT scardcontrol-scardcontrol.o -MD -MP -MF $(DEPDIR)/scardcontrol-scardcontrol.Tpo -c -o scardcontrol-scardcontrol.o `test -f 'scardcontrol.c' || echo '$(srcdir)/'`scardcontrol.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scardcontrol-scardcontrol.Tpo $(DEPDIR)/scardcontrol-scardcontrol.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scardcontrol.c' object='scardcontrol-scardcontrol.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -MT scardcontrol-scardcontrol.o -MD -MP -MF $(DEPDIR)/scardcontrol-scardcontrol.Tpo -c -o scardcontrol-scardcontrol.o `test -f 'scardcontrol.c' || echo '$(srcdir)/'`scardcontrol.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scardcontrol-scardcontrol.Tpo $(DEPDIR)/scardcontrol-scardcontrol.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scardcontrol.c' object='scardcontrol-scardcontrol.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -c -o scardcontrol-scardcontrol.o `test -f 'scardcontrol.c' || echo '$(srcdir)/'`scardcontrol.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -c -o scardcontrol-scardcontrol.o `test -f 'scardcontrol.c' || echo '$(srcdir)/'`scardcontrol.c scardcontrol-scardcontrol.obj: scardcontrol.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -MT scardcontrol-scardcontrol.obj -MD -MP -MF $(DEPDIR)/scardcontrol-scardcontrol.Tpo -c -o scardcontrol-scardcontrol.obj `if test -f 'scardcontrol.c'; then $(CYGPATH_W) 'scardcontrol.c'; else $(CYGPATH_W) '$(srcdir)/scardcontrol.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/scardcontrol-scardcontrol.Tpo $(DEPDIR)/scardcontrol-scardcontrol.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scardcontrol.c' object='scardcontrol-scardcontrol.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -MT scardcontrol-scardcontrol.obj -MD -MP -MF $(DEPDIR)/scardcontrol-scardcontrol.Tpo -c -o scardcontrol-scardcontrol.obj `if test -f 'scardcontrol.c'; then $(CYGPATH_W) 'scardcontrol.c'; else $(CYGPATH_W) '$(srcdir)/scardcontrol.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scardcontrol-scardcontrol.Tpo $(DEPDIR)/scardcontrol-scardcontrol.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scardcontrol.c' object='scardcontrol-scardcontrol.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -c -o scardcontrol-scardcontrol.obj `if test -f 'scardcontrol.c'; then $(CYGPATH_W) 'scardcontrol.c'; else $(CYGPATH_W) '$(srcdir)/scardcontrol.c'; fi` + +scardcontrol-PCSCv2part10.o: PCSCv2part10.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -MT scardcontrol-PCSCv2part10.o -MD -MP -MF $(DEPDIR)/scardcontrol-PCSCv2part10.Tpo -c -o scardcontrol-PCSCv2part10.o `test -f 'PCSCv2part10.c' || echo '$(srcdir)/'`PCSCv2part10.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scardcontrol-PCSCv2part10.Tpo $(DEPDIR)/scardcontrol-PCSCv2part10.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='PCSCv2part10.c' object='scardcontrol-PCSCv2part10.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -c -o scardcontrol-scardcontrol.obj `if test -f 'scardcontrol.c'; then $(CYGPATH_W) 'scardcontrol.c'; else $(CYGPATH_W) '$(srcdir)/scardcontrol.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -c -o scardcontrol-PCSCv2part10.o `test -f 'PCSCv2part10.c' || echo '$(srcdir)/'`PCSCv2part10.c + +scardcontrol-PCSCv2part10.obj: PCSCv2part10.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -MT scardcontrol-PCSCv2part10.obj -MD -MP -MF $(DEPDIR)/scardcontrol-PCSCv2part10.Tpo -c -o scardcontrol-PCSCv2part10.obj `if test -f 'PCSCv2part10.c'; then $(CYGPATH_W) 'PCSCv2part10.c'; else $(CYGPATH_W) '$(srcdir)/PCSCv2part10.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scardcontrol-PCSCv2part10.Tpo $(DEPDIR)/scardcontrol-PCSCv2part10.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='PCSCv2part10.c' object='scardcontrol-PCSCv2part10.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(scardcontrol_CFLAGS) $(CFLAGS) -c -o scardcontrol-PCSCv2part10.obj `if test -f 'PCSCv2part10.c'; then $(CYGPATH_W) 'PCSCv2part10.c'; else $(CYGPATH_W) '$(srcdir)/PCSCv2part10.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -302,49 +431,54 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -365,13 +499,17 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -389,16 +527,22 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -420,6 +564,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -428,18 +574,28 @@ install-data-am: install-dvi: install-dvi-am +install-dvi-am: + install-exec-am: install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -464,18 +620,20 @@ uninstall-am: .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/ccid/ccid/examples/PCSCv2part10.c b/ccid/ccid/examples/PCSCv2part10.c new file mode 100644 index 0000000..d378775 --- /dev/null +++ b/ccid/ccid/examples/PCSCv2part10.c @@ -0,0 +1,127 @@ +/* + PCSCv2part10.c: helper functions for PC/SC v2 part 10 services + Copyright (C) 2012 Ludovic Rousseau + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + * $Id: PCSCv2part10.c 6559 2013-03-06 14:18:24Z rousseau $ + */ + +#include +#include + +#ifdef __APPLE__ +#include +#include +#else +#include +#endif + +#include "PCSCv2part10.h" + +int PCSCv2Part10_find_TLV_property_by_tag_from_buffer( + unsigned char *buffer, int length, int property, int * value_int) +{ + unsigned char *p; + int found = 0, len; + int value = -1; + int ret = -1; /* not found by default */ + + p = buffer; + while (p-buffer < length) + { + if (*p++ == property) + { + found = 1; + break; + } + + /* go to next tag */ + len = *p++; + p += len; + } + + if (found) + { + len = *p++; + ret = 0; + + switch(len) + { + case 1: + value = *p; + break; + case 2: + value = *p + (*(p+1)<<8); + break; + case 4: + value = *p + (*(p+1)<<8) + (*(p+2)<<16) + (*(p+3)<<24); + break; + default: + /* wrong length for an integer */ + ret = -2; + } + } + + if (value_int) + *value_int = value; + + return ret; +} /* PCSCv2Part10_find_TLV_property_by_tag_from_buffer */ + +int PCSCv2Part10_find_TLV_property_by_tag_from_hcard(SCARDHANDLE hCard, + int property, int * value) +{ + unsigned char buffer[MAX_BUFFER_SIZE]; + LONG rv; + DWORD length; + unsigned int i; + PCSC_TLV_STRUCTURE *pcsc_tlv; + DWORD properties_in_tlv_ioctl; + int found; + + rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0, + buffer, sizeof buffer, &length); + if (rv != SCARD_S_SUCCESS) + return -1; + + /* get the number of elements instead of the complete size */ + length /= sizeof(PCSC_TLV_STRUCTURE); + + pcsc_tlv = (PCSC_TLV_STRUCTURE *)buffer; + found = 0; + for (i = 0; i < length; i++) + { + if (FEATURE_GET_TLV_PROPERTIES == pcsc_tlv[i].tag) + { + properties_in_tlv_ioctl = ntohl(pcsc_tlv[i].value); + found = 1; + } + } + + if (! found) + return -3; + + rv= SCardControl(hCard, properties_in_tlv_ioctl, NULL, 0, + buffer, sizeof buffer, &length); + if (rv != SCARD_S_SUCCESS) + return -1; + + return PCSCv2Part10_find_TLV_property_by_tag_from_buffer(buffer, + length, property, value); +} + diff --git a/ccid/ccid/examples/PCSCv2part10.h b/ccid/ccid/examples/PCSCv2part10.h new file mode 100644 index 0000000..ba9e37e --- /dev/null +++ b/ccid/ccid/examples/PCSCv2part10.h @@ -0,0 +1,140 @@ +/* + PCSCv2part10.h: helper functions for PC/SC v2 part 10 services + Copyright (C) 2012 Ludovic Rousseau + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + * $Id: PCSCv2part10.h 6429 2012-08-10 13:20:29Z rousseau $ + */ + +#ifndef __reader_h__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_READER_H +#include +#else + +/** + * Provide source compatibility on different platforms + */ +#define SCARD_CTL_CODE(code) (0x42000000 + (code)) + +/** + * PC/SC part 10 v2.02.07 March 2010 reader tags + */ +#define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400) + +#define FEATURE_GET_TLV_PROPERTIES 0x12 /**< Get TLV properties */ + +#include + +/* Set structure elements aligment on bytes + * http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html */ +#if defined(__APPLE__) | defined(sun) +#pragma pack(1) +#else +#pragma pack(push, 1) +#endif + +/** the structure must be 6-bytes long */ +typedef struct +{ + uint8_t tag; /**< Tag */ + uint8_t length; /**< Length */ + uint32_t value; /**< This value is always in BIG ENDIAN format as documented in PCSC v2 part 10 ch 2.2 page 2. You can use ntohl() for example */ +} PCSC_TLV_STRUCTURE; + +/* restore default structure elements alignment */ +#if defined(__APPLE__) | defined(sun) +#pragma pack() +#else +#pragma pack(pop) +#endif + +/* properties returned by FEATURE_GET_TLV_PROPERTIES */ +#define PCSCv2_PART10_PROPERTY_wLcdLayout 1 /**< wLcdLayout */ +#define PCSCv2_PART10_PROPERTY_bEntryValidationCondition 2 /**< bEntryValidationCondition */ +#define PCSCv2_PART10_PROPERTY_bTimeOut2 3 /**< bTimeOut2 */ +#define PCSCv2_PART10_PROPERTY_wLcdMaxCharacters 4 /**< wLcdMaxCharacters */ +#define PCSCv2_PART10_PROPERTY_wLcdMaxLines 5 /**< wLcdMaxLines */ +#define PCSCv2_PART10_PROPERTY_bMinPINSize 6 /**< bMinPINSize */ +#define PCSCv2_PART10_PROPERTY_bMaxPINSize 7 /**< bMaxPINSize */ +#define PCSCv2_PART10_PROPERTY_sFirmwareID 8 /**< sFirmwareID */ +#define PCSCv2_PART10_PROPERTY_bPPDUSupport 9 /**< bPPDUSupport */ +#define PCSCv2_PART10_PROPERTY_dwMaxAPDUDataSize 10 /**< dwMaxAPDUDataSize */ +#define PCSCv2_PART10_PROPERTY_wIdVendor 11 /**< wIdVendor */ +#define PCSCv2_PART10_PROPERTY_wIdProduct 12 /**< wIdProduct */ + +#endif +#endif + +/** + * @file + * @defgroup API API + * + * The available PC/SC v2 part 10 tags are (from pcsc-lite 1.8.5): + * + * - \ref PCSCv2_PART10_PROPERTY_wLcdLayout + * - \ref PCSCv2_PART10_PROPERTY_bEntryValidationCondition + * - \ref PCSCv2_PART10_PROPERTY_bTimeOut2 + * - \ref PCSCv2_PART10_PROPERTY_wLcdMaxCharacters + * - \ref PCSCv2_PART10_PROPERTY_wLcdMaxLines + * - \ref PCSCv2_PART10_PROPERTY_bMinPINSize + * - \ref PCSCv2_PART10_PROPERTY_bMaxPINSize + * - \ref PCSCv2_PART10_PROPERTY_sFirmwareID + * - \ref PCSCv2_PART10_PROPERTY_bPPDUSupport + * - \ref PCSCv2_PART10_PROPERTY_dwMaxAPDUDataSize + * - \ref PCSCv2_PART10_PROPERTY_wIdVendor + * - \ref PCSCv2_PART10_PROPERTY_wIdProduct + * + * Example of code: + * @include sample.c + */ + +/** + * @brief Find an integer value by tag from TLV buffer + * @ingroup API + * + * @param buffer buffer received from FEATURE_GET_TLV_PROPERTIES + * @param length buffer length + * @param property tag searched + * @param[out] value value found + * @return Error code + * + * @retval 0 success + * @retval -1 not found + * @retval -2 invalid length in the TLV + * + */ +int PCSCv2Part10_find_TLV_property_by_tag_from_buffer( + unsigned char *buffer, int length, int property, int * value); + +/** + * @brief Find a integer value by tag from a PC/SC card handle + * @ingroup API + * + * @param hCard card handle as returned by SCardConnect() + * @param property tag searched + * @param[out] value value found + * @return Error code (see PCSCv2Part10_find_TLV_property_by_tag_from_buffer()) + */ +int PCSCv2Part10_find_TLV_property_by_tag_from_hcard(SCARDHANDLE hCard, + int property, int * value); + diff --git a/ccid/ccid/examples/scardcontrol.c b/ccid/ccid/examples/scardcontrol.c index ce72e06..e4ad276 100644 --- a/ccid/ccid/examples/scardcontrol.c +++ b/ccid/ccid/examples/scardcontrol.c @@ -1,6 +1,6 @@ /* scardcontrol.c: sample code to use/test SCardControl() API - Copyright (C) 2004-2009 Ludovic Rousseau + Copyright (C) 2004-2011 Ludovic Rousseau This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ */ /* - * $Id: scardcontrol.c 4341 2009-07-21 17:54:47Z rousseau $ + * $Id: scardcontrol.c 6566 2013-03-12 14:00:37Z rousseau $ */ #include @@ -35,7 +35,9 @@ #endif #include -#define VERIFY_PIN +#include "PCSCv2part10.h" + +#undef VERIFY_PIN #define MODIFY_PIN #undef GET_GEMPC_FIRMWARE @@ -46,21 +48,124 @@ #define IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE SCARD_CTL_CODE(1) +#define BLUE "\33[34m" +#define RED "\33[31m" +#define BRIGHT_RED "\33[01;31m" +#define GREEN "\33[32m" +#define NORMAL "\33[0m" +#define MAGENTA "\33[35m" + /* PCSC error message pretty print */ #define PCSC_ERROR_EXIT(rv, text) \ if (rv != SCARD_S_SUCCESS) \ { \ - printf(text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \ + printf(text ": " RED "%s (0x%ulX)\n" NORMAL, pcsc_stringify_error(rv), rv); \ goto end; \ } \ else \ - printf(text ": OK\n\n"); + printf(text ": " BLUE "OK\n\n" NORMAL); #define PCSC_ERROR_CONT(rv, text) \ if (rv != SCARD_S_SUCCESS) \ - printf(text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \ + printf(text ": " BLUE "%s (0x%ulX)\n" NORMAL, pcsc_stringify_error(rv), rv); \ else \ - printf(text ": OK\n\n"); + printf(text ": " BLUE "OK\n\n" NORMAL); + +#define PRINT_GREEN(text, value) \ + printf("%s: " GREEN "%s\n" NORMAL, text, value) + +#define PRINT_GREEN_DEC(text, value) \ + printf("%s: " GREEN "%d\n" NORMAL, text, value) + +#define PRINT_RED_DEC(text, value) \ + printf("%s: " RED "%d\n" NORMAL, text, value) + +#define PRINT_GREEN_HEX2(text, value) \ + printf("%s: " GREEN "0x%02X\n" NORMAL, text, value) + +#define PRINT_GREEN_HEX4(text, value) \ + printf("%s: " GREEN "0x%04X\n" NORMAL, text, value) + +static void parse_properties(unsigned char *bRecvBuffer, int length) +{ + unsigned char *p; + int i; + + p = bRecvBuffer; + while (p-bRecvBuffer < length) + { + int tag, len, value; + + tag = *p++; + len = *p++; + + switch(len) + { + case 1: + value = *p; + break; + case 2: + value = *p + (*(p+1)<<8); + break; + case 4: + value = *p + (*(p+1)<<8) + (*(p+2)<<16) + (*(p+3)<<24); + break; + default: + value = -1; + } + + switch(tag) + { + case PCSCv2_PART10_PROPERTY_wLcdLayout: + PRINT_GREEN_HEX4(" wLcdLayout", value); + break; + case PCSCv2_PART10_PROPERTY_bEntryValidationCondition: + PRINT_GREEN_HEX2(" bEntryValidationCondition", value); + break; + case PCSCv2_PART10_PROPERTY_bTimeOut2: + PRINT_GREEN_HEX2(" bTimeOut2", value); + break; + case PCSCv2_PART10_PROPERTY_wLcdMaxCharacters: + PRINT_GREEN_HEX4(" wLcdMaxCharacters", value); + break; + case PCSCv2_PART10_PROPERTY_wLcdMaxLines: + PRINT_GREEN_HEX4(" wLcdMaxLines", value); + break; + case PCSCv2_PART10_PROPERTY_bMinPINSize: + PRINT_GREEN_HEX2(" bMinPINSize", value); + break; + case PCSCv2_PART10_PROPERTY_bMaxPINSize: + PRINT_GREEN_HEX2(" bMaxPINSize", value); + break; + case PCSCv2_PART10_PROPERTY_sFirmwareID: + printf(" sFirmwareID: " GREEN); + for (i=0; i\n"); + printf("V 1.4 © 2004-2010, Ludovic Rousseau \n\n"); - printf("\nTHIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL!\n"); - printf("Do NOT use it unless you really know what you do.\n\n"); + printf(MAGENTA "THIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL!\n"); + printf("Do NOT use it unless you really know what you do.\n\n" NORMAL); rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); if (rv != SCARD_S_SUCCESS) { - printf("SCardEstablishContext: Cannot Connect to Resource Manager %lX\n", rv); + printf("SCardEstablishContext: Cannot Connect to Resource Manager %ulX\n", rv); return 1; } @@ -123,7 +229,7 @@ int main(int argc, char *argv[]) rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders); if (rv != SCARD_S_SUCCESS) - printf("SCardListReader: %lX\n", rv); + printf("SCardListReader: %ulX\n", rv); /* Extract readers from the null separated string and get the total * number of readers */ @@ -176,28 +282,28 @@ int main(int argc, char *argv[]) /* connect to a reader (even without a card) */ dwActiveProtocol = -1; - printf("Using reader: %s\n", readers[reader_nb]); - rv = SCardConnect(hContext, readers[reader_nb], SCARD_SHARE_DIRECT, + printf("Using reader: " GREEN "%s\n" NORMAL, readers[reader_nb]); + rv = SCardConnect(hContext, readers[reader_nb], SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol); - printf(" Protocol: %ld\n", dwActiveProtocol); + printf(" Protocol: " GREEN "%uld\n" NORMAL, dwActiveProtocol); PCSC_ERROR_EXIT(rv, "SCardConnect") #ifdef GET_GEMPC_FIRMWARE /* get GemPC firmware */ printf(" Get GemPC Firmware\n"); - /* this is specific to Gemplus readers */ + /* this is specific to Gemalto readers */ bSendBuffer[0] = 0x02; rv = SCardControl(hCard, IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, bSendBuffer, 1, bRecvBuffer, sizeof(bRecvBuffer), &length); - printf(" Firmware: "); + printf(" Firmware: " GREEN); for (i=0; i wLcdLayout); + PRINT_GREEN_DEC(" bEntryValidationCondition", pin_properties -> bEntryValidationCondition); + PRINT_GREEN_DEC(" bTimeOut2", pin_properties -> bTimeOut2); + + printf("\n"); } +#ifdef GET_GEMPC_FIRMWARE + if (ccid_esc_command) + { + /* get GemPC firmware */ + printf("Get GemPC Firmware\n"); + + /* this is specific to Gemalto readers */ + bSendBuffer[0] = 0x02; + rv = SCardControl(hCard, ccid_esc_command, bSendBuffer, + 1, bRecvBuffer, sizeof(bRecvBuffer), &length); + + printf(" Firmware: " GREEN); + for (i=0; i bTimerOut = 0x00; pin_verify -> bTimerOut2 = 0x00; pin_verify -> bmFormatString = 0x82; pin_verify -> bmPINBlockString = 0x04; pin_verify -> bmPINLengthFormat = 0x00; - pin_verify -> wPINMaxExtraDigit = HOST_TO_CCID_16(0x0408); /* Min Max */ + pin_verify -> wPINMaxExtraDigit = 0x0408; /* Min Max */ pin_verify -> bEntryValidationCondition = 0x02; /* validation key pressed */ pin_verify -> bNumberMessage = 0x01; - pin_verify -> wLangId = HOST_TO_CCID_16(0x0904); + pin_verify -> wLangId = 0x0904; pin_verify -> bMsgIndex = 0x00; pin_verify -> bTeoPrologue[0] = 0x00; pin_verify -> bTeoPrologue[1] = 0x00; @@ -369,7 +566,7 @@ int main(int argc, char *argv[]) pin_verify -> abData[offset++] = 0x00; /* '\0' */ pin_verify -> abData[offset++] = 0x00; /* '\0' */ pin_verify -> abData[offset++] = 0x00; /* '\0' */ - pin_verify -> ulDataLength = HOST_TO_CCID_32(offset); /* APDU size */ + pin_verify -> ulDataLength = offset; /* APDU size */ length = sizeof(PIN_VERIFY_STRUCTURE) + offset -1; /* -1 because PIN_VERIFY_STRUCTURE contains the first byte of abData[] */ @@ -471,23 +668,28 @@ int main(int argc, char *argv[]) * bConfirmPIN = 1, bNumberMessage = 2: "New Pin" "Confirm Pin" * bConfirmPIN = 0, bNumberMessage = 1: "New Pin" */ + /* table for bMsgIndex[1-3] + * 00: PIN insertion prompt “ENTER SMARTCARD PIN” + * 01: PIN Modification prompt “ ENTER NEW PIN” + * 02: NEW PIN Confirmation prompt “ CONFIRM NEW PIN” + */ /* PC/SC v2.02.05 Part 10 PIN modification data structure */ pin_modify -> bTimerOut = 0x00; pin_modify -> bTimerOut2 = 0x00; pin_modify -> bmFormatString = 0x82; pin_modify -> bmPINBlockString = 0x04; pin_modify -> bmPINLengthFormat = 0x00; - pin_modify -> bInsertionOffsetOld = 0x00; /* offset from APDU start */ + pin_modify -> bInsertionOffsetOld = 0x00; /* offset from APDU start */ pin_modify -> bInsertionOffsetNew = 0x04; /* offset from APDU start */ - pin_modify -> wPINMaxExtraDigit = HOST_TO_CCID_16(0x0408); /* Min Max */ + pin_modify -> wPINMaxExtraDigit = 0x0408; /* Min Max */ pin_modify -> bConfirmPIN = 0x03; /* b0 set = confirmation requested */ /* b1 set = current PIN entry requested */ pin_modify -> bEntryValidationCondition = 0x02; /* validation key pressed */ pin_modify -> bNumberMessage = 0x03; /* see table above */ - pin_modify -> wLangId = HOST_TO_CCID_16(0x0904); + pin_modify -> wLangId = 0x0904; pin_modify -> bMsgIndex1 = 0x00; - pin_modify -> bMsgIndex2 = 0x00; - pin_modify -> bMsgIndex3 = 0x00; + pin_modify -> bMsgIndex2 = 0x01; + pin_modify -> bMsgIndex3 = 0x02; pin_modify -> bTeoPrologue[0] = 0x00; pin_modify -> bTeoPrologue[1] = 0x00; pin_modify -> bTeoPrologue[2] = 0x00; @@ -508,7 +710,7 @@ int main(int argc, char *argv[]) pin_modify -> abData[offset++] = 0x30; /* '0' */ pin_modify -> abData[offset++] = 0x30; /* '0' */ pin_modify -> abData[offset++] = 0x30; /* '0' */ - pin_modify -> ulDataLength = HOST_TO_CCID_32(offset); /* APDU size */ + pin_modify -> ulDataLength = offset; /* APDU size */ length = sizeof(PIN_MODIFY_STRUCTURE) + offset -1; /* -1 because PIN_MODIFY_STRUCTURE contains the first byte of abData[] */ @@ -548,9 +750,11 @@ int main(int argc, char *argv[]) { /* read the fake digits */ char in[40]; /* 4 digits + \n + \0 */ + char *ret; - (void)fgets(in, sizeof(in), stdin); - printf("keyboard sent: %s", in); + ret = fgets(in, sizeof(in), stdin); + if (ret) + printf("keyboard sent: %s", in); } } } @@ -601,7 +805,7 @@ int main(int argc, char *argv[]) /* We try to leave things as clean as possible */ rv = SCardReleaseContext(hContext); if (rv != SCARD_S_SUCCESS) - printf("SCardReleaseContext: %s (0x%lX)\n", pcsc_stringify_error(rv), + printf("SCardReleaseContext: %s (0x%ulX)\n", pcsc_stringify_error(rv), rv); /* free allocated memory */ diff --git a/ccid/ccid/install-sh b/ccid/ccid/install-sh index a5897de..377bb86 100755 --- a/ccid/ccid/install-sh +++ b/ccid/ccid/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2006-12-25.00 +scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,7 +35,7 @@ scriptversion=2006-12-25.00 # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it +# 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written @@ -156,6 +156,10 @@ while test $# -ne 0; do -s) stripcmd=$stripprog;; -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac shift;; -T) no_target_directory=true;; @@ -186,6 +190,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then fi shift # arg dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac done fi @@ -194,13 +202,17 @@ if test $# -eq 0; then echo "$0: no input file specified." >&2 exit 1 fi - # It's OK to call `install-sh -d' without argument. + # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. @@ -228,9 +240,9 @@ fi for src do - # Protect names starting with `-'. + # Protect names problematic for 'test' and other utilities. case $src in - -*) src=./$src;; + -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then @@ -252,12 +264,7 @@ do echo "$0: no destination specified." >&2 exit 1 fi - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. @@ -347,7 +354,7 @@ do if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. + # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in @@ -385,7 +392,7 @@ do case $dstdir in /*) prefix='/';; - -*) prefix='./';; + [-=\(\)!]*) prefix='./';; *) prefix='';; esac @@ -403,7 +410,7 @@ do for d do - test -z "$d" && continue + test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then @@ -515,5 +522,6 @@ done # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: diff --git a/ccid/ccid/ltmain.sh b/ccid/ccid/ltmain.sh old mode 100755 new mode 100644 index 3506ead..68c6d96 --- a/ccid/ccid/ltmain.sh +++ b/ccid/ccid/ltmain.sh @@ -1,9 +1,9 @@ -# Generated from ltmain.m4sh. -# ltmain.sh (GNU libtool) 2.2.6 +# libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. @@ -32,50 +32,57 @@ # # Provide generalized library-building support services. # -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print informational messages (default) -# --version print version information -# -h, --help print short or long help message +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory # -# MODE-ARGS vary depending on the MODE. +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.2.6 Debian-2.2.6a-4 -# automake: $automake_version -# autoconf: $autoconf_version +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.3 +# automake: $automake_version +# autoconf: $autoconf_version # # Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . -PROGRAM=ltmain.sh +PROGRAM=libtool PACKAGE=libtool -VERSION="2.2.6 Debian-2.2.6a-4" +VERSION="2.4.2 Debian-2.4.2-1.3" TIMESTAMP="" -package_revision=1.3012 +package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then @@ -91,10 +98,15 @@ fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + # NLS nuisances: We save the old values to restore during execute mode. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES @@ -107,24 +119,28 @@ do lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL $lt_unset CDPATH +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" : ${CP="cp -f"} -: ${ECHO="echo"} -: ${EGREP="/bin/grep -E"} -: ${FGREP="/bin/grep -F"} -: ${GREP="/bin/grep"} -: ${LN_S="ln -s"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} -: ${SED="/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} @@ -144,6 +160,27 @@ IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: @@ -158,33 +195,183 @@ basename="s,^.*/,," # those functions but instead duplicate the functionality here. func_dirname_and_basename () { - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } -# Generated shell functions inserted here. +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} # The name of this program: -# In the unlikely event $progname began with a '-', it would play havoc with -# func_echo (imagine progname=-n), so we prepend ./ in that case: func_dirname_and_basename "$progpath" progname=$func_basename_result -case $progname in - -*) progname=./$progname ;; -esac # Make sure we have an absolute path for reexecution: case $progpath in @@ -196,7 +383,7 @@ case $progpath in ;; *) save_IFS="$IFS" - IFS=: + IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break @@ -215,6 +402,15 @@ sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. @@ -243,7 +439,7 @@ opt_warning=: # name if it has been set yet. func_echo () { - $ECHO "$progname${mode+: }$mode: $*" + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... @@ -258,18 +454,25 @@ func_verbose () : } +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + # func_error arg... # Echo program name prefixed message to standard error. func_error () { - $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { - $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : @@ -326,9 +529,9 @@ func_mkdir_p () case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done - my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do @@ -378,7 +581,7 @@ func_mktempdir () func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi - $ECHO "X$my_tmpdir" | $Xsed + $ECHO "$my_tmpdir" } @@ -392,7 +595,7 @@ func_quote_for_eval () { case $1 in *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac @@ -419,7 +622,7 @@ func_quote_for_expand () { case $1 in *[\\\`\"]*) - my_arg=`$ECHO "X$1" | $Xsed \ + my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; @@ -488,15 +691,39 @@ func_show_eval_locale () fi } - - +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} # func_version # Echo version message to standard output and exit. func_version () { - $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ @@ -509,22 +736,28 @@ func_version () # Echo short help message to standard output and exit. func_usage () { - $SED -n '/^# Usage:/,/# -h/ { + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" - $ECHO + echo $ECHO "run \`$progname --help | more' for full usage" exit $? } -# func_help -# Echo long help message to standard output and exit. +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. func_help () { + $opt_debug + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print s/^# // s/^# *$// s*\$progname*'$progname'* @@ -534,11 +767,18 @@ func_help () s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p - }' < "$progpath" - exit $? + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi } # func_missing_arg argname @@ -546,63 +786,106 @@ func_help () # exit_cmd. func_missing_arg () { - func_error "missing argument for $1" + $opt_debug + + func_error "missing argument for $1." exit_cmd=exit } -exit_cmd=: +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: -# Check that we have a working $ECHO. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell, and then maybe $ECHO will work. - exec $SHELL "$progpath" --no-reexec ${1+"$@"} -fi -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. @@ -636,16 +919,16 @@ func_config () # Display the features supported by this script. func_features () { - $ECHO "host: $host" + echo "host: $host" if test "$build_libtool_libs" = yes; then - $ECHO "enable shared libraries" + echo "enable shared libraries" else - $ECHO "disable shared libraries" + echo "disable shared libraries" fi if test "$build_old_libs" = yes; then - $ECHO "enable static libraries" + echo "enable static libraries" else - $ECHO "disable static libraries" + echo "disable static libraries" fi exit $? @@ -692,117 +975,209 @@ func_enable_tag () esac } -# Parse options once, thoroughly. This comes as soon as possible in -# the script to make things like `libtool --version' happen quickly. +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () { + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false - # Shorthand for --mode=foo, only valid as the first argument - case $1 in - clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; - compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; - execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; - finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; - install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; - link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; - uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; - esac - # Parse non-mode specific arguments: - while test "$#" -gt 0; do +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do opt="$1" shift - case $opt in - --config) func_config ;; - - --debug) preserve_args="$preserve_args $opt" + --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" - opt_debug='set -x' $opt_debug ;; - - -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break - execute_dlfiles="$execute_dlfiles $1" - shift + --dry-run|--dryrun|-n) + opt_dry_run=: ;; - - --dry-run | -n) opt_dry_run=: ;; - --features) func_features ;; - --finish) mode="finish" ;; - - --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break - case $1 in - # Valid mode arguments: - clean) ;; - compile) ;; - execute) ;; - finish) ;; - install) ;; - link) ;; - relink) ;; - uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; - esac - - mode="$1" + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" shift ;; - --preserve-dup-deps) - opt_duplicate_deps=: ;; - - --quiet|--silent) preserve_args="$preserve_args $opt" - opt_silent=: + opt_preserve_dup_deps=: ;; - - --verbose| -v) preserve_args="$preserve_args $opt" + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) opt_silent=false +func_append preserve_args " $opt" ;; - - --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break - preserve_args="$preserve_args $opt $1" - func_enable_tag "$1" # tagname is set here + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" shift ;; + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + # Separate optargs to long options: - -dlopen=*|--mode=*|--tag=*) - func_opt_split "$opt" - set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; - -\?|-h) func_usage ;; - --help) opt_help=: ;; - --version) func_version ;; - - -*) func_fatal_help "unrecognized option \`$opt'" ;; - - *) nonopt="$opt" - break + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) @@ -810,82 +1185,44 @@ func_enable_tag () opt_duplicate_compiler_generated_deps=: ;; *) - opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac - # Having warned about all mis-specified options, bail out if - # anything was wrong. - $exit_cmd $EXIT_FAILURE -} + $opt_help || { + # Sanity checks first: + func_check_version_match -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" fi - exit $EXIT_MISMATCH - fi -} - - -## ----------- ## -## Main. ## -## ----------- ## - -$opt_help || { - # Sanity checks first: - func_check_version_match + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi - test -z "$mode" && func_fatal_error "error: you must specify a MODE." + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$mode' for more information." -} +## ----------- ## +## Main. ## +## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. @@ -950,12 +1287,9 @@ func_ltwrapper_executable_p () # temporary ltwrapper_script. func_ltwrapper_scriptname () { - func_ltwrapper_scriptname_result="" - if func_ltwrapper_executable_p "$1"; then - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" - fi + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file @@ -1001,6 +1335,37 @@ func_source () } +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. @@ -1013,13 +1378,15 @@ func_infer_tag () if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do - func_quote_for_eval "$arg" - CC_quoted="$CC_quoted $func_quote_for_eval_result" + func_append_quoted CC_quoted "$arg" done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) @@ -1030,11 +1397,13 @@ func_infer_tag () CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. - func_quote_for_eval "$arg" - CC_quoted="$CC_quoted $func_quote_for_eval_result" + func_append_quoted CC_quoted "$arg" done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in - " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. @@ -1097,6 +1466,486 @@ EOF } } + +################################################## +# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # +################################################## + +# func_convert_core_file_wine_to_w32 ARG +# Helper function used by file name conversion functions when $build is *nix, +# and $host is mingw, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. +# +# ARG is the $build file name to be converted to w32 format. +# Result is available in $func_convert_core_file_wine_to_w32_result, and will +# be empty on error (or when ARG is empty) +func_convert_core_file_wine_to_w32 () +{ + $opt_debug + func_convert_core_file_wine_to_w32_result="$1" + if test -n "$1"; then + # Unfortunately, winepath does not exit with a non-zero error code, so we + # are forced to check the contents of stdout. On the other hand, if the + # command is not found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both error code of + # zero AND non-empty stdout, which explains the odd construction: + func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + # func_mode_compile arg... func_mode_compile () { @@ -1137,12 +1986,12 @@ func_mode_compile () ;; -pie | -fpie | -fPIE) - pie_flag="$pie_flag $arg" + func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) - later="$later $arg" + func_append later " $arg" continue ;; @@ -1163,15 +2012,14 @@ func_mode_compile () save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" - func_quote_for_eval "$arg" - lastarg="$lastarg $func_quote_for_eval_result" + func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. - base_compile="$base_compile $lastarg" + func_append base_compile " $lastarg" continue ;; @@ -1187,8 +2035,7 @@ func_mode_compile () esac # case $arg_mode # Aesthetically quote the previous argument. - func_quote_for_eval "$lastarg" - base_compile="$base_compile $func_quote_for_eval_result" + func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in @@ -1213,7 +2060,7 @@ func_mode_compile () *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.obj | *.sx) + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; @@ -1288,7 +2135,7 @@ func_mode_compile () # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then - output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= @@ -1319,17 +2166,16 @@ compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi - removelist="$removelist $output_obj" + func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist - removelist="$removelist $lockfile" + func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result @@ -1349,7 +2195,7 @@ compiler." if test -z "$output_obj"; then # Place PIC objects in $objdir - command="$command -o $lobj" + func_append command " -o $lobj" fi func_show_eval_locale "$command" \ @@ -1396,11 +2242,11 @@ compiler." command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then - command="$command -o $obj" + func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. - command="$command$suppress_output" + func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' @@ -1445,13 +2291,13 @@ compiler." } $opt_help || { -test "$mode" = compile && func_mode_compile ${1+"$@"} + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. - case $mode in + case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. @@ -1482,10 +2328,11 @@ This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. @@ -1538,7 +2385,7 @@ either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: - -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." @@ -1558,6 +2405,8 @@ The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) @@ -1586,6 +2435,11 @@ The following components of LINK-COMMAND are treated specially: -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. @@ -1619,18 +2473,44 @@ Otherwise, only FILE itself is deleted using RM." ;; *) - func_fatal_help "invalid operation mode \`$mode'" + func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac - $ECHO + echo $ECHO "Try \`$progname --help' for more information about other modes." - - exit $? } - # Now that we've collected a possible --mode arg, show help if necessary - $opt_help && func_mode_help +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi # func_mode_execute arg... @@ -1643,13 +2523,16 @@ func_mode_execute () func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do + for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" @@ -1671,7 +2554,7 @@ func_mode_execute () dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" + func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" @@ -1712,7 +2595,7 @@ func_mode_execute () for file do case $file in - -*) ;; + -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then @@ -1728,8 +2611,7 @@ func_mode_execute () ;; esac # Quote arguments (to preserve shell metacharacters). - func_quote_for_eval "$file" - args="$args $func_quote_for_eval_result" + func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then @@ -1754,29 +2636,66 @@ func_mode_execute () # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - $ECHO "export $shlibpath_var" + echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } -test "$mode" = execute && func_mode_execute ${1+"$@"} +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug - libdirs="$nonopt" + libs= + libdirs= admincmds= - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. @@ -1786,7 +2705,7 @@ func_mode_finish () if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done @@ -1795,53 +2714,55 @@ func_mode_finish () # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS - $ECHO "X----------------------------------------------------------------------" | $Xsed - $ECHO "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - $ECHO - $ECHO "If you ever happen to want to link against installed libraries" - $ECHO "in a given directory, LIBDIR, you must either use libtool, and" - $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" - $ECHO "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" - $ECHO " during execution" - fi - if test -n "$runpath_var"; then - $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" - $ECHO " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - $ECHO + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo - $ECHO "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" - $ECHO "pages." - ;; - *) - $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - $ECHO "X----------------------------------------------------------------------" | $Xsed + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi exit $EXIT_SUCCESS } -test "$mode" = finish && func_mode_finish ${1+"$@"} +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... @@ -1852,7 +2773,7 @@ func_mode_install () # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. - $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " @@ -1866,7 +2787,12 @@ func_mode_install () # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" - install_prog="$install_prog$func_quote_for_eval_result" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac # We need to accept at least all the BSD install flags. dest= @@ -1876,10 +2802,12 @@ func_mode_install () install_type= isdir=no stripme= + no_mode=: for arg do + arg2= if test -n "$dest"; then - files="$files $dest" + func_append files " $dest" dest=$arg continue fi @@ -1887,10 +2815,9 @@ func_mode_install () case $arg in -d) isdir=yes ;; -f) - case " $install_prog " in - *[\\\ /]cp\ *) ;; - *) prev=$arg ;; - esac + if $install_cp; then :; else + prev=$arg + fi ;; -g | -m | -o) prev=$arg @@ -1904,6 +2831,10 @@ func_mode_install () *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi prev= else dest=$arg @@ -1914,7 +2845,11 @@ func_mode_install () # Aesthetically quote the argument. func_quote_for_eval "$arg" - install_prog="$install_prog $func_quote_for_eval_result" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ @@ -1923,6 +2858,13 @@ func_mode_install () test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" @@ -1977,10 +2919,13 @@ func_mode_install () case $file in *.$libext) # Do the static libraries later. - staticlibs="$staticlibs $file" + func_append staticlibs " $file" ;; *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" @@ -1994,23 +2939,23 @@ func_mode_install () if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; + *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; + *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" - dir="$dir$objdir" + func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that @@ -2023,9 +2968,9 @@ func_mode_install () if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" @@ -2043,7 +2988,7 @@ func_mode_install () test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. - func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in @@ -2083,7 +3028,7 @@ func_mode_install () func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) @@ -2183,7 +3128,7 @@ func_mode_install () if test -f "$lib"; then func_source "$lib" fi - libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no @@ -2202,7 +3147,7 @@ func_mode_install () file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. - relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" @@ -2221,7 +3166,7 @@ func_mode_install () } else # Install the binary that we compiled earlier. - file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi @@ -2257,11 +3202,13 @@ func_mode_install () # Set up the ranlib parameters. oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $oldlib" 'exit $?' + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. @@ -2280,7 +3227,7 @@ func_mode_install () fi } -test "$mode" = install && func_mode_install ${1+"$@"} +test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p @@ -2323,6 +3270,22 @@ func_generate_dlsyms () extern \"C\" { #endif +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + /* External symbol declarations for the compiler. */\ " @@ -2332,10 +3295,11 @@ extern \"C\" { $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. - progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do - func_verbose "extracting global C symbols from \`$progfile'" - $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then @@ -2371,7 +3335,7 @@ extern \"C\" { eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in - *cygwin | *mingw* | *cegcc* ) + *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; @@ -2384,10 +3348,52 @@ extern \"C\" { func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac done $opt_dry_run || { @@ -2415,36 +3421,19 @@ extern \"C\" { if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else - $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi - $ECHO >> "$output_objdir/$my_dlsyms" "\ + echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; -" - case $host in - *cygwin* | *mingw* | *cegcc* ) - $ECHO >> "$output_objdir/$my_dlsyms" "\ -/* DATA imports from DLLs on WIN32 con't be const, because - runtime relocations are performed -- see ld's documentation - on pseudo-relocs. */" - lt_dlsym_const= ;; - *osf5*) - echo >> "$output_objdir/$my_dlsyms" "\ -/* This system does not cope well with relocations in const data */" - lt_dlsym_const= ;; - *) - lt_dlsym_const=const ;; - esac - - $ECHO >> "$output_objdir/$my_dlsyms" "\ -extern $lt_dlsym_const lt_dlsymlist +extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; -$lt_dlsym_const lt_dlsymlist +LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," @@ -2457,7 +3446,7 @@ lt_${my_prefix}_LTX_preloaded_symbols[] = eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac - $ECHO >> "$output_objdir/$my_dlsyms" "\ + echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; @@ -2484,7 +3473,7 @@ static const void *lt_preloaded_setup() { # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; @@ -2500,7 +3489,7 @@ static const void *lt_preloaded_setup() { for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; - *) symtab_cflags="$symtab_cflags $arg" ;; + *) func_append symtab_cflags " $arg" ;; esac done @@ -2515,16 +3504,16 @@ static const void *lt_preloaded_setup() { case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; @@ -2538,8 +3527,8 @@ static const void *lt_preloaded_setup() { # really was required. # Nullify the symbol file. - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } @@ -2549,6 +3538,7 @@ static const void *lt_preloaded_setup() { # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug @@ -2559,9 +3549,11 @@ func_win32_libid () win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then - win32_nmres=`eval $NM -f posix -A $1 | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ @@ -2590,6 +3582,131 @@ func_win32_libid () $ECHO "$win32_libid_type" } +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} # func_extract_an_archive dir oldlib @@ -2598,7 +3715,18 @@ func_extract_an_archive () $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else @@ -2669,7 +3797,7 @@ func_extract_archives () darwin_file= darwin_files= for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ @@ -2684,25 +3812,30 @@ func_extract_archives () func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } - -# func_emit_wrapper_part1 [arg=no] +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. # -# Emit the first part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part1 () +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () { - func_emit_wrapper_part1_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part1_arg1=$1 - fi + func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL @@ -2718,7 +3851,6 @@ func_emit_wrapper_part1 () # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible @@ -2749,31 +3881,135 @@ if test \"\$libtool_install_magic\" = \"$magic\"; then else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then - ECHO=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$ECHO works! - : - else - # Restart under the correct shell, and then maybe \$ECHO will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ " - $ECHO "\ + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. - thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do - destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then @@ -2783,30 +4019,13 @@ else esac fi - file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done -" -} -# end: func_emit_wrapper_part1 - -# func_emit_wrapper_part2 [arg=no] -# -# Emit the second part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part2 () -{ - func_emit_wrapper_part2_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part2_arg1=$1 - fi - - $ECHO "\ # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then @@ -2814,7 +4033,7 @@ func_emit_wrapper_part2 () fi # remove .libs from thisdir case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi @@ -2869,6 +4088,18 @@ func_emit_wrapper_part2 () if test -f \"\$progdir/\$program\"; then" + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ @@ -2877,253 +4108,28 @@ func_emit_wrapper_part2 () # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 + func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } -# end: func_emit_wrapper_part2 - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=no - if test -n "$1" ; then - func_emit_wrapper_arg1=$1 - fi - - # split this up so that func_emit_cwrapperexe_src - # can call each part independently. - func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" - func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" -} - - -# func_to_host_path arg -# -# Convert paths to host format when used with build tools. -# Intended for use with "native" mingw (where libtool itself -# is running under the msys shell), or in the following cross- -# build environments: -# $build $host -# mingw (msys) mingw [e.g. native] -# cygwin mingw -# *nix + wine mingw -# where wine is equipped with the `winepath' executable. -# In the native mingw case, the (msys) shell automatically -# converts paths for any non-msys applications it launches, -# but that facility isn't available from inside the cwrapper. -# Similar accommodations are necessary for $host mingw and -# $build cygwin. Calling this function does no harm for other -# $host/$build combinations not listed above. -# -# ARG is the path (on $build) that should be converted to -# the proper representation for $host. The result is stored -# in $func_to_host_path_result. -func_to_host_path () -{ - func_to_host_path_result="$1" - if test -n "$1" ; then - case $host in - *mingw* ) - lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - case $build in - *mingw* ) # actually, msys - # awkward: cmd appends spaces to result - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_path_tmp1=`( cmd //c echo "$1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - *cygwin* ) - func_to_host_path_tmp1=`cygpath -w "$1"` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - * ) - # Unfortunately, winepath does not exit with a non-zero - # error code, so we are forced to check the contents of - # stdout. On the other hand, if the command is not - # found, the shell will set an exit code of 127 and print - # *an error message* to stdout. So we must check for both - # error code of zero AND non-empty stdout, which explains - # the odd construction: - func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` - if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - else - # Allow warning below. - func_to_host_path_result="" - fi - ;; - esac - if test -z "$func_to_host_path_result" ; then - func_error "Could not determine host path corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_path_result="$1" - fi - ;; - esac - fi -} -# end: func_to_host_path -# func_to_host_pathlist arg -# -# Convert pathlists to host format when used with build tools. -# See func_to_host_path(), above. This function supports the -# following $build/$host combinations (but does no harm for -# combinations not listed here): -# $build $host -# mingw (msys) mingw [e.g. native] -# cygwin mingw -# *nix + wine mingw -# -# Path separators are also converted from $build format to -# $host format. If ARG begins or ends with a path separator -# character, it is preserved (but converted to $host format) -# on output. -# -# ARG is a pathlist (on $build) that should be converted to -# the proper representation on $host. The result is stored -# in $func_to_host_pathlist_result. -func_to_host_pathlist () -{ - func_to_host_pathlist_result="$1" - if test -n "$1" ; then - case $host in - *mingw* ) - lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_to_host_pathlist_tmp2="$1" - # Once set for this call, this variable should not be - # reassigned. It is used in tha fallback case. - func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e 's|^:*||' -e 's|:*$||'` - case $build in - *mingw* ) # Actually, msys. - # Awkward: cmd appends spaces to result. - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - *cygwin* ) - func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - * ) - # unfortunately, winepath doesn't convert pathlists - func_to_host_pathlist_result="" - func_to_host_pathlist_oldIFS=$IFS - IFS=: - for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do - IFS=$func_to_host_pathlist_oldIFS - if test -n "$func_to_host_pathlist_f" ; then - func_to_host_path "$func_to_host_pathlist_f" - if test -n "$func_to_host_path_result" ; then - if test -z "$func_to_host_pathlist_result" ; then - func_to_host_pathlist_result="$func_to_host_path_result" - else - func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" - fi - fi - fi - IFS=: - done - IFS=$func_to_host_pathlist_oldIFS - ;; - esac - if test -z "$func_to_host_pathlist_result" ; then - func_error "Could not determine the host path(s) corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This may break if $1 contains DOS-style drive - # specifications. The fix is not to complicate the expression - # below, but for the user to provide a working wine installation - # with winepath so that path translation in the cross-to-mingw - # case works properly. - lt_replace_pathsep_nix_to_dos="s|:|;|g" - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_replace_pathsep_nix_to_dos"` - fi - # Now, add the leading and trailing path separators back - case "$1" in - :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" - ;; - esac - case "$1" in - *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" - ;; - esac - ;; - esac - fi -} -# end: func_to_host_pathlist # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout @@ -3141,31 +4147,23 @@ func_emit_cwrapperexe_src () This wrapper executable should never be moved out of the build directory. If it is, it will not operate correctly. - - Currently, it simply execs the wrapper *script* "$SHELL $output", - but could eventually absorb all of the scripts functionality and - exec $objdir/$outputname directly. */ EOF cat <<"EOF" +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE 1 +#endif #include #include #ifdef _MSC_VER # include # include # include -# define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include -# define HAVE_SETENV -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif # endif #endif #include @@ -3177,6 +4175,44 @@ int setenv (const char *, const char *, int); #include #include +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) @@ -3192,14 +4228,7 @@ int setenv (const char *, const char *, int); # define S_IXGRP 0 #endif -#ifdef _MSC_VER -# define S_IXUSR _S_IEXEC -# define stat _stat -# ifndef _INTPTR_T_DEFINED -# define intptr_t int -# endif -#endif - +/* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' @@ -3230,10 +4259,6 @@ int setenv (const char *, const char *, int); # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ -#ifdef __CYGWIN__ -# define FOPEN_WB "wb" -#endif - #ifndef FOPEN_WB # define FOPEN_WB "w" #endif @@ -3246,22 +4271,13 @@ int setenv (const char *, const char *, int); if (stale) { free ((void *) stale); stale = 0; } \ } while (0) -#undef LTWRAPPER_DEBUGPRINTF -#if defined DEBUGWRAPPER -# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args -static void -ltwrapper_debugprintf (const char *fmt, ...) -{ - va_list args; - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); -} +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; #else -# define LTWRAPPER_DEBUGPRINTF(args) +static int lt_debug = 0; #endif -const char *program_name = NULL; +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); @@ -3271,41 +4287,27 @@ char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); -void lt_fatal (const char *message, ...); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_opt_process_env_set (const char *arg); -void lt_opt_process_env_prepend (const char *arg); -void lt_opt_process_env_append (const char *arg); -int lt_split_name_value (const char *arg, char** name, char** value); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); - -static const char *script_text_part1 = -EOF - - func_emit_wrapper_part1 yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ "/' -e 's/$/\\n"/' - echo ";" - cat <"))); + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", + nonnull (lt_argv_zero)); for (i = 0; i < newargc; i++) { - LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", + i, nonnull (newargz[i])); } EOF @@ -3560,11 +4523,14 @@ EOF mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ + newargz = prepare_spawn (newargz); rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ - LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + lt_debugprintf (__FILE__, __LINE__, + "(main) failed to launch target \"%s\": %s\n", + lt_argv_zero, nonnull (strerror (errno))); return 127; } return rval; @@ -3586,7 +4552,7 @@ xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) - lt_fatal ("Memory exhausted"); + lt_fatal (__FILE__, __LINE__, "memory exhausted"); return p; } @@ -3620,8 +4586,8 @@ check_executable (const char *path) { struct stat st; - LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", + nonempty (path)); if ((!path) || (!*path)) return 0; @@ -3638,8 +4604,8 @@ make_executable (const char *path) int rval = 0; struct stat st; - LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); if ((!path) || (!*path)) return 0; @@ -3665,8 +4631,8 @@ find_executable (const char *wrapper) int tmp_len; char *concat_name; - LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", - wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; @@ -3719,7 +4685,8 @@ find_executable (const char *wrapper) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); @@ -3744,7 +4711,8 @@ find_executable (const char *wrapper) } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); @@ -3770,8 +4738,9 @@ chase_symlinks (const char *pathspec) int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { - LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", - tmp_pathspec)); + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) @@ -3793,8 +4762,9 @@ chase_symlinks (const char *pathspec) } else { - char *errstr = strerror (errno); - lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); @@ -3807,7 +4777,8 @@ chase_symlinks (const char *pathspec) tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { - lt_fatal ("Could not follow symlinks for %s", pathspec); + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif @@ -3833,11 +4804,25 @@ strendzap (char *str, const char *pat) return str; } +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + static void -lt_error_core (int exit_status, const char *mode, +lt_error_core (int exit_status, const char *file, + int line, const char *mode, const char *message, va_list ap) { - fprintf (stderr, "%s: %s: ", program_name, mode); + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); @@ -3846,20 +4831,32 @@ lt_error_core (int exit_status, const char *mode, } void -lt_fatal (const char *message, ...) +lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + void lt_setenv (const char *name, const char *value) { - LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", - (name ? name : ""), - (value ? value : ""))); + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ @@ -3904,95 +4901,12 @@ lt_extend_str (const char *orig_value, const char *add, int to_end) return new_value; } -int -lt_split_name_value (const char *arg, char** name, char** value) -{ - const char *p; - int len; - if (!arg || !*arg) - return 1; - - p = strchr (arg, (int)'='); - - if (!p) - return 1; - - *value = xstrdup (++p); - - len = strlen (arg) - strlen (*value); - *name = XMALLOC (char, len); - strncpy (*name, arg, len-1); - (*name)[len - 1] = '\0'; - - return 0; -} - -void -lt_opt_process_env_set (const char *arg) -{ - char *name = NULL; - char *value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); - } - - lt_setenv (name, value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_prepend (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_append (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 1); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - void lt_update_exe_path (const char *name, const char *value) { - LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - (name ? name : ""), - (value ? value : ""))); + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); if (name && *name && value && *value) { @@ -4011,9 +4925,9 @@ lt_update_exe_path (const char *name, const char *value) void lt_update_lib_path (const char *name, const char *value) { - LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - (name ? name : ""), - (value ? value : ""))); + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); if (name && *name && value && *value) { @@ -4023,11 +4937,158 @@ lt_update_lib_path (const char *name, const char *value) } } +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} EOF } # end: func_emit_cwrapperexe_src +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + # func_mode_link arg... func_mode_link () { @@ -4072,6 +5133,7 @@ func_mode_link () new_inherited_linker_flags= avoid_version=no + bindir= dlfiles= dlprefiles= dlself=no @@ -4164,6 +5226,11 @@ func_mode_link () esac case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. @@ -4195,9 +5262,9 @@ func_mode_link () ;; *) if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" + func_append dlfiles " $arg" else - dlprefiles="$dlprefiles $arg" + func_append dlprefiles " $arg" fi prev= continue @@ -4221,7 +5288,7 @@ func_mode_link () *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; - *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; @@ -4240,7 +5307,7 @@ func_mode_link () moreargs= for fil in `cat "$save_arg"` do -# moreargs="$moreargs $fil" +# func_append moreargs " $fil" arg=$fil # A libtool-controlled object. @@ -4269,7 +5336,7 @@ func_mode_link () if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" + func_append dlfiles " $pic_object" prev= continue else @@ -4281,7 +5348,7 @@ func_mode_link () # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" + func_append dlprefiles " $pic_object" prev= fi @@ -4351,12 +5418,12 @@ func_mode_link () if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; - *) rpath="$rpath $arg" ;; + *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; + *) func_append xrpath " $arg" ;; esac fi prev= @@ -4368,28 +5435,28 @@ func_mode_link () continue ;; weak) - weak_libs="$weak_libs $arg" + func_append weak_libs " $arg" prev= continue ;; xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) - compiler_flags="$compiler_flags $qarg" + func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" @@ -4425,6 +5492,11 @@ func_mode_link () continue ;; + -bindir) + prev=bindir + continue + ;; + -dlopen) prev=dlfiles continue @@ -4475,15 +5547,16 @@ func_mode_link () ;; -L*) - func_stripname '-L' '' "$arg" - dir=$func_stripname_result - if test -z "$dir"; then + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; @@ -4495,24 +5568,30 @@ func_mode_link () ;; esac case "$deplibs " in - *" -L$dir "*) ;; + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; - *) dllsearchpath="$dllsearchpath:$dir";; + *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; - *) dllsearchpath="$dllsearchpath:$testbindir";; + *) func_append dllsearchpath ":$testbindir";; esac ;; esac @@ -4522,7 +5601,7 @@ func_mode_link () -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; @@ -4536,7 +5615,7 @@ func_mode_link () ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework - deplibs="$deplibs System.ltframework" + func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) @@ -4556,7 +5635,7 @@ func_mode_link () ;; esac fi - deplibs="$deplibs $arg" + func_append deplibs " $arg" continue ;; @@ -4568,21 +5647,22 @@ func_mode_link () # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot) - compiler_flags="$compiler_flags $arg" + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - compiler_flags="$compiler_flags $arg" + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; @@ -4649,13 +5729,17 @@ func_mode_link () # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; + *) func_append xrpath " $dir" ;; esac continue ;; @@ -4708,8 +5792,8 @@ func_mode_link () for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" - compiler_flags="$compiler_flags $func_quote_for_eval_result" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" @@ -4724,9 +5808,9 @@ func_mode_link () for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" - compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" - linker_flags="$linker_flags $func_quote_for_eval_result" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" @@ -4754,23 +5838,27 @@ func_mode_link () arg="$func_quote_for_eval_result" ;; - # -64, -mips[0-9] enable 64-bit mode on the SGI compiler - # -r[0-9][0-9]* specifies the processor on the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler - # +DA*, +DD* enable 64-bit mode on the HP compiler - # -q* pass through compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* pass through architecture-specific - # compiler args for GCC - # -F/path gives path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC - # @file GCC response files + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" - compiler_flags="$compiler_flags $arg" + func_append compiler_flags " $arg" continue ;; @@ -4782,7 +5870,7 @@ func_mode_link () *.$objext) # A standard object. - objs="$objs $arg" + func_append objs " $arg" ;; *.lo) @@ -4813,7 +5901,7 @@ func_mode_link () if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" + func_append dlfiles " $pic_object" prev= continue else @@ -4825,7 +5913,7 @@ func_mode_link () # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" + func_append dlprefiles " $pic_object" prev= fi @@ -4870,24 +5958,25 @@ func_mode_link () *.$libext) # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" + func_append deplibs " $arg" + func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. + func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" + func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" + func_append dlprefiles " $func_resolve_sysroot_result" prev= else - deplibs="$deplibs $arg" + func_append deplibs " $func_resolve_sysroot_result" fi continue ;; @@ -4925,7 +6014,7 @@ func_mode_link () if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi @@ -4934,6 +6023,8 @@ func_mode_link () func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" @@ -4954,12 +6045,12 @@ func_mode_link () # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do - if $opt_duplicate_deps ; then + if $opt_preserve_dup_deps ; then case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi - libs="$libs $deplib" + func_append libs " $deplib" done if test "$linkmode" = lib; then @@ -4972,9 +6063,9 @@ func_mode_link () if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in - *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac - pre_post_deps="$pre_post_deps $pre_post_dep" + func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= @@ -5044,17 +6135,19 @@ func_mode_link () for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= + func_resolve_sysroot "$lib" case $lib in - *.la) func_source "$lib" ;; + *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do - deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + func_basename "$deplib" + deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; - *) deplibs="$deplibs $deplib" ;; + *) func_append deplibs " $deplib" ;; esac done done @@ -5070,16 +6163,17 @@ func_mode_link () lib= found=no case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else - compiler_flags="$compiler_flags $deplib" + func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi @@ -5164,7 +6258,7 @@ func_mode_link () if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi @@ -5177,7 +6271,8 @@ func_mode_link () test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then @@ -5191,7 +6286,8 @@ func_mode_link () finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" @@ -5202,17 +6298,21 @@ func_mode_link () -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" - dir=$func_stripname_result + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; + *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; - *.la) lib="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" @@ -5230,7 +6330,7 @@ func_mode_link () match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi @@ -5240,15 +6340,15 @@ func_mode_link () ;; esac if test "$valid_a_lib" != yes; then - $ECHO + echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because the file extensions .$libext of this argument makes me believe" - $ECHO "*** that it is just a static archive that I should not use here." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." else - $ECHO + echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" @@ -5275,11 +6375,11 @@ func_mode_link () if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. - newdlprefiles="$newdlprefiles $deplib" + func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else - newdlfiles="$newdlfiles $deplib" + func_append newdlfiles " $deplib" fi fi continue @@ -5321,20 +6421,20 @@ func_mode_link () # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; - *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi - dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then @@ -5345,17 +6445,17 @@ func_mode_link () func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" - if $opt_duplicate_deps ; then + if $opt_preserve_dup_deps ; then case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi - tmp_libs="$tmp_libs $deplib" + func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" @@ -5366,9 +6466,15 @@ func_mode_link () # Get the name of the library we link against. linklib= - for l in $old_library $library_names; do - linklib="$l" - done + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi @@ -5385,9 +6491,9 @@ func_mode_link () # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. - dlprefiles="$dlprefiles $lib $dependency_libs" + func_append dlprefiles " $lib $dependency_libs" else - newdlfiles="$newdlfiles $lib" + func_append newdlfiles " $lib" fi continue fi # $pass = dlopen @@ -5409,14 +6515,14 @@ func_mode_link () # Find the relevant object directory and library name. if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else - dir="$libdir" - absdir="$libdir" + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else @@ -5424,12 +6530,12 @@ func_mode_link () dir="$ladir" absdir="$abs_ladir" # Remove this search path later - notinst_path="$notinst_path $abs_ladir" + func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later - notinst_path="$notinst_path $abs_ladir" + func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" @@ -5440,20 +6546,46 @@ func_mode_link () if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - newdlprefiles="$newdlprefiles $dir/$dlname" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac fi # $pass = dlpreopen if test -z "$libdir"; then @@ -5471,7 +6603,7 @@ func_mode_link () if test "$linkmode" = prog && test "$pass" != link; then - newlib_search_path="$newlib_search_path $ladir" + func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no @@ -5484,7 +6616,8 @@ func_mode_link () for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? @@ -5495,12 +6628,12 @@ func_mode_link () # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi - if $opt_duplicate_deps ; then + if $opt_preserve_dup_deps ; then case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi - tmp_libs="$tmp_libs $deplib" + func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... @@ -5515,7 +6648,7 @@ func_mode_link () # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; - *) temp_rpath="$temp_rpath$absdir:" ;; + *) func_append temp_rpath "$absdir:" ;; esac fi @@ -5527,7 +6660,7 @@ func_mode_link () *) case "$compile_rpath " in *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" + *) func_append compile_rpath " $absdir" ;; esac ;; esac @@ -5536,7 +6669,7 @@ func_mode_link () *) case "$finalize_rpath " in *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" + *) func_append finalize_rpath " $libdir" ;; esac ;; esac @@ -5561,12 +6694,12 @@ func_mode_link () case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded - notinst_deplibs="$notinst_deplibs $lib" + func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" + func_append notinst_deplibs " $lib" need_relink=yes fi ;; @@ -5583,7 +6716,7 @@ func_mode_link () fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - $ECHO + echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else @@ -5601,7 +6734,7 @@ func_mode_link () *) case "$compile_rpath " in *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" + *) func_append compile_rpath " $absdir" ;; esac ;; esac @@ -5610,7 +6743,7 @@ func_mode_link () *) case "$finalize_rpath " in *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" + *) func_append finalize_rpath " $libdir" ;; esac ;; esac @@ -5664,7 +6797,7 @@ func_mode_link () linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" - if test "$linkmode" = prog || test "$mode" != relink; then + if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= @@ -5686,9 +6819,9 @@ func_mode_link () if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then - $ECHO - $ECHO "*** And there doesn't seem to be a static archive available" - $ECHO "*** The link will probably fail, sorry" + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi @@ -5715,12 +6848,12 @@ func_mode_link () test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" + add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" + func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi @@ -5742,7 +6875,7 @@ func_mode_link () if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then @@ -5756,13 +6889,13 @@ func_mode_link () test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi - if test "$linkmode" = prog || test "$mode" = relink; then + if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= @@ -5776,7 +6909,7 @@ func_mode_link () elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then @@ -5793,7 +6926,7 @@ func_mode_link () if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" + func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi @@ -5828,21 +6961,21 @@ func_mode_link () # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. - $ECHO + echo $ECHO "*** Warning: This system can not link to static lib archive $lib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then - $ECHO "*** But as you try to build a module library, libtool will still create " - $ECHO "*** a static module, that should work as long as the dlopening application" - $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then - $ECHO - $ECHO "*** However, this would only work if libtool was able to extract symbol" - $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" - $ECHO "*** not find such a program. So, this module is probably useless." - $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module @@ -5870,27 +7003,33 @@ func_mode_link () temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; + *) func_append xrpath " $temp_xrpath";; esac;; - *) temp_deplibs="$temp_deplibs $libdir";; + *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi - newlib_search_path="$newlib_search_path $absdir" + func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" - if $opt_duplicate_deps ; then + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi - tmp_libs="$tmp_libs $deplib" + func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then @@ -5900,8 +7039,10 @@ func_mode_link () case $deplib in -L*) path="$deplib" ;; *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." - dir="$func_dirname_result" + dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; @@ -5928,8 +7069,8 @@ func_mode_link () if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi - compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi @@ -5962,7 +7103,7 @@ func_mode_link () compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else - compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" @@ -5979,7 +7120,7 @@ func_mode_link () for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; + *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= @@ -6037,10 +7178,10 @@ func_mode_link () -L*) case " $tmp_libs " in *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; + *) func_append tmp_libs " $deplib" ;; esac ;; - *) tmp_libs="$tmp_libs $deplib" ;; + *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" @@ -6056,7 +7197,7 @@ func_mode_link () ;; esac if test -n "$i" ; then - tmp_libs="$tmp_libs $i" + func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs @@ -6097,7 +7238,7 @@ func_mode_link () # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" - objs="$objs$old_deplibs" + func_append objs "$old_deplibs" ;; lib) @@ -6130,10 +7271,10 @@ func_mode_link () if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else - $ECHO + echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" - libobjs="$libobjs $objs" + func_append libobjs " $objs" fi fi @@ -6192,13 +7333,14 @@ func_mode_link () # which has an extra 1 added just for fun # case $version_type in + # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; - freebsd-aout|freebsd-elf|sunos) + freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" @@ -6311,7 +7453,7 @@ func_mode_link () versuffix="$major.$revision" ;; - linux) + linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" @@ -6334,7 +7476,7 @@ func_mode_link () done # Make executables depend on our current version. - verstring="$verstring:${current}.0" + func_append verstring ":${current}.0" ;; qnx) @@ -6402,10 +7544,10 @@ func_mode_link () fi func_generate_dlsyms "$libname" "$libname" "yes" - libobjs="$libobjs $symfileobj" + func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= - if test "$mode" != relink; then + if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= @@ -6421,7 +7563,7 @@ func_mode_link () continue fi fi - removelist="$removelist $p" + func_append removelist " $p" ;; *) ;; esac @@ -6432,27 +7574,28 @@ func_mode_link () # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" + func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do - # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` - # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` - # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; + *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then @@ -6466,7 +7609,7 @@ func_mode_link () for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; + *) func_append dlfiles " $lib" ;; esac done @@ -6476,19 +7619,19 @@ func_mode_link () for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; + *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework - deplibs="$deplibs System.ltframework" + func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. @@ -6505,7 +7648,7 @@ func_mode_link () *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then - deplibs="$deplibs -lc" + func_append deplibs " -lc" fi ;; esac @@ -6554,7 +7697,7 @@ EOF if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $i "*) - newdeplibs="$newdeplibs $i" + func_append newdeplibs " $i" i="" ;; esac @@ -6565,21 +7708,21 @@ EOF set dummy $deplib_matches; shift deplib_match=$1 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" + func_append newdeplibs " $i" else droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: dynamic linker does not accept needed library $i." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which I believe you do not have" - $ECHO "*** because a test_compile did reveal that the linker did not use it for" - $ECHO "*** its dynamic dependency list that programs get resolved with at runtime." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which I believe you do not have" + echo "*** because a test_compile did reveal that the linker did not use it for" + echo "*** its dynamic dependency list that programs get resolved with at runtime." fi fi ;; *) - newdeplibs="$newdeplibs $i" + func_append newdeplibs " $i" ;; esac done @@ -6597,7 +7740,7 @@ EOF if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $i "*) - newdeplibs="$newdeplibs $i" + func_append newdeplibs " $i" i="" ;; esac @@ -6608,29 +7751,29 @@ EOF set dummy $deplib_matches; shift deplib_match=$1 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" + func_append newdeplibs " $i" else droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: dynamic linker does not accept needed library $i." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because a test_compile did reveal that the linker did not use this one" - $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because a test_compile did reveal that the linker did not use this one" + echo "*** as a dynamic dependency that programs can get resolved with at runtime." fi fi else droppeddeps=yes - $ECHO + echo $ECHO "*** Warning! Library $i is needed by this library but I was not able to" - $ECHO "*** make it link in! You will probably need to install it or some" - $ECHO "*** library that it depends on before this library will be fully" - $ECHO "*** functional. Installing it before continuing would be even better." + echo "*** make it link in! You will probably need to install it or some" + echo "*** library that it depends on before this library will be fully" + echo "*** functional. Installing it before continuing would be even better." fi ;; *) - newdeplibs="$newdeplibs $i" + func_append newdeplibs " $i" ;; esac done @@ -6647,15 +7790,27 @@ EOF if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" + func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` + if test -n "$file_magic_glob"; then + libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` + else + libnameglob=$libname + fi + test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + if test "$want_nocaseglob" = yes; then + shopt -s nocaseglob + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | @@ -6672,13 +7827,13 @@ EOF potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" + func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi @@ -6687,12 +7842,12 @@ EOF fi if test -n "$a_deplib" ; then droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because I did check the linker path looking for a file starting" + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else @@ -6703,7 +7858,7 @@ EOF ;; *) # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" + func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. @@ -6719,7 +7874,7 @@ EOF if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" + func_append newdeplibs " $a_deplib" a_deplib="" ;; esac @@ -6730,9 +7885,9 @@ EOF potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" + func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi @@ -6741,12 +7896,12 @@ EOF fi if test -n "$a_deplib" ; then droppeddeps=yes - $ECHO + echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because I did check the linker path looking for a file starting" + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else @@ -6757,32 +7912,32 @@ EOF ;; *) # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" + func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" - tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ - -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi - if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | - $GREP . >/dev/null; then - $ECHO + case $tmp_deplibs in + *[!\ \ ]*) + echo if test "X$deplibs_check_method" = "Xnone"; then - $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + echo "*** Warning: inter-library dependencies are not supported in this platform." else - $ECHO "*** Warning: inter-library dependencies are not known to be supported." + echo "*** Warning: inter-library dependencies are not known to be supported." fi - $ECHO "*** All declared inter-library dependencies are being dropped." + echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes - fi + ;; + esac ;; esac versuffix=$versuffix_save @@ -6794,23 +7949,23 @@ EOF case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then - $ECHO - $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - $ECHO "*** a static module, that should work as long as the dlopening" - $ECHO "*** application is linked with the -dlopen flag." + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - $ECHO - $ECHO "*** However, this would only work if libtool was able to extract symbol" - $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" - $ECHO "*** not find such a program. So, this module is probably useless." - $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" @@ -6820,16 +7975,16 @@ EOF build_libtool_libs=no fi else - $ECHO "*** The inter-library dependencies that have been dropped here will be" - $ECHO "*** automatically added whenever a program is linked with this library" - $ECHO "*** or is declared to -dlopen it." + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then - $ECHO - $ECHO "*** Since this library must not contain undefined symbols," - $ECHO "*** because either the platform does not support them or" - $ECHO "*** it was explicitly requested with -no-undefined," - $ECHO "*** libtool will only create a static version of it." + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module @@ -6846,9 +8001,9 @@ EOF # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac @@ -6861,7 +8016,7 @@ EOF *) case " $deplibs " in *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; + func_append new_libs " -L$path/$objdir" ;; esac ;; esac @@ -6871,10 +8026,10 @@ EOF -L*) case " $new_libs " in *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; + *) func_append new_libs " $deplib" ;; esac ;; - *) new_libs="$new_libs $deplib" ;; + *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" @@ -6886,15 +8041,22 @@ EOF # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else @@ -6903,18 +8065,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" + func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; + *) func_append perm_rpath " $libdir" ;; esac fi done @@ -6922,17 +8084,13 @@ EOF if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do - rpath="$rpath$dir:" + func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi @@ -6940,7 +8098,7 @@ EOF fi shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi @@ -6966,18 +8124,18 @@ EOF linknames= for link do - linknames="$linknames $link" + func_append linknames " $link" done # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" - delfiles="$delfiles $export_symbols" + func_append delfiles " $export_symbols" fi orig_export_symbols= @@ -7008,13 +8166,45 @@ EOF $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do + for cmd1 in $cmds; do IFS="$save_ifs" - eval cmd=\"$cmd\" - func_len " $cmd" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. @@ -7036,7 +8226,7 @@ EOF if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then @@ -7048,7 +8238,7 @@ EOF # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi @@ -7058,7 +8248,7 @@ EOF case " $convenience " in *" $test_deplib "*) ;; *) - tmp_deplibs="$tmp_deplibs $test_deplib" + func_append tmp_deplibs " $test_deplib" ;; esac done @@ -7078,21 +8268,21 @@ EOF test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" + func_append generated " $gentop" func_extract_archives $gentop $convenience - libobjs="$libobjs $func_extract_archives_result" + func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" + func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking - if test "$mode" = relink; then + if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi @@ -7137,7 +8327,8 @@ EOF save_libobjs=$libobjs fi save_output=$output - output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + func_basename "$output" + output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. @@ -7150,13 +8341,16 @@ EOF if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" - $ECHO 'INPUT (' > $output + echo 'INPUT (' > $output for obj in $save_libobjs do - $ECHO "$obj" >> $output + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output done - $ECHO ')' >> $output - delfiles="$delfiles $output" + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" @@ -7170,10 +8364,12 @@ EOF fi for obj do - $ECHO "$obj" >> $output + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output done - delfiles="$delfiles $output" - output=$firstobj\"$file_list_spec$output\" + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." @@ -7197,17 +8393,19 @@ EOF # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext - objlist=$obj + objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result @@ -7217,11 +8415,12 @@ EOF # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi - delfiles="$delfiles $output" + func_append delfiles " $output" else output= @@ -7255,7 +8454,7 @@ EOF lt_exit=$? # Restore the uninstalled library and exit - if test "$mode" = relink; then + if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -7276,7 +8475,7 @@ EOF if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then @@ -7288,7 +8487,7 @@ EOF # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi @@ -7329,10 +8528,10 @@ EOF # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" + func_append generated " $gentop" func_extract_archives $gentop $dlprefiles - libobjs="$libobjs $func_extract_archives_result" + func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi @@ -7348,7 +8547,7 @@ EOF lt_exit=$? # Restore the uninstalled library and exit - if test "$mode" = relink; then + if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -7360,7 +8559,7 @@ EOF IFS="$save_ifs" # Restore the uninstalled library and exit - if test "$mode" = relink; then + if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then @@ -7441,18 +8640,21 @@ EOF if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" - generated="$generated $gentop" + func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' @@ -7512,8 +8714,8 @@ EOF case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac @@ -7524,14 +8726,14 @@ EOF if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac @@ -7545,7 +8747,7 @@ EOF *) case " $compile_deplibs " in *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; + func_append new_libs " -L$path/$objdir" ;; esac ;; esac @@ -7555,17 +8757,17 @@ EOF -L*) case " $new_libs " in *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; + *) func_append new_libs " $deplib" ;; esac ;; - *) new_libs="$new_libs $deplib" ;; + *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. @@ -7573,7 +8775,7 @@ EOF # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; + *) func_append finalize_rpath " $libdir" ;; esac done fi @@ -7592,18 +8794,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" + func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; + *) func_append perm_rpath " $libdir" ;; esac fi case $host in @@ -7612,12 +8814,12 @@ EOF case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; - *) dllsearchpath="$dllsearchpath:$libdir";; + *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; - *) dllsearchpath="$dllsearchpath:$testbindir";; + *) func_append dllsearchpath ":$testbindir";; esac ;; esac @@ -7643,18 +8845,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" + func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + *) func_append finalize_perm_rpath " $libdir" ;; esac fi done @@ -7668,8 +8870,8 @@ EOF if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. - compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" @@ -7681,15 +8883,15 @@ EOF wrappers_required=yes case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; - *cegcc) - # Disable wrappers for cegcc, we are cross compiling anyway. - wrappers_required=no - ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no @@ -7698,13 +8900,19 @@ EOF esac if test "$wrappers_required" = no; then # Replace the output file specification. - compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' @@ -7727,7 +8935,7 @@ EOF # We should set the runpath_var. rpath= for dir in $perm_rpath; do - rpath="$rpath$dir:" + func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi @@ -7735,7 +8943,7 @@ EOF # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" + func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi @@ -7745,11 +8953,18 @@ EOF # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. - link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + exit $EXIT_SUCCESS fi @@ -7764,7 +8979,7 @@ EOF if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then - relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= @@ -7776,13 +8991,19 @@ EOF fi # Replace the output file specification. - link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + # Now create the wrapper script. func_verbose "creating $output" @@ -7800,18 +9021,7 @@ EOF fi done relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $ECHO for shipping. - if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then - case $progpath in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; - *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; - esac - qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. @@ -7891,7 +9101,7 @@ EOF else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then - oldobjs="$oldobjs $symfileobj" + func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" @@ -7899,10 +9109,10 @@ EOF if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" + func_append generated " $gentop" func_extract_archives $gentop $addlibs - oldobjs="$oldobjs $func_extract_archives_result" + func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. @@ -7913,10 +9123,10 @@ EOF # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" + func_append generated " $gentop" func_extract_archives $gentop $dlprefiles - oldobjs="$oldobjs $func_extract_archives_result" + func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have @@ -7932,9 +9142,9 @@ EOF done | sort | sort -uc >/dev/null 2>&1); then : else - $ECHO "copying selected object files to avoid basename conflicts..." + echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" + func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= @@ -7958,18 +9168,30 @@ EOF esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - oldobjs="$oldobjs $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" ;; - *) oldobjs="$oldobjs $obj" ;; + *) func_append oldobjs " $obj" ;; esac done fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." @@ -8043,7 +9265,7 @@ EOF done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi @@ -8063,12 +9285,23 @@ EOF *.la) func_basename "$deplib" name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" - newdependency_libs="$newdependency_libs $libdir/$name" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" @@ -8082,9 +9315,9 @@ EOF eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" - newdlfiles="$newdlfiles $libdir/$name" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; - *) newdlfiles="$newdlfiles $lib" ;; + *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" @@ -8101,7 +9334,7 @@ EOF eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" - newdlprefiles="$newdlprefiles $libdir/$name" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done @@ -8113,7 +9346,7 @@ EOF [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac - newdlfiles="$newdlfiles $abs" + func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= @@ -8122,15 +9355,33 @@ EOF [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac - newdlprefiles="$newdlprefiles $abs" + func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; esac $ECHO > $output "\ # $outputname - a libtool library file @@ -8189,7 +9440,7 @@ relink_command=\"$relink_command\"" exit $EXIT_SUCCESS } -{ test "$mode" = link || test "$mode" = relink; } && +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} @@ -8209,9 +9460,9 @@ func_mode_uninstall () for arg do case $arg in - -f) RM="$RM $arg"; rmforce=yes ;; - -*) RM="$RM $arg" ;; - *) files="$files $arg" ;; + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; esac done @@ -8220,24 +9471,23 @@ func_mode_uninstall () rmdirs= - origobjdir="$objdir" for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then - objdir="$origobjdir" + odir="$objdir" else - objdir="$dir/$origobjdir" + odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" - test "$mode" = uninstall && objdir="$dir" + test "$opt_mode" = uninstall && odir="$dir" - # Remember objdir for removal later, being careful to avoid duplicates - if test "$mode" = clean; then + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then case " $rmdirs " in - *" $objdir "*) ;; - *) rmdirs="$rmdirs $objdir" ;; + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; esac fi @@ -8263,18 +9513,17 @@ func_mode_uninstall () # Delete the libtool libraries and symlinks. for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" + func_append rmfiles " $odir/$n" done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test -n "$old_library" && func_append rmfiles " $odir/$old_library" - case "$mode" in + case "$opt_mode" in clean) - case " $library_names " in - # " " in the beginning catches empty $dlname + case " $library_names " in *" $dlname "*) ;; - *) rmfiles="$rmfiles $objdir/$dlname" ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac - test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then @@ -8302,19 +9551,19 @@ func_mode_uninstall () # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then - rmfiles="$rmfiles $dir/$pic_object" + func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then - rmfiles="$rmfiles $dir/$non_pic_object" + func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) - if test "$mode" = clean ; then + if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) @@ -8324,7 +9573,7 @@ func_mode_uninstall () noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe - rmfiles="$rmfiles $file" + func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. @@ -8333,7 +9582,7 @@ func_mode_uninstall () func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result - rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename @@ -8341,12 +9590,12 @@ func_mode_uninstall () # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" + func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then - rmfiles="$rmfiles $objdir/lt-${noexename}.c" + func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi @@ -8354,7 +9603,6 @@ func_mode_uninstall () esac func_show_eval "$RM $rmfiles" 'exit_status=1' done - objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do @@ -8366,16 +9614,16 @@ func_mode_uninstall () exit $exit_status } -{ test "$mode" = uninstall || test "$mode" = clean; } && +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} -test -z "$mode" && { +test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$mode'" + func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" diff --git a/ccid/ccid/m4/Makefile.am b/ccid/ccid/m4/Makefile.am deleted file mode 100644 index 58bdc59..0000000 --- a/ccid/ccid/m4/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -# Process this file with automake to create Makefile.in - -EXTRA_DIST = acx_pthread.m4 diff --git a/ccid/ccid/m4/Makefile.in b/ccid/ccid/m4/Makefile.in deleted file mode 100644 index 01f3410..0000000 --- a/ccid/ccid/m4/Makefile.in +++ /dev/null @@ -1,353 +0,0 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# Process this file with automake to create Makefile.in -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = m4 -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BUNDLE_HOST = @BUNDLE_HOST@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -DYN_LIB_EXT = @DYN_LIB_EXT@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ -LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ -LIBUSB_LIBS = @LIBUSB_LIBS@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NOCLASS = @NOCLASS@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PCSC_CFLAGS = @PCSC_CFLAGS@ -PCSC_LIBS = @PCSC_LIBS@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CC = @PTHREAD_CC@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LIBS = @PTHREAD_LIBS@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -SYMBOL_VISIBILITY = @SYMBOL_VISIBILITY@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_aux_dir = @ac_aux_dir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -bundle = @bundle@ -ccidtwindir = @ccidtwindir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -usbdropdir = @usbdropdir@ -EXTRA_DIST = acx_pthread.m4 -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign m4/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/ccid/ccid/m4/as-ac-expand.m4 b/ccid/ccid/m4/as-ac-expand.m4 new file mode 100644 index 0000000..d6c9e33 --- /dev/null +++ b/ccid/ccid/m4/as-ac-expand.m4 @@ -0,0 +1,43 @@ +dnl as-ac-expand.m4 0.2.0 +dnl autostars m4 macro for expanding directories using configure's prefix +dnl thomas@apestaart.org + +dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR) +dnl example +dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir) +dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local + +AC_DEFUN([AS_AC_EXPAND], +[ + EXP_VAR=[$1] + FROM_VAR=[$2] + + dnl first expand prefix and exec_prefix if necessary + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + dnl if no prefix given, then use /usr/local, the default prefix + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + dnl if no exec_prefix given, then use prefix + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + dnl loop until it doesn't change anymore + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + dnl clean up + full_var=$new_full_var + AC_SUBST([$1], "$full_var") + + dnl restore prefix and exec_prefix + prefix=$prefix_save + exec_prefix=$exec_prefix_save +]) diff --git a/ccid/ccid/m4/acx_pthread.m4 b/ccid/ccid/m4/ax_pthread.m4 similarity index 70% rename from ccid/ccid/m4/acx_pthread.m4 rename to ccid/ccid/m4/ax_pthread.m4 index eb09f5a..d90de34 100644 --- a/ccid/ccid/m4/acx_pthread.m4 +++ b/ccid/ccid/m4/ax_pthread.m4 @@ -1,10 +1,10 @@ # =========================================================================== -# http://autoconf-archive.cryp.to/acx_pthread.html +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # -# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # @@ -25,14 +25,18 @@ # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # -# LIBS="$PTHREAD_LIBS $LIBS" -# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -# CC="$PTHREAD_CC" +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action @@ -45,13 +49,12 @@ # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # -# LAST MODIFICATION -# -# 2008-04-12 +# Updated for Autoconf 2.68 by Daniel Richard G. # -# COPYLEFT +# LICENSE # # Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -75,15 +78,17 @@ # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Macro Archive. When you make and -# distribute a modified version of the Autoconf Macro, you may extend this -# special exception to the GPL to apply to your modified version as well. +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. -AC_DEFUN([ACX_PTHREAD], [ +#serial 18 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) -AC_LANG_SAVE -AC_LANG_C -acx_pthread_ok=no +AC_LANG_PUSH([C]) +ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). @@ -98,9 +103,9 @@ if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) - AC_MSG_RESULT($acx_pthread_ok) - if test x"$acx_pthread_ok" = xno; then + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi @@ -118,7 +123,7 @@ fi # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -140,8 +145,8 @@ acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -m # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case "${host_cpu}-${host_os}" in - *solaris*) +case ${host_os} in + solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based @@ -151,12 +156,16 @@ case "${host_cpu}-${host_os}" in # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: - acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do case $flag in none) @@ -168,12 +177,12 @@ for flag in $acx_pthread_flags; do PTHREAD_CFLAGS="$flag" ;; - pthread-config) - AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) @@ -195,17 +204,23 @@ for flag in $acx_pthread_flags; do # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. - AC_TRY_LINK([#include ], - [pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], - [acx_pthread_ok=yes]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" - AC_MSG_RESULT($acx_pthread_ok) - if test "x$acx_pthread_ok" = xyes; then + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then break; fi @@ -215,19 +230,21 @@ done fi # Various other checks: -if test "x$acx_pthread_ok" = xyes; then +if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_TRY_LINK([#include ], [int attr=$attr; return attr;], - [attr_name=$attr; break]) - done + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $attr; return attr /* ; */])], + [attr_name=$attr; break], + []) + done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, @@ -237,24 +254,41 @@ if test "x$acx_pthread_ok" = xyes; then AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + case ${host_os} in + aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; + osf* | hpux*) flag="-D_REENTRANT";; + solaris*) + if test "$GCC" = "yes"; then + flag="-D_REENTRANT" + else + flag="-mt -D_REENTRANT" + fi + ;; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + ax_cv_PTHREAD_PRIO_INHERIT, [ + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], + AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])) + LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then + if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC - fi + fi else PTHREAD_CC="$CC" fi @@ -264,12 +298,12 @@ AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then +if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else - acx_pthread_ok=no + ax_pthread_ok=no $2 fi -AC_LANG_RESTORE -])dnl ACX_PTHREAD +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/ccid/ccid/m4/libtool.m4 b/ccid/ccid/m4/libtool.m4 index 1e7ea47..02b4bbe 100644 --- a/ccid/ccid/m4/libtool.m4 +++ b/ccid/ccid/m4/libtool.m4 @@ -1,7 +1,8 @@ # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -10,7 +11,8 @@ m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. @@ -37,7 +39,7 @@ m4_define([_LT_COPYING], [dnl # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) -# serial 56 LT_INIT +# serial 57 LT_INIT # LT_PREREQ(VERSION) @@ -66,6 +68,7 @@ esac # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl @@ -82,6 +85,8 @@ AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) @@ -118,7 +123,7 @@ m4_defun([_LT_CC_BASENAME], *) break;; esac done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) @@ -138,6 +143,11 @@ m4_defun([_LT_FILEUTILS_DEFAULTS], m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl @@ -160,10 +170,13 @@ _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our @@ -179,7 +192,6 @@ fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl -_LT_PROG_ECHO_BACKSLASH case $host_os in aix3*) @@ -193,23 +205,6 @@ aix3*) ;; esac -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - # Global variables: ofile=libtool can_build_shared=yes @@ -250,6 +245,28 @@ _LT_CONFIG_COMMANDS ])# _LT_SETUP +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' @@ -408,7 +425,7 @@ m4_define([_lt_decl_all_varnames], # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS @@ -418,7 +435,7 @@ m4_define([_LT_CONFIG_STATUS_DECLARE], # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # -# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) @@ -517,12 +534,20 @@ LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -533,9 +558,9 @@ done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -543,16 +568,38 @@ for var in lt_decl_all_varnames([[ \ esac done -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\[$]0 --fallback-echo"')dnl " - lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` - ;; -esac - _LT_OUTPUT_LIBTOOL_INIT ]) +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- @@ -562,20 +609,11 @@ _LT_OUTPUT_LIBTOOL_INIT AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) -cat >"$CONFIG_LT" <<_LTEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate a libtool stub with the current configuration. - -lt_cl_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_LTEOF +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF -AS_SHELL_SANITIZE -_AS_PREPARE - -exec AS_MESSAGE_FD>&1 +lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo @@ -601,7 +639,7 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. -Copyright (C) 2008 Free Software Foundation, Inc. +Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." @@ -646,15 +684,13 @@ chmod +x "$CONFIG_LT" # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. -if test "$no_create" != yes; then - lt_cl_success=: - test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" - exec AS_MESSAGE_LOG_FD>/dev/null - $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false - exec AS_MESSAGE_LOG_FD>>config.log - $lt_cl_success || AS_EXIT(1) -fi +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT @@ -717,15 +753,12 @@ _LT_EOF # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? - sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_XSI_SHELLFNS + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) - sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) + _LT_PROG_REPLACE_SHELLFNS - mv -f "$cfgfile" "$ofile" || + mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], @@ -770,6 +803,7 @@ AC_DEFUN([LT_LANG], m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], @@ -791,6 +825,31 @@ m4_defun([_LT_LANG], ])# _LT_LANG +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], @@ -821,6 +880,10 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ], m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) @@ -831,11 +894,13 @@ AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER @@ -921,7 +986,13 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -929,6 +1000,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ rm -rf libconftest.dylib* rm -f conftest.* fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no @@ -940,6 +1012,34 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; @@ -967,7 +1067,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi - if test "$DSYMUTIL" != ":"; then + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -977,8 +1077,8 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ ]) -# _LT_DARWIN_LINKER_FEATURES -# -------------------------- +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ @@ -987,7 +1087,13 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(whole_archive_flag_spec, $1)='' + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in @@ -995,7 +1101,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=echo + output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" @@ -1011,203 +1117,142 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], fi ]) -# _LT_SYS_MODULE_PATH_AIX -# ----------------------- +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl -AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_SHELL_INIT +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + # _LT_PROG_ECHO_BACKSLASH # ----------------------- -# Add some code to the start of the generated configure script which -# will find an echo command which doesn't interpret backslashes. +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], -[_LT_SHELL_INIT([ -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` - ;; -esac - -ECHO=${lt_ECHO-echo} -if test "X[$]1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X[$]1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then - # Yippee, $ECHO works! - : +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' else - # Restart under the correct shell. - exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} -fi - -if test "X[$]1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<_LT_EOF -[$]* -_LT_EOF - exit 0 + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' fi -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test -z "$lt_ECHO"; then - if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if { echo_test_string=`eval $cmd`; } 2>/dev/null && - { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null - then - break - fi - done - fi - - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : - else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$ECHO" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - ECHO='print -r' - elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} - else - # Try using printf. - ECHO='printf %s\n' - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - ECHO="$CONFIG_SHELL [$]0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$CONFIG_SHELL [$]0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do - if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null - then - break - fi - prev="$cmd" - done +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} - if test "$prev" != 'sed 50q "[$]0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} - else - # Oops. We lost completely, so just stick with echo. - ECHO=echo - fi - fi - fi - fi - fi -fi +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -fi +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) -AC_SUBST(lt_ECHO) -]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], - [An echo program that does not interpret backslashes]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], @@ -1236,7 +1281,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in @@ -1279,7 +1324,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) - LD="${LD-ld} -m elf_i386" + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" @@ -1329,14 +1381,27 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) CFLAGS="$SAVE_CFLAGS" fi ;; -sparc*-*solaris*) +*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" @@ -1354,14 +1419,47 @@ need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], -[AC_CHECK_TOOL(AR, ar, false) -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1]) +[_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: @@ -1380,18 +1478,27 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE @@ -1416,15 +1523,15 @@ AC_CACHE_CHECK([$1], [$2], -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes @@ -1464,7 +1571,7 @@ AC_CACHE_CHECK([$1], [$2], if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes @@ -1527,6 +1634,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. @@ -1552,6 +1664,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=196608 ;; + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not @@ -1578,7 +1695,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else @@ -1591,8 +1709,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` @@ -1643,7 +1761,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -[#line __oline__ "configure" +[#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -1684,7 +1802,13 @@ else # endif #endif -void fnord() { int i=42;} +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -1693,7 +1817,11 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } /* dlclose (self); */ } else @@ -1869,16 +1997,16 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes @@ -2037,6 +2165,7 @@ m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ @@ -2045,16 +2174,23 @@ if test "$GCC" = yes; then darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= @@ -2067,7 +2203,7 @@ if test "$GCC" = yes; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; @@ -2087,7 +2223,13 @@ BEGIN {RS=" "; FS="/|\n";} { if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) @@ -2113,7 +2255,7 @@ need_version=unknown case $host_os in aix3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH @@ -2122,7 +2264,7 @@ aix3*) ;; aix[[4-9]]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes @@ -2175,7 +2317,7 @@ amigaos*) m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; @@ -2187,7 +2329,7 @@ beos*) ;; bsdi[[45]]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -2206,8 +2348,9 @@ cygwin* | mingw* | pw32* | cegcc*) need_version=no need_lib_prefix=no - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + case $GCC,$cc_basename in + yes,*) + # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ @@ -2228,36 +2371,83 @@ cygwin* | mingw* | pw32* | cegcc*) cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' ;; *) + # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' ;; esac - dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; @@ -2278,7 +2468,7 @@ m4_if([$1], [],[ ;; dgux*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' @@ -2286,10 +2476,6 @@ dgux*) shlibpath_var=LD_LIBRARY_PATH ;; -freebsd1*) - dynamic_linker=no - ;; - freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -2297,7 +2483,7 @@ freebsd* | dragonfly*) objformat=`/usr/bin/objformat` else case $host_os in - freebsd[[123]]*) objformat=aout ;; + freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi @@ -2315,7 +2501,7 @@ freebsd* | dragonfly*) esac shlibpath_var=LD_LIBRARY_PATH case $host_os in - freebsd2*) + freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) @@ -2334,13 +2520,16 @@ freebsd* | dragonfly*) esac ;; -gnu*) - version_type=linux +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no + dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -2386,12 +2575,14 @@ hpux9* | hpux10* | hpux11*) soname_spec='${libname}${release}${shared_ext}$major' ;; esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 ;; interix[[3-9]]*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' @@ -2407,7 +2598,7 @@ irix5* | irix6* | nonstopux*) nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; @@ -2444,9 +2635,9 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; -# This must be Linux ELF. -linux* | k*bsd*-gnu) - version_type=linux +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2454,16 +2645,21 @@ linux* | k*bsd*-gnu) finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install @@ -2472,7 +2668,7 @@ linux* | k*bsd*-gnu) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -2516,7 +2712,7 @@ netbsd*) ;; newsos6) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes @@ -2585,7 +2781,7 @@ rdos*) ;; solaris*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2610,7 +2806,7 @@ sunos4*) ;; sysv4 | sysv4.3*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -2634,7 +2830,7 @@ sysv4 | sysv4.3*) sysv4*MP*) if test -d /usr/nec ;then - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH @@ -2665,7 +2861,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2675,7 +2871,7 @@ tpf*) ;; uts4*) - version_type=linux + version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -2717,6 +2913,8 @@ _LT_DECL([], [library_names_spec], [1], The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], @@ -2829,6 +3027,7 @@ AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], @@ -2950,6 +3149,11 @@ case $reload_flag in esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' @@ -2958,8 +3162,8 @@ case $host_os in fi ;; esac -_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl -_LT_DECL([], [reload_cmds], [2])dnl +_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl +_LT_TAGDECL([], [reload_cmds], [2])dnl ])# _LT_CMD_RELOAD @@ -3011,16 +3215,18 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; -cegcc) +cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' @@ -3046,7 +3252,7 @@ freebsd* | dragonfly*) fi ;; -gnu*) +haiku*) lt_cv_deplibs_check_method=pass_all ;; @@ -3058,11 +3264,11 @@ hpux10.20* | hpux11*) lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac @@ -3083,8 +3289,8 @@ irix5* | irix6* | nonstopux*) lt_cv_deplibs_check_method=pass_all ;; -# This must be Linux ELF. -linux* | k*bsd*-gnu) +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; @@ -3162,6 +3368,21 @@ tpf*) ;; esac ]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -3169,7 +3390,11 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method == "file_magic"]) + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD @@ -3226,7 +3451,19 @@ if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. - AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" @@ -3239,13 +3476,13 @@ _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -3260,7 +3497,68 @@ dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) - +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + # LT_LIB_M # -------- # check for math library @@ -3268,7 +3566,7 @@ AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) @@ -3296,7 +3594,12 @@ m4_defun([_LT_COMPILER_NO_RTTI], _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, @@ -3313,6 +3616,7 @@ _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl @@ -3380,8 +3684,8 @@ esac lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -3405,6 +3709,7 @@ for ac_symprfx in "" "_"; do # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ @@ -3417,6 +3722,7 @@ for ac_symprfx in "" "_"; do else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no @@ -3438,7 +3744,7 @@ _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -3450,6 +3756,18 @@ _LT_EOF if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + #ifdef __cplusplus extern "C" { #endif @@ -3461,7 +3779,7 @@ _LT_EOF cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ -const struct { +LT@&t@_DLSYM_CONST struct { const char *name; void *address; } @@ -3487,15 +3805,15 @@ static const void *lt_preloaded_setup() { _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi @@ -3528,6 +3846,13 @@ else AC_MSG_RESULT(ok) fi +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], @@ -3538,6 +3863,8 @@ _LT_DECL([global_symbol_to_c_name_address], _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS @@ -3549,7 +3876,6 @@ _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= -AC_MSG_CHECKING([for $compiler option to produce PIC]) m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then @@ -3600,6 +3926,11 @@ m4_if([$1], [CXX], [ # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. @@ -3649,6 +3980,12 @@ m4_if([$1], [CXX], [ ;; esac ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; dgux*) case $cc_basename in ec++*) @@ -3705,7 +4042,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler @@ -3738,8 +4075,8 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - xlc* | xlC*) - # IBM XL 8.0 on PPC + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' @@ -3801,7 +4138,7 @@ m4_if([$1], [CXX], [ ;; solaris*) case $cc_basename in - CC*) + CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' @@ -3905,6 +4242,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag @@ -3947,6 +4290,15 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in @@ -3989,7 +4341,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -4010,7 +4362,13 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; - pgcc* | pgf77* | pgf90* | pgf95*) + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' @@ -4022,25 +4380,40 @@ m4_if([$1], [CXX], [ # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; @@ -4072,7 +4445,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in - f77* | f90* | f95*) + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; @@ -4129,9 +4502,11 @@ case $host_os in _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac -AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. @@ -4150,6 +4525,8 @@ fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # @@ -4170,6 +4547,7 @@ _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl @@ -4178,30 +4556,40 @@ m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; + ;; cygwin* | mingw* | cegcc*) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - ;; - linux* | k*bsd*-gnu) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no - ;; + ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; + ;; esac - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= @@ -4216,7 +4604,6 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported @@ -4261,13 +4648,39 @@ dnl Note also adjust exclude_expsyms for C++ above. openbsd*) with_gnu_ld=no ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' @@ -4285,6 +4698,7 @@ dnl Note also adjust exclude_expsyms for C++ above. fi supports_anon_versioning=no case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... @@ -4300,11 +4714,12 @@ dnl Note also adjust exclude_expsyms for C++ above. _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 -*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. _LT_EOF fi @@ -4340,10 +4755,12 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' @@ -4361,6 +4778,11 @@ _LT_EOF fi ;; + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -4376,7 +4798,7 @@ _LT_EOF _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; - gnu* | linux* | tpf* | k*bsd*-gnu) + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in @@ -4386,15 +4808,16 @@ _LT_EOF if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then - tmp_addflag= + tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -4405,13 +4828,17 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; - xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 @@ -4427,17 +4854,16 @@ _LT_EOF fi case $cc_basename in - xlf*) + xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -4451,8 +4877,8 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; @@ -4470,8 +4896,8 @@ _LT_EOF _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4517,8 +4943,8 @@ _LT_EOF *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4558,8 +4984,10 @@ _LT_EOF else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi @@ -4647,9 +5075,9 @@ _LT_EOF _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. - _LT_SYS_MODULE_PATH_AIX + _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' @@ -4658,14 +5086,19 @@ _LT_EOF else # Determine the default libpath from the value encoded in an # empty executable. - _LT_SYS_MODULE_PATH_AIX + _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' @@ -4697,20 +5130,64 @@ _LT_EOF # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac ;; darwin* | rhapsody*) @@ -4723,10 +5200,6 @@ _LT_EOF _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; - freebsd1*) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little @@ -4739,7 +5212,7 @@ _LT_EOF ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) + freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes @@ -4748,7 +5221,7 @@ _LT_EOF # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -4756,7 +5229,7 @@ _LT_EOF hpux9*) if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi @@ -4771,14 +5244,13 @@ _LT_EOF ;; hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes @@ -4790,16 +5262,16 @@ _LT_EOF ;; hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then + if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else @@ -4811,7 +5283,14 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi @@ -4839,19 +5318,34 @@ _LT_EOF irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE(int foo(void) {}, - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - ) - LDFLAGS="$save_LDFLAGS" + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' @@ -4913,17 +5407,17 @@ _LT_EOF _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' @@ -4933,13 +5427,13 @@ _LT_EOF osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -4952,9 +5446,9 @@ _LT_EOF _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) @@ -5130,36 +5624,38 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - AC_MSG_CHECKING([whether -lc should be explicitly linked in]) - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi @@ -5196,9 +5692,6 @@ _LT_TAGDECL([], [no_undefined_flag], [1], _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], - [[If ld is used when linking, flag to hardcode $libdir into a binary - during linking. This must work even if $libdir does not exist]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], @@ -5224,8 +5717,6 @@ _LT_TAGDECL([], [inherit_rpath], [0], to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [fix_srcfile_path], [1], - [Fix the shell variable $srcfile for the compiler]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], @@ -5236,6 +5727,8 @@ _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented @@ -5329,37 +5822,22 @@ CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG -# _LT_PROG_CXX -# ------------ -# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ -# compiler, we have our own version here. -m4_defun([_LT_PROG_CXX], -[ -pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) -AC_PROG_CXX -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_CXX - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_CXX], []) - - # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], -[AC_REQUIRE([_LT_PROG_CXX])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no @@ -5371,7 +5849,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported @@ -5381,6 +5858,8 @@ _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no @@ -5412,6 +5891,7 @@ if test "$_lt_caught_CXX_error" != yes; then # Allow CC to be a program name with arguments. lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX @@ -5429,6 +5909,7 @@ if test "$_lt_caught_CXX_error" != yes; then fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) @@ -5450,8 +5931,8 @@ if test "$_lt_caught_CXX_error" != yes; then # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' @@ -5483,7 +5964,7 @@ if test "$_lt_caught_CXX_error" != yes; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no @@ -5592,10 +6073,10 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. - _LT_SYS_MODULE_PATH_AIX + _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' @@ -5604,14 +6085,19 @@ if test "$_lt_caught_CXX_error" != yes; then else # Determine the default libpath from the value encoded in an # empty executable. - _LT_SYS_MODULE_PATH_AIX + _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. @@ -5641,28 +6127,75 @@ if test "$_lt_caught_CXX_error" != yes; then ;; cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; @@ -5685,7 +6218,7 @@ if test "$_lt_caught_CXX_error" != yes; then esac ;; - freebsd[[12]]*) + freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no @@ -5701,7 +6234,9 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - gnu*) + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) @@ -5728,11 +6263,11 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no @@ -5793,7 +6328,7 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then @@ -5803,10 +6338,10 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi @@ -5836,7 +6371,7 @@ if test "$_lt_caught_CXX_error" != yes; then case $cc_basename in CC*) # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -5847,9 +6382,9 @@ if test "$_lt_caught_CXX_error" != yes; then *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes @@ -5860,7 +6395,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(inherit_rpath, $1)=yes ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler @@ -5878,7 +6413,7 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' @@ -5915,26 +6450,26 @@ if test "$_lt_caught_CXX_error" != yes; then pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in - *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; - *) # Version 6 will use weak symbols + *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; @@ -5942,7 +6477,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ @@ -5961,9 +6496,9 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; - xl*) + xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' @@ -5983,13 +6518,13 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. - output_verbose_link_cmd='echo' + output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is @@ -6058,7 +6593,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi - output_verbose_link_cmd=echo + output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6093,15 +6628,15 @@ if test "$_lt_caught_CXX_error" != yes; then case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; @@ -6117,17 +6652,17 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac @@ -6137,7 +6672,7 @@ if test "$_lt_caught_CXX_error" != yes; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support @@ -6173,7 +6708,7 @@ if test "$_lt_caught_CXX_error" != yes; then solaris*) case $cc_basename in - CC*) + CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' @@ -6194,7 +6729,7 @@ if test "$_lt_caught_CXX_error" != yes; then esac _LT_TAGVAR(link_all_deplibs, $1)=yes - output_verbose_link_cmd='echo' + output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is @@ -6214,14 +6749,14 @@ if test "$_lt_caught_CXX_error" != yes; then if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. @@ -6232,7 +6767,7 @@ if test "$_lt_caught_CXX_error" != yes; then # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' @@ -6286,6 +6821,10 @@ if test "$_lt_caught_CXX_error" != yes; then CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' @@ -6341,6 +6880,7 @@ if test "$_lt_caught_CXX_error" != yes; then fi # test -n "$compiler" CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC @@ -6355,6 +6895,29 @@ AC_LANG_POP ])# _LT_LANG_CXX_CONFIG +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose @@ -6363,6 +6926,7 @@ AC_LANG_POP # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= @@ -6412,7 +6976,20 @@ public class foo { } }; _LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF ]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then @@ -6424,7 +7001,7 @@ if AC_TRY_EVAL(ac_compile); then pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do - case $p in + case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. @@ -6433,13 +7010,22 @@ if AC_TRY_EVAL(ac_compile); then test $p = "-R"; then prev=$p continue - else - prev= fi + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac if test "$pre_test_object_deps_done" = no; then - case $p in - -L* | -R*) + case ${prev} in + -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. @@ -6459,8 +7045,10 @@ if AC_TRY_EVAL(ac_compile); then _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi + prev= ;; + *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. @@ -6496,6 +7084,7 @@ else fi $RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], @@ -6532,7 +7121,7 @@ linux*) solaris*) case $cc_basename in - CC*) + CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as @@ -6576,32 +7165,16 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1], ])# _LT_SYS_HIDDEN_LIBDEPS -# _LT_PROG_F77 -# ------------ -# Since AC_PROG_F77 is broken, in that it returns the empty string -# if there is no fortran compiler, we have our own version here. -m4_defun([_LT_PROG_F77], -[ -pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) -AC_PROG_F77 -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_F77 - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_F77], []) - - # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], -[AC_REQUIRE([_LT_PROG_F77])dnl -AC_LANG_PUSH(Fortran 77) +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= @@ -6611,7 +7184,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no @@ -6620,6 +7192,8 @@ _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no @@ -6659,7 +7233,9 @@ if test "$_lt_disable_F77" != yes; then # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} + CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) @@ -6713,38 +7289,24 @@ if test "$_lt_disable_F77" != yes; then GCC=$lt_save_GCC CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG -# _LT_PROG_FC -# ----------- -# Since AC_PROG_FC is broken, in that it returns the empty string -# if there is no fortran compiler, we have our own version here. -m4_defun([_LT_PROG_FC], -[ -pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) -AC_PROG_FC -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_FC - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_FC], []) - - # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], -[AC_REQUIRE([_LT_PROG_FC])dnl -AC_LANG_PUSH(Fortran) +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= @@ -6754,7 +7316,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no @@ -6763,6 +7324,8 @@ _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no @@ -6802,7 +7365,9 @@ if test "$_lt_disable_FC" != yes; then # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} + CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu @@ -6858,7 +7423,8 @@ if test "$_lt_disable_FC" != yes; then fi # test -n "$compiler" GCC=$lt_save_GCC - CC="$lt_save_CC" + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP @@ -6895,10 +7461,12 @@ _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. -lt_save_CC="$CC" +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" @@ -6908,6 +7476,8 @@ _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -6927,10 +7497,82 @@ fi AC_LANG_RESTORE GCC=$lt_save_GCC -CC="$lt_save_CC" +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler @@ -6962,9 +7604,11 @@ _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} +CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) @@ -6977,7 +7621,8 @@ fi GCC=$lt_save_GCC AC_LANG_RESTORE -CC="$lt_save_CC" +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG @@ -6997,6 +7642,13 @@ dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], @@ -7036,6 +7688,15 @@ _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) # _LT_DECL_SED # ------------ @@ -7129,8 +7790,8 @@ m4_defun([_LT_CHECK_SHELL_FEATURES], # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,, \ + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes @@ -7169,208 +7830,162 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES -# _LT_PROG_XSI_SHELLFNS -# --------------------- -# Bourne and XSI compatible variants of some useful shell functions. -m4_defun([_LT_PROG_XSI_SHELLFNS], -[case $xsi_shell in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac -} - -# func_basename file -func_basename () -{ - func_basename_result="${1##*/}" -} - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}" -} - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -func_stripname () -{ - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"} -} - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=${1%%=*} - func_opt_split_arg=${1#*=} -} - -# func_lo2o object -func_lo2o () -{ - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=${1%.*}.lo -} +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=$(( $[*] )) -} -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=${#1} -} +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) -_LT_EOF - ;; - *) # Bourne compatible functions. - cat << \_LT_EOF >> "$cfgfile" + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) -dnl func_dirname_and_basename -dnl A portable version of this function is already defined in general.m4sh -dnl so there is no need for it here. + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; - esac -} + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) -# sed scripts: -my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' -my_sed_long_arg='1s/^-[[^=]]*=//' + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` -} - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` -} + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "$[@]"` -} +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` -} + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) -_LT_EOF -esac + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi -case $lt_shell_append in - yes) - cat << \_LT_EOF >> "$cfgfile" +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$[1]+=\$[2]" -} -_LT_EOF +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac ;; - *) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$[1]=\$$[1]\$[2]" -} - -_LT_EOF + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac ;; - esac + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac ]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/ccid/ccid/m4/ltoptions.m4 b/ccid/ccid/m4/ltoptions.m4 index 34151a3..5d9acd8 100644 --- a/ccid/ccid/m4/ltoptions.m4 +++ b/ccid/ccid/m4/ltoptions.m4 @@ -1,13 +1,14 @@ # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# serial 6 ltoptions.m4 +# serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) @@ -125,7 +126,7 @@ LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) @@ -133,13 +134,13 @@ case $host in esac test -z "$AS" && AS=as -_LT_DECL([], [AS], [0], [Assembler program])dnl +_LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], @@ -325,9 +326,24 @@ dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) diff --git a/ccid/ccid/m4/ltversion.m4 b/ccid/ccid/m4/ltversion.m4 index b8e154f..07a8602 100644 --- a/ccid/ccid/m4/ltversion.m4 +++ b/ccid/ccid/m4/ltversion.m4 @@ -7,17 +7,17 @@ # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# Generated from ltversion.in. +# @configure_input@ -# serial 3012 ltversion.m4 +# serial 3337 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.2.6]) -m4_define([LT_PACKAGE_REVISION], [1.3012]) +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.2.6' -macro_revision='1.3012' +[macro_version='2.4.2' +macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) diff --git a/ccid/ccid/m4/lt~obsolete.m4 b/ccid/ccid/m4/lt~obsolete.m4 index 637bb20..c573da9 100644 --- a/ccid/ccid/m4/lt~obsolete.m4 +++ b/ccid/ccid/m4/lt~obsolete.m4 @@ -1,13 +1,13 @@ # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# serial 4 lt~obsolete.m4 +# serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # @@ -77,7 +77,6 @@ m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) @@ -90,3 +89,10 @@ m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/ccid/ccid/missing b/ccid/ccid/missing index 1c8ff70..cdea514 100755 --- a/ccid/ccid/missing +++ b/ccid/ccid/missing @@ -1,11 +1,10 @@ #! /bin/sh -# Common stub for a few missing GNU programs while installing. +# Common wrapper for a few potentially missing GNU programs. -scriptversion=2006-05-10.23 +scriptversion=2012-06-26.16; # UTC -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,9 +17,7 @@ scriptversion=2006-05-10.23 # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -28,66 +25,40 @@ scriptversion=2006-05-10.23 # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" + echo 1>&2 "Try '$0 --help' for more information" exit 1 fi -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi +case $1 in -msg="missing on your system" + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. Send bug reports to ." exit $? @@ -99,269 +70,146 @@ Send bug reports to ." ;; -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). -case $1 in - lex|yacc) - # Not GNU programs, they don't have --version. - ;; - - tar) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $1 in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit 1 - fi - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - tar) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi -exit 0 +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'automa4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: diff --git a/ccid/ccid/readers/ACR122U.txt b/ccid/ccid/readers/ACR122U.txt deleted file mode 100644 index 687a1a2..0000000 --- a/ccid/ccid/readers/ACR122U.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x072F - iManufacturer: - idProduct: 0x90CC - iProduct: CCID USB Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Inappropriate ioctl for device - dwDataRate: 10752 bps - dwMaxDataRate: 250000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Inappropriate ioctl for device - dwMaxIFSD: 247 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010030 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ACR122U_PICC.txt b/ccid/ccid/readers/ACR122U_PICC.txt deleted file mode 100644 index 4d63e8f..0000000 --- a/ccid/ccid/readers/ACR122U_PICC.txt +++ /dev/null @@ -1,48 +0,0 @@ - idVendor: 0x072F - iManufacturer: ACS - idProduct: 0x2200 - iProduct: ACR122U PICC Interface - bcdDevice: 2.06 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: ? - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: No such file or directory - dwDataRate: 10752 bps - dwMaxDataRate: 250000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: No such file or directory - dwMaxIFSD: 256 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020040 - ....40 Automatic parameters negotiation made by the CCID - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ACR38U-CCID.txt b/ccid/ccid/readers/ACR38U-CCID.txt deleted file mode 100644 index 7c4c135..0000000 --- a/ccid/ccid/readers/ACR38U-CCID.txt +++ /dev/null @@ -1,46 +0,0 @@ - idVendor: 0x072F - iManufacturer: ACS - idProduct: 0x90CC - iProduct: ACR38 USB Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 129032 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010030 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ASEDrive_IIIe_KB.txt b/ccid/ccid/readers/ASEDrive_IIIe_KB.txt deleted file mode 100644 index 20e03db..0000000 --- a/ccid/ccid/readers/ASEDrive_IIIe_KB.txt +++ /dev/null @@ -1,52 +0,0 @@ - idVendor: 0x0DC3 - iManufacturer: Athena - idProduct: 0x1102 - iProduct: ASEDrive CCID - bcdDevice: 6.07 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - wrong size for GET CLOCK FREQUENCIES: 1 - dwDataRate: 10752 bps - dwMaxDataRate: 333333 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010330 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ASE_IIIe.txt b/ccid/ccid/readers/ASE_IIIe.txt deleted file mode 100644 index f746c8c..0000000 --- a/ccid/ccid/readers/ASE_IIIe.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x0DC3 - iManufacturer: Athena - idProduct: 0x1004 - iProduct: ASEDrive CCID - bcdDevice: 5.02 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 333333 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010330 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ATMEL_AT91SO.txt b/ccid/ccid/readers/ATMEL_AT91SO.txt deleted file mode 100644 index c60ac91..0000000 --- a/ccid/ccid/readers/ATMEL_AT91SO.txt +++ /dev/null @@ -1,57 +0,0 @@ - idVendor: 0x03EB - iManufacturer: ATMEL - idProduct: 0x6004 - iProduct: AT91SO CCID Smart Card Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x01 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 256 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002005E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....40 Automatic parameters negotiation made by the CCID - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0210 - 16 lines - 2 characters per line - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ActivCardV2.txt b/ccid/ccid/readers/ActivCardV2.txt deleted file mode 100644 index 61091ac..0000000 --- a/ccid/ccid/readers/ActivCardV2.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x09C3 - iManufacturer: ActivCard - idProduct: 0x0008 - iProduct: ActivCard USB Reader V2 - bcdDevice: 2.02 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 1 - UNSUPPORTED SubClass - bInterfaceProtocol: 1 - UNSUPPORTED InterfaceProtocol - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 115200 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ActivCardV3.txt b/ccid/ccid/readers/ActivCardV3.txt deleted file mode 100644 index 8c865ae..0000000 --- a/ccid/ccid/readers/ActivCardV3.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x09C3 - iManufacturer: ActivCard - idProduct: 0x0013 - iProduct: ActivCard USB Reader V3 - bcdDevice: 5.18 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 12.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 307200 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Aladdin_eToken_PRO_USB_72K_Java.txt b/ccid/ccid/readers/Aladdin_eToken_PRO_USB_72K_Java.txt deleted file mode 100644 index ebaf4a8..0000000 --- a/ccid/ccid/readers/Aladdin_eToken_PRO_USB_72K_Java.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x0529 - iManufacturer: Aladdin - idProduct: 0x0620 - iProduct: Token JC - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Error 0 - dwDataRate: 10752 bps - dwMaxDataRate: 10752 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Error 0 - dwMaxIFSD: 49 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0001023C - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Alya.txt b/ccid/ccid/readers/Alya.txt deleted file mode 100644 index c0bfcd6..0000000 --- a/ccid/ccid/readers/Alya.txt +++ /dev/null @@ -1,90 +0,0 @@ - idVendor: 0x0982 - iManufacturer: COVADIS - idProduct: 0x0007 - iProduct: ALYA - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/AxaltoV3.txt b/ccid/ccid/readers/AxaltoV3.txt deleted file mode 100644 index af017af..0000000 --- a/ccid/ccid/readers/AxaltoV3.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: Axalto - idProduct: 0x511C - iProduct: Reflex USB v3 - bcdDevice: 5.18 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 12.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 307200 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/BludriveII.txt b/ccid/ccid/readers/BludriveII.txt deleted file mode 100644 index 2b4e9b7..0000000 --- a/ccid/ccid/readers/BludriveII.txt +++ /dev/null @@ -1,65 +0,0 @@ - idVendor: 0x1B0E - iManufacturer: BLUTRONICS - idProduct: 0x1078 - iProduct: BLUDRIVE II CCID - bcdDevice: 0.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 1 - Got 256 clock frequencies but was expecting 1 - Support 3580 kHz - dwDataRate: 9600 bps - dwMaxDataRate: 115200 bps - bNumDataRatesSupported: 15 - Got 256 data rates but was expecting 15 - Support 9600 bps - Support 12800 bps - Support 13950 bps - Support 18600 bps - Support 19200 bps - Support 23040 bps - Support 27900 bps - Support 28800 bps - Support 37200 bps - Support 38400 bps - Support 55800 bps - Support 57600 bps - Support 74400 bps - Support 111600 bps - Support 115200 bps - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010130 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Broadcom_5880.txt b/ccid/ccid/readers/Broadcom_5880.txt deleted file mode 100644 index d1d5b00..0000000 --- a/ccid/ccid/readers/Broadcom_5880.txt +++ /dev/null @@ -1,54 +0,0 @@ - idVendor: 0x0A5C - iManufacturer: Broadcom Corp - idProduct: 0x5800 - iProduct: 5880 - bcdDevice: 1.01 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 5 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Connection timed out - dwDataRate: 9600 bps - dwMaxDataRate: 250000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Connection timed out - dwMaxIFSD: 247 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000102BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/C3PO_KBR36.txt b/ccid/ccid/readers/C3PO_KBR36.txt deleted file mode 100644 index fb0797d..0000000 --- a/ccid/ccid/readers/C3PO_KBR36.txt +++ /dev/null @@ -1,54 +0,0 @@ - idVendor: 0x0783 - iManufacturer: C3PO - idProduct: 0x0009 - iProduct: USB SMART CARD KEYBOARD - bcdDevice: 0.13 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 2 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 20.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 230400 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/C3PO_LTC32_USBv2.txt b/ccid/ccid/readers/C3PO_LTC32_USBv2.txt deleted file mode 100644 index 5fba973..0000000 --- a/ccid/ccid/readers/C3PO_LTC32_USBv2.txt +++ /dev/null @@ -1,54 +0,0 @@ - idVendor: 0x0783 - iManufacturer: C3PO - idProduct: 0x0010 - iProduct: USB SMART CARD READER - bcdDevice: 0.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 20.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 230400 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/C3PO_TLTC2USB.txt b/ccid/ccid/readers/C3PO_TLTC2USB.txt deleted file mode 100644 index 8365a69..0000000 --- a/ccid/ccid/readers/C3PO_TLTC2USB.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x0783 - iManufacturer: C3PO - idProduct: 0x0007 - iProduct: USB SMART CARD KEYBOARD - bcdDevice: 0.08 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 20.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 230400 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000001 - 2-wire protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CL1356T.txt b/ccid/ccid/readers/CL1356T.txt deleted file mode 100644 index 8504eca..0000000 --- a/ccid/ccid/readers/CL1356T.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x0B81 - iManufacturer: id3 Semiconductors - idProduct: 0x0200 - iProduct: Contactless Reader - bcdDevice: 1.12 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 106000 bps - dwMaxDataRate: 847000 bps - bNumDataRatesSupported: 4 - Support 106000 bps - Support 212000 bps - Support 424000 bps - Support 847000 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00040042 - ....02 Automatic parameter configuration based on ATR data - ....40 Automatic parameters negotiation made by the CCID - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan1021.txt b/ccid/ccid/readers/CardMan1021.txt deleted file mode 100644 index 73d4d02..0000000 --- a/ccid/ccid/readers/CardMan1021.txt +++ /dev/null @@ -1,76 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY - idProduct: 0x1021 - iProduct: Smart Card Reader USB - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.692 MHz - dwMaximumClock: 3.692 MHz - bNumClockSupported: 1 - Got 256 clock frequencies but was expecting 1 - Support 3692 kHz - dwDataRate: 9924 bps - dwMaxDataRate: 317591 bps - bNumDataRatesSupported: 19 - Got 256 data rates but was expecting 19 - Support 9924 bps - Support 19849 bps - Support 39698 bps - Support 79397 bps - Support 158795 bps - Support 317591 bps - Support 119096 bps - Support 198494 bps - Support 4962 bps - Support 59548 bps - Support 99247 bps - Support 7210 bps - Support 14421 bps - Support 28843 bps - Support 57687 bps - Support 115375 bps - Support 230750 bps - Support 86531 bps - Support 144218 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000103B1 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan3021.txt b/ccid/ccid/readers/CardMan3021.txt deleted file mode 100644 index 8233eef..0000000 --- a/ccid/ccid/readers/CardMan3021.txt +++ /dev/null @@ -1,165 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY AG - idProduct: 0x3021 - iProduct: Smart Card Reader USB - bcdDevice: 3.02 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan3121.txt b/ccid/ccid/readers/CardMan3121.txt deleted file mode 100644 index 46e06d5..0000000 --- a/ccid/ccid/readers/CardMan3121.txt +++ /dev/null @@ -1,52 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY AG - idProduct: 0x3021 - iProduct: Smart Card Reader USB - bcdDevice: 1.01 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.000 MHz - dwMaximumClock: 12.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 8065 bps - dwMaxDataRate: 96774 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000205B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan3621.txt b/ccid/ccid/readers/CardMan3621.txt deleted file mode 100644 index 6e49e17..0000000 --- a/ccid/ccid/readers/CardMan3621.txt +++ /dev/null @@ -1,167 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY AG - idProduct: 0x3621 - iProduct: Smart Card Reader USB - bcdDevice: 6.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan3821.txt b/ccid/ccid/readers/CardMan3821.txt deleted file mode 100644 index d8150ca..0000000 --- a/ccid/ccid/readers/CardMan3821.txt +++ /dev/null @@ -1,170 +0,0 @@ -Parsing Interface Descriptor for device: 003/009 - idVendor: 0x076B - iManufacturer: OMNIKEY AG - idProduct: 0x3821 - iProduct: Smart Card Reader USB - bcdDevice: 6.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0210 - 16 lines - 2 characters per line - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan4321.txt b/ccid/ccid/readers/CardMan4321.txt deleted file mode 100644 index 46ac9ed..0000000 --- a/ccid/ccid/readers/CardMan4321.txt +++ /dev/null @@ -1,170 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY - idProduct: 0x4321 - iProduct: Smart Card Reader USB - bcdDevice: 2.03 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan5125.txt b/ccid/ccid/readers/CardMan5125.txt deleted file mode 100644 index be7bc4f..0000000 --- a/ccid/ccid/readers/CardMan5125.txt +++ /dev/null @@ -1,168 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY AG - idProduct: 0x5125 - iProduct: Smart Card Reader USB - bcdDevice: 5.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan5321.txt b/ccid/ccid/readers/CardMan5321.txt deleted file mode 100644 index e2ea6de..0000000 --- a/ccid/ccid/readers/CardMan5321.txt +++ /dev/null @@ -1,170 +0,0 @@ - idVendor: 0x076B - iManufacturer: OMNIKEY - idProduct: 0x5321 - iProduct: Smart Card Reader USB - bcdDevice: 5.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CardMan6121.txt b/ccid/ccid/readers/CardMan6121.txt deleted file mode 100644 index f5b7a29..0000000 --- a/ccid/ccid/readers/CardMan6121.txt +++ /dev/null @@ -1,166 +0,0 @@ -Parsing Interface Descriptor for device: 003/012 - idVendor: 0x076B - iManufacturer: OMNIKEY AG - idProduct: 0x6622 - iProduct: Smart Card Reader USB - bcdDevice: 2.03 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ChangeLog b/ccid/ccid/readers/ChangeLog new file mode 100644 index 0000000..01b0345 --- /dev/null +++ b/ccid/ccid/readers/ChangeLog @@ -0,0 +1,1814 @@ +2011-01-29 14:31 rousseau + + * [r5570] supported_readers.txt: Add Xiring Leo v2 + +2011-01-29 12:44 rousseau + + * [r5565] Xiring_Leov2.txt: New firmware release + +2011-01-19 09:15 rousseau + + * [r5527] iDream.txt: update + +2011-01-05 16:31 rousseau + + * [r5488] Vasco_DP200.txt, Vasco_DP860.txt, supported_readers.txt: + Add Vasco DIGIPASS KEY 860 and Vasco DIGIPASS KEY 200 + +2011-01-04 10:04 rousseau + + * [r5477] supported_readers.txt: Sort devices by Product ID + +2011-01-04 10:01 rousseau + + * [r5476] supported_readers.txt: Reenable O2 Micro and Blutronics + "bogus" readers + +2011-01-03 14:53 rousseau + + * [r5463] Neowave_Weneo3.txt, supported_readers.txt: Add a new + Neowave Weneo token + + Closes Debian bug #570167 + "libccid: New Neowave Weneo card version with new productId" + +2010-12-21 09:47 rousseau + + * [r5461] Oberthur-ID-ONE_token_slim_v2.txt, supported_readers.txt: + Add Oberthur ID-ONE TOKEN SLIM v2 + +2010-12-16 08:59 rousseau + + * [r5457] GemPCPinpadv2.txt: new firmware + +2010-12-16 08:48 rousseau + + * [r5455] ACS_APG8201.txt, supported_readers.txt: Add ACS APG8201 + PINhandy 1 + +2010-12-15 13:29 rousseau + + * [r5451] Eutron_SIM_Pocket_Combo_(Card_Reader).txt, + Eutron_SIM_Pocket_Combo_(SIM_Reader).txt: regenerate + +2010-12-15 13:27 rousseau + + * [r5450] Eutron_SIM_Pocket_Combo_(Card_Reader).txt, + Eutron_SIM_Pocket_Combo_(SIM_Reader).txt, SIM_Pocket_Combo.txt: + Rename and split SIM_Pocket_Combo.txt in + Eutron_SIM_Pocket_Combo_(Card_Reader).txt and + Eutron_SIM_Pocket_Combo_(SIM_Reader).txt + + The device contains a hub with 3 devices: 2 CCID card readers and + a USB + Mass storage + +2010-12-12 15:28 rousseau + + * [r5445] supported_readers.txt: Add Feitian SCR310 + +2010-12-12 15:26 rousseau + + * [r5444] Feitian_SCR310.txt: Feitian SCR310 reader (also labeled + Rokey 301) + +2010-12-10 09:14 rousseau + + * [r5436] Todos_Connectable.txt: Todos Connectable reader + +2010-12-01 17:06 rousseau + + * [r5425] Fsij_gnuk.txt, supported_readers.txt: Add Free Software + Initiative of Japan Gnuk token + +2010-11-20 09:15 rousseau + + * [r5409] SpringCard_CSB6_Ultimate.txt: new firmware + +2010-11-17 13:06 rousseau + + * [r5404] Xiring_Leov2.txt: Add Xiring Leo v2 + +2010-11-12 14:23 rousseau + + * [r5397] Athena_IDProtect_Key.txt, supported_readers.txt: Athena + IDProtect Key v1 was bogus. The v2 should work. + +2010-11-12 09:57 rousseau + + * [r5396] CardMan6121.txt: Regenerate + +2010-10-27 07:13 rousseau + + * [r5365] BZH_uKeyCI800-K1.txt, supported_readers.txt: Add BZH + uKeyCI800-K18 + +2010-10-26 16:39 rousseau + + * [r5363] supported_readers.txt: Normalize the Vid and Pid hex + values + +2010-10-26 16:21 rousseau + + * [r5361] SCR3310_2.txt, supported_readers.txt: Add a new model of + SCM SCR 3310 + +2010-10-26 16:17 rousseau + + * [r5360] Akasa_AK-CR-03.txt: Add Akasa AK-CR-03 reader + +2010-09-03 14:00 rousseau + + * [r5237] HP_kus-0133.txt, supported_readers.txt: HP kus-0133 is + not supported + +2010-09-03 13:57 rousseau + + * [r5236] supported_readers.txt: update URL to use ccid/ + +2010-09-03 09:01 rousseau + + * [r5229] Precise_200_MC.txt: new firmware + +2010-08-31 18:51 rousseau + + * [r5207] ReinerSCT_cyberJack_RFID_basis.txt, + supported_readers.txt: Add ReinerSCT cyberJack RFID basis + +2010-08-26 12:05 rousseau + + * [r5189] supported_readers.txt: Remove O2 Micro Oz776 and + Blutronics Bludrive II CCID since they are no + more supported since version 1.4.0 + + The USB descriptor is bogus and the patch in + get_ccid_usb_interface() + does not work with libusb-1.0 + +2010-08-24 09:45 rousseau + + * [r5181] supported_readers.txt: add Gemalto SG CCID + +2010-08-23 08:24 rousseau + + * [r5173] Gemalto_SG.txt, supported_readers.txt: Add Gemalto Smart + Guardian (SG CCID) + +2010-08-23 08:23 rousseau + + * [r5172] supported_readers.txt: Rename Gemalto Smart Enterprise + Guardian + +2010-08-02 12:01 rousseau + + * [r5094] supported_readers.txt: Add support of the SCM SDI 010 + again. At least the contact interface can + be used. + + This should not conflict with the SCM proprietary driver since + the CCID + driver will only work with pcsc-lite > 1.6.2 and recent pcsc-lite + (>= 1.5.4) will load any specific driver before my "Class" CCID + driver. + +2010-08-01 17:01 rousseau + + * [r5087] supported_readers.txt: Add SCM SCL01x Contactless Reader + (disabled since unsupported) + +2010-08-01 16:58 rousseau + + * [r5086] supported_readers.txt: Add Gemalto Hybrid Smartcard + Reader + +2010-08-01 16:49 rousseau + + * [r5084] Tianyu_Smart_Card_Reader.txt, supported_readers.txt: Add + Tianyu Smart Card Reader + +2010-06-30 09:00 rousseau + + * [r5050] Broadcom_5880v3.txt, supported_readers.txt: Add a new + Broadcom 5880 reader (idProduct: 0x5802) + +2010-06-21 08:40 rousseau + + * [r5019] ACS_AET65.txt: add ACS AET65 (same idProduct as many + other ACS devices) + +2010-06-19 20:36 rousseau + + * [r5017] LTC36.txt, supported_readers.txt: add C3PO LTC36 + +2010-06-16 20:26 rousseau + + * [r5007] Todos_Cx00.txt, supported_readers.txt: add Todos CX00 + +2010-06-16 18:20 rousseau + + * [r5002] Dectel_CI692.txt, supported_readers.txt: add Dectel CI692 + +2010-06-16 18:18 rousseau + + * [r5001] Kingtrust_Multi-Reader.txt, supported_readers.txt: add + Kingtrust Multi-Reader + +2010-06-01 14:24 rousseau + + * [r4975] GemPCTwin.txt: update + +2010-05-27 10:18 rousseau + + * [r4965] Lenovo.txt: update + +2010-05-15 14:44 rousseau + + * [r4943] GemPCPinpadv2.txt: Gemalto PC pinpad v1+ + +2010-05-03 13:38 rousseau + + * [r4914] SCR3500.txt: add SCM SCR3500 (same idProduct as SCR355 + but different firmware) + +2010-05-02 10:18 rousseau + + * [r4908] Athena_IDProtect_Key.txt, supported_readers.txt: add + Athena IDProtect Key (unsupported see + http://www.opensc-project.org/pipermail/opensc-user/2010-May/004023.html) + +2010-04-24 13:56 rousseau + + * [r4893] Kobil_Smart_Token.txt, Kobil_mIDentity_4smart.txt, + Kobil_mIDentity_4smart_AES.txt, Kobil_mIDentity_fullsize.txt, + Kobil_mIDentity_fullsize_AES.txt, Kobil_mIDentity_visual.txt, + supported_readers.txt: add KOBIL Smart Token, KOBIL mIDentity + 4smart, + KOBIL mIDentity 4smart AES, KOBIL mIDentity visual, + KOBIL mIDentity fullsize, KOBIL mIDentity 4smart fullsize AES + +2010-04-16 15:37 rousseau + + * [r4876] SCL01x.txt: SCM SCL01x Contactless Reader + +2010-04-09 17:38 rousseau + + * [r4869] ATMEL_AT90SCR050.txt, ATMEL_AT90SCR100.txt, + ATMEL_VaultIC420.txt, ATMEL_VaultIC440.txt, ATMEL_VaultIC460.txt, + supported_readers.txt: Add Atmel AT90SCR100, Atmel AT90SCR050, + Atmel VaultIC420, Atmel + VaultIC440, Atmel VaultIC460 + +2010-04-06 17:22 rousseau + + * [r4856] supported_readers.txt: Remove duplicate Vid/Pid entry for + Alcor Micro SCR001 and Micro AU9520 + +2010-04-06 15:49 rousseau + + * [r4854] Vasco_DP855.txt, Vasco_DP865.txt, Vasco_DPKey200.txt, + Vasco_DPKey860.txt, supported_readers.txt: Add Vasco DIGIPASS KEY + 860, Vasco DIGIPASS KEY 200, Vasco DP855, Vasco + DP865 + +2010-03-31 12:33 rousseau + + * [r4849] GoldKey_PIV_Token.txt, supported_readers.txt: add GoldKey + PIV Token + +2010-03-14 16:55 rousseau + + * [r4815] supported_readers.txt: Enable the Broadcom 5880 reader. + It should work after a firmware + upgrade. + +2010-03-12 15:42 rousseau + + * [r4814] supported_readers.txt: Rename Gemplus in Gemalto + +2010-02-26 17:35 rousseau + + * [r4780] supported_readers.txt: SCM SDI 010 removed on + manufacturer request since not supported by my driver + +2010-02-24 14:36 rousseau + + * [r4776] supported_readers.txt: Removed Smart SBV280 on + manufacturer request. They use libusb directly. + +2010-02-24 13:26 rousseau + + * [r4775] Broadcom_5880.txt: regenerate + +2010-02-23 21:25 rousseau + + * [r4771] Covadis_Auriga.txt, supported_readers.txt: add Covadis + Auriga + +2010-02-12 20:02 rousseau + + * [r4761] id3_CL1356D.txt, supported_readers.txt: id3_CL1356D.txt + is a duplicate of id3_CL1356T5.txt + +2010-02-12 19:44 rousseau + + * [r4759] id3_CL1356T5.txt, supported_readers.txt: add id3 CL1356T5 + +2010-02-12 15:36 rousseau + + * [r4757] Gemalto_PDT.txt, supported_readers.txt: update Gemalto + PDT + +2010-02-09 21:23 rousseau + + * [r4747] Makefile.am: Do not include the reader descriptions in + the archive, only the + supported_readers.txt file + +2010-02-05 13:33 rousseau + + * [r4712] CL1356T.txt, id3_CL1356T.txt: rename CL1356T.txt in + id3_CL1356T.txt like the other id3_* readers + +2010-01-29 19:51 rousseau + + * [r4694] GPFCryptoStick.txt, supported_readers.txt: add German + Privacy Foundation Crypto Stick v1.2 + +2010-01-19 15:43 rousseau + + * [r4676] GemPC_Express.txt: update + +2010-01-13 15:52 rousseau + + * [r4665] Ask_CPL108.txt, supported_readers.txt: ass Ask CPL108 + +2010-01-11 10:24 rousseau + + * [r4655] supported_readers.txt: update Gemalto Prox-DU and Prox-SU + names + +2010-01-11 10:23 rousseau + + * [r4654] supported_readers.txt: update "Gemalto Prox DU" name + +2010-01-02 14:11 rousseau + + * [r4631] Broadcom_5880v2.txt, supported_readers.txt: another + Broadcom 5880 reader (iProduct: 5880) which looks like to work + correctly + +2009-12-16 11:38 rousseau + + * [r4617] Todos_AGM2_CCID.txt: firmware 1.01 + +2009-12-09 17:22 rousseau + + * [r4597] Precise_250_MC.txt: firmware update + +2009-12-05 13:41 rousseau + + * [r4590] supported_readers.txt: improve docmentation of bogus + readers + +2009-12-05 13:38 rousseau + + * [r4589] supported_readers.txt: add OCS ID-One Cosmo Card (with + ProductID 0x6356) in a commented line + (unsupported) + +2009-12-05 13:32 rousseau + + * [r4588] Gemalto_HybridSmartcardReader.txt: Gemalto Hybrid + Smartcard Reader + +2009-12-02 16:18 rousseau + + * [r4584] Precise_200_MC.txt: new firmware + +2009-11-18 08:05 rousseau + + * [r4556] Oberthur-CosmoCard1.txt: other version of the OCS ID-One + Cosmo Card + +2009-10-21 14:42 rousseau + + * [r4502] Precise_250_MC.txt: new firmware + +2009-10-21 13:48 rousseau + + * [r4501] Precise_200_MC.txt: new firmware + +2009-10-14 16:15 rousseau + + * [r4493] Smart_SBV280.txt, supported_readers.txt: add Smart SBV280 + +2009-10-02 08:51 rousseau + + * [r4413] Todos_AGM2_CCID.txt: update + +2009-09-22 08:16 rousseau + + * [r4392] CherrySmartTerminalXX7X.txt, supported_readers.txt: add + Cherry SmartTerminal XX7X + +2009-09-10 14:22 rousseau + + * [r4382] DellSK-3106.txt: regenerate + +2009-08-30 13:41 rousseau + + * [r4372] Todos_AGM2_CCID.txt, supported_readers.txt: add Todos + AGM2 CCID + +2009-07-17 13:43 rousseau + + * [r4318] Panasonic_USB_Smart_Card_Reader_7A-Smart.txt, + supported_readers.txt: add Panasonic USB Smart Card Reader + 7A-Smart + +2009-07-07 06:24 rousseau + + * [r4311] ATMEL_AT91SC192192CT-USB.txt, supported_readers.txt: add + ATMEL_AT91SC192192CT-USB.txt + +2009-07-06 13:44 rousseau + + * [r4304] Alcor_SCR001.txt, supported_readers.txt: add Alcor Micro + SCR001 + +2009-06-25 15:56 rousseau + + * [r4276] Aktiv_Rutoken_ECP.txt, supported_readers.txt: add Aktiv + Rutoken ECP + +2009-06-20 16:25 rousseau + + * [r4267] supported_readers.txt: add missing ':' separator + +2009-06-19 19:09 rousseau + + * [r4263] Synnix_STD200.txt, supported_readers.txt: add Synnix + STD200 + +2009-06-16 09:26 rousseau + + * [r4260] supported_readers.txt: add 2 Neowave Weneo tokens + +2009-06-16 09:22 rousseau + + * [r4257] Neowave_Weneo2.txt: another Neowave token + - 512MB flash storage + - OS is "IBM JCOP41 Standard" + - 32k internal memory + +2009-06-13 16:23 rousseau + + * [r4254] Kobil_EMV_CAP.txt: new firmware + +2009-05-27 08:58 rousseau + + * [r4226] ACR122U_PICC.txt: new firmware + +2009-05-13 12:08 rousseau + + * [r4204] Softforum_XecureHSM.txt, Softforum__XecureHSM.txt: remove + a _ in the filename + +2009-05-13 12:07 rousseau + + * [r4203] Samsung_XecureHSM.txt, Softforum__XecureHSM.txt, + supported_readers.txt: rename Samsung XecureHSM in Softforum + XecureHSM + +2009-05-12 12:06 rousseau + + * [r4197] Samsung_XecureHSM.txt, supported_readers.txt: add Samsung + XecureHSM + +2009-05-08 06:30 rousseau + + * [r3494] C3PO_LTC32_USBv2_old.txt, Makefile.am: + C3PO_LTC32_USBv2_old.txt is a duplicate of C3PO_TLTC2USB.txt + +2009-05-07 13:21 rousseau + + * [r3490] LTC32.txt: duplicate of C3PO_LTC32_USBv2.txt + +2009-05-02 11:33 rousseau + + * [r3485] SCR331-DI-NTTCom.txt: the CCID descriptor was duplicated + +2009-04-21 08:55 rousseau + + * [r3462] Feitian_SCR301.txt, supported_readers.txt: add Feitian + SCR301 + +2009-04-16 20:17 rousseau + + * [r3455] supported_readers.txt: add iDream Vid/Pid but commented + as the reader is bogus + +2009-04-16 11:28 rousseau + + * [r3454] supported_readers.txt: add Raritan D2CIM-DVUSB VM/CCID in + the should work list + +2009-04-09 18:45 rousseau + + * [r3423] Raritan_D2CIM-DVUSB.txt: add Raritan D2CIM-DVUSB VM/CCID + virtual reader + +2009-04-08 19:49 rousseau + + * [r3413] SCL010.txt, supported_readers.txt: The SCM SCL010 + Contactless Reader is not supported + +2009-04-02 07:30 rousseau + + * [r3409] GemProxDU_contact.txt, GemProxDU_contactless.txt, + GemProxSU_contact.txt, GemProxSU_contactless.txt: regenerate + +2009-03-29 11:48 rousseau + + * [r3401] supported_readers.txt: remove support of Reiner-SCT + cyberJack pinpad(a) on request of + Reiner-SCT + + You should user the Reiner-SCT driver instead + +2009-03-26 14:36 rousseau + + * [r3380] GemProxDU_contact.txt, GemProxDU_contactless.txt, + GemProxSU_contact.txt, GemProxSU_contactless.txt, + supported_readers.txt: add Gemalto GemProx DU and SU readers + +2009-03-24 14:28 rousseau + + * [r3374] DellSCRK.txt: update + +2009-03-24 13:09 rousseau + + * [r3373] GemPCTwin_serial.txt: add a (faked) USB descriptor for + the GemPC Twin using serial + communication + +2009-03-13 15:52 rousseau + + * [r3344] Alya.txt: remove fingerprint part + +2009-02-25 13:01 rousseau + + * [r3325] ACS_ACR100.txt, ACS_ACR38_plugin.txt: add ACS ACR100 and + ACS ACR38 plugin + +2009-02-25 12:48 rousseau + + * [r3324] ACR122U_PICC.txt: update firmware + +2009-02-18 13:31 rousseau + + * [r3320] Precise_200_MC.txt, supported_readers.txt: add Precise + Biometrics 200 MC and 250 MC in the "should work" list + +2009-02-14 08:56 rousseau + + * [r3316] Makefile.am, Philips_SmartMX.txt, SafeNet_IKey4000.txt, + supported_readers.txt: use product name Philips SmartMX instead + of commercial name + SafeNet IKey4000. + + SafeNet IKey4000 is also used with different device like: + idVendor: 0x04B9 iManufacturer: SafeNet, Inc. + idProduct: 0x1206 iProduct: iKey 4000 + Found a CCID/ICCD device + idVendor: 0x04B9 + iManufacturer: SafeNet, Inc. + idProduct: 0x1206 + iProduct: iKey 4000 + bcdDevice: 1.10 (firmware release?) + bLength: 9 + bDescriptorType: 4 + bInterfaceNumber: 0 + bAlternateSetting: 0 + bNumEndpoints: 0 + Control only + bInterfaceClass: 0xFF + NOT A CCID DEVICE + Class is 0xFF (proprietary) + bInterfaceSubClass: 0 + bInterfaceProtocol: 0 + bulk transfer, optional interrupt-IN (CCID) + iInterface: 0 + USB extra length is too short: 2 + + NOT A CCID DEVICE + +2009-02-11 12:50 rousseau + + * [r3315] TianYu_CCID_SmartKey.txt, supported_readers.txt: add + TianYu CCID SmartKey in the should work list + +2009-01-29 20:19 rousseau + + * [r3296] supported_readers.txt: use generic "Realtek" instead of + one particular brand "iMONO" + +2009-01-19 14:19 rousseau + + * [r3283] GemPCKey.txt: regenerate + +2009-01-19 08:15 rousseau + + * [r3282] Aktiv_Rutoken_Magistra.txt, supported_readers.txt: add + Aktiv Rutoken Magistra in the "Should work but untested by me" + list + +2008-12-17 09:58 rousseau + + * [r3237] supported_readers.txt: add Atmel AT98SC032CT in the + should work list + +2008-12-16 17:06 rousseau + + * [r3236] ATMEL_AT98SC032CT.txt: add ATMEL AT98SC032CT + +2008-12-12 22:07 rousseau + + * [r3232] supported_readers.txt: add iMONO 43 in 1 + Sim + Smart + Card Reader in the "should work" list + +2008-12-12 21:39 rousseau + + * [r3231] iMONO.txt: add iMONO USB2.0-CRW reader + +2008-12-09 21:43 rousseau + + * [r3228] supported_readers.txt: add Xiring Xi Sign PKI in the + supported list + +2008-11-27 19:15 rousseau + + * [r3227] Neowave_Weneo.txt: add Neowave Weneo device + +2008-11-22 13:09 rousseau + + * [r3222] Omnikey_noname1.txt, supported_readers.txt: add a Noname + reader (from Omnikey) + +2008-11-20 09:05 rousseau + + * [r3220] supported_readers.txt: add MSI StarReader SMART in the + should work but untested list + +2008-11-19 21:10 rousseau + + * [r3219] MSI_StarReader_SMART.txt: add MSI StarReader SMART + +2008-11-19 17:23 rousseau + + * [r3218] ACR122U_PICC.txt: new firmware + +2008-11-18 14:37 rousseau + + * [r3206] supported_readers.txt: add VMware Virtual USB CCID in + should work but untested list + +2008-11-14 08:54 rousseau + + * [r3203] supported_readers.txt: move Broadcom 5880 in the + Unsupported list and comment the entry in + readers/supported_readers.txt + + No communication to the device ("Resource temporarily + unavailable" error) + +2008-11-11 08:46 rousseau + + * [r3201] SDI010.txt: new firmware + +2008-11-10 08:49 rousseau + + * [r3196] SCR331-DI.txt: regenerate + +2008-11-08 16:28 rousseau + + * [r3195] Xiring_XI-SIGN.txt, Xiring_XI-SIGN_6000.txt: add Xiring + Xi Sign PKI et Xiring Xi Sign 6000 + +2008-11-08 10:43 rousseau + + * [r3192] supported_readers.txt: move the "jNet Technology jToken + s1" in the Unsupported list and remove + it (commented entry) from the supported_readers.txt + +2008-11-07 13:39 rousseau + + * [r3191] VMware_Virtual_USB_CCID.txt: add VMware Virtual USB CCID + reader (available since VMWare 6.5) + +2008-10-31 12:41 rousseau + + * [r3189] supported_readers.txt: add jNet Technology jToken s1 in + should work but untested list + +2008-10-31 12:35 rousseau + + * [r3187] jNet_jToken_s1.txt: add jNet_jToken_s1.txt + +2008-10-27 15:57 rousseau + + * [r3182] supported_readers.txt: add Gemalto PDT in should work + list + +2008-10-27 15:56 rousseau + + * [r3181] Gemalto_PDT.txt, Makefile.am: add Gemalto PDT + +2008-10-16 19:22 rousseau + + * [r3176] supported_readers.txt: add ACS ACR122U PICC Interface in + the Should work but untested by me + list + +2008-10-16 19:18 rousseau + + * [r3175] ACR122U_PICC.txt, Makefile.am: add ACR122U_PICC.txt + +2008-10-11 09:05 rousseau + + * [r3163] supported_readers.txt: add HP MFP Smart Card Reader in + the "Should work but untested by me" list + +2008-10-11 09:00 rousseau + + * [r3162] HP_MFP_SmartCardReader.txt, Makefile.am: add + HP_MFP_SmartCardReader.txt + +2008-10-11 09:00 rousseau + + * [r3161] HPUSBSmartCardReader.txt: reindent + +2008-10-07 09:18 rousseau + + * [r3151] supported_readers.txt: add "KONA USB SmartCard" to the + should work list + +2008-09-27 15:41 rousseau + + * [r3148] supported_readers.txt: add Broadcom Corp 5880 (found in + Dell E6500 laptop) in the "Should work + but untested by me" list + +2008-09-27 15:40 rousseau + + * [r3147] Broadcom_5880.txt, Makefile.am: add Broadcom_5880.txt + +2008-09-13 18:58 rousseau + + * [r3129] Makefile.am, Pro-Active_CSB6_Ultimate.txt: Pro-Active + CSB6 Ultimate is renamed SpringCard CSB6 Ultimate + +2008-09-13 18:56 rousseau + + * [r3128] supported_readers.txt: add SpringCard CrazyWriter, CSB6 + Basic, CSB6 Secure, CSB6 Ultimate, + EasyFinger Standard, EasyFinger Ultimate and Prox'N'Roll in the + "Should + work but untested by me" list + +2008-09-13 14:21 rousseau + + * [r3127] supported_readers.txt: rename Pro-Active in Springcard + +2008-09-10 11:59 rousseau + + * [r3122] Makefile.am, SpringCard_CSB6_Basic.txt, + SpringCard_CSB6_Secure.txt, SpringCard_CSB6_Ultimate.txt, + SpringCard_CrazyWriter.txt, SpringCard_EasyFinger_Standard.txt, + SpringCard_EasyFinger_Ultimate.txt, SpringCard_Prox_N_Roll.txt: + add SpringCard readers Prox'N'Roll, CSB6 Basic, EasyFinger + Ultimate, + CSB6 Ultimate, EasyFinger Standard, CrazyWriter, CSB6 Secure + +2008-09-09 08:51 rousseau + + * [r3115] Makefile.am, mIDentityXL.txt: add mIDentityXL.txt + +2008-09-09 08:49 rousseau + + * [r3114] supported_readers.txt: differentiate between KOBIL + mIDentity M (pid 0x4000) and XL (pid 0x4001) + +2008-08-14 08:44 rousseau + + * [r3090] supported_readers.txt: add Atmel AT91SO in the "Should + work but untested by me" list + +2008-08-14 08:40 rousseau + + * [r3089] ATMEL_AT91SO.txt, Makefile.am: add ATMEL_AT91SO.txt + +2008-08-07 08:18 rousseau + + * [r3084] CherrySmartTerminalXX1X.txt, supported_readers.txt: add + Cherry SmartTerminal XX1X + +2008-07-29 07:27 rousseau + + * [r3060] supported_readers.txt: add the Aladdin eToken PRO USB 72K + Java in the "Should work but untested + by me" list + +2008-07-29 07:22 rousseau + + * [r3059] Aladdin_eToken_PRO_USB_72K_Java.txt, Makefile.am: add + Aladdin_eToken_PRO_USB_72K_Java.txt + +2008-06-25 08:58 rousseau + + * [r3023] supported_readers.txt: add "Oberthur ID-One Cosmo Card" + in the "Should work but untested by me" + list + +2008-06-25 08:48 rousseau + + * [r3022] Makefile.am, Oberthur-CosmoCard.txt: add + Oberthur-CosmoCard.txt + +2008-06-18 15:51 rousseau + + * [r3010] KAAN_Advanced.txt: firmware 1.19 + +2008-06-18 15:47 rousseau + + * [r3009] KAAN_Base.txt: firmware 1.19 + +2008-06-17 13:47 rousseau + + * [r3008] Kobil_EMV_CAP.txt: firmware 0.30 + +2008-06-17 12:51 rousseau + + * [r3007] KAAN_Advanced.txt: regenerate + +2008-06-08 08:43 rousseau + + * [r2984] supported_readers.txt: add Pro-Active CSB6 Ultimate in + "should work" list + +2008-05-28 13:02 rousseau + + * [r2972] supported_readers.txt: add id3 Semiconductors CL1356A HID + in the should work list + +2008-05-28 13:00 rousseau + + * [r2971] Makefile.am: add id3_CL1356D.txt + +2008-05-28 12:58 rousseau + + * [r2970] Makefile.am, id3_CL1356A_HID.txt: add id3_CL1356A_HID.txt + +2008-05-27 09:02 rousseau + + * [r2969] CardMan5321.txt: regenerate + +2008-05-22 09:12 rousseau + + * [r2964] GemCoreSIMPro.txt: update + +2008-05-09 14:34 rousseau + + * [r2937] Makefile.am, Pro-Active_CSB6_Ultimate.txt: add + Pro-Active_CSB6_Ultimate.txt + +2008-04-30 12:09 rousseau + + * [r2921] supported_readers.txt: add Covadis Véga in "Should work + but untested by me" list + +2008-04-30 12:05 rousseau + + * [r2920] Vega-Alpha.txt: regenerate + +2008-04-09 13:56 rousseau + + * [r2876] KEBTechnology_KONA_USB_SmartCard.txt, Makefile.am: add + KEBTechnology_KONA_USB_SmartCard.txt + +2008-04-09 13:06 rousseau + + * [r2875] supported_readers.txt: add the Validy TokenA sl vt in the + should work list + +2008-04-09 13:04 rousseau + + * [r2874] Makefile.am, Validy_TokenA.txt: add Validy_TokenA.txt + +2008-04-09 12:58 rousseau + + * [r2873] supported_readers.txt: Add Vasco DP905 in the should work + list + +2008-03-29 17:33 rousseau + + * [r2863] Makefile.am, Vasco_DP905.txt: add Vasci DP905 + +2008-03-29 14:59 rousseau + + * [r2856] supported_readers.txt: move the Blutronics and Covadis + reader before the Bogus readers + +2008-03-25 14:20 rousseau + + * [r2855] Makefile.am, Precise_250_MC.txt: add Precise Biometrics + 250 MC + +2008-03-07 08:46 rousseau + + * [r2847] supported_readers.txt: add Covadis Alya + +2008-03-07 08:14 rousseau + + * [r2846] Alya.txt: update + +2008-02-27 12:02 rousseau + + * [r2844] Alya.txt, Makefile.am, Vega-Alpha.txt: add Covadis.ch + Alya and Vega-Alpha readers + +2008-02-21 12:17 rousseau + + * [r2837] ACR122U.txt, Makefile.am: add ACR122U.txt + +2008-02-14 19:34 rousseau + + * [r2821] supported_readers.txt: add Cherry SmartBoard XX1X + +2008-02-14 19:30 rousseau + + * [r2820] CherrySmartBoardXX1X.txt, Makefile.am: add + CherrySmartBoardXX1X.txt + +2008-02-14 11:01 rousseau + + * [r2818] supported_readers.txt: add Gemplus Gem e-Seal Pro + +2008-02-14 10:00 rousseau + + * [r2813] Gem_e-SealPro.txt, Makefile.am: add Gem_e-SealPro.txt + +2008-02-06 09:14 rousseau + + * [r2794] supported_readers.txt: add Blutronics Bludrive II CCID in + supported list + +2008-02-06 08:55 rousseau + + * [r2792] BludriveII.txt, Makefile.am: add Bludrive II CCID + +2008-02-01 10:10 rousseau + + * [r2782] supported_readers.txt: add support of Smart Enterprise + Guardian + +2008-01-22 09:51 rousseau + + * [r2751] GemCoreSIMPro.txt: do not duplicate the description for + each slot + +2008-01-14 15:36 rousseau + + * [r2734] supported_readers.txt: do not use a & (as in "G&D") since + Leopard cannot parse it as valid XML + +2007-11-23 14:23 rousseau + + * [r2711] GemaltoSmartEnterpriseGuardian.txt, Makefile.am: add + Gemalto Smart Enterprise Guardian Secure USB Device + +2007-11-16 09:27 rousseau + + * [r2688] supported_readers.txt: add Reiner-SCT cyberJack pinpad(a) + in the bogus section + +2007-11-16 09:26 rousseau + + * [r2687] supported_readers.txt: create a section "Bogus readers + but partly supported" and move the C3PO + LTC31 (old model) and ActivCard USB Reader 2.0 in this section + +2007-11-15 23:02 rousseau + + * [r2684] Makefile.am, ReinerSCT.txt: add ReinerSCT.txt + +2007-11-15 22:03 rousseau + + * [r2683] supported_readers.txt: add Charismathics token in the + "Should work but untested by me" list + +2007-11-15 21:59 rousseau + + * [r2682] Charismathics.txt, Makefile.am: add Charismathics.txt + +2007-11-01 14:37 rousseau + + * [r2676] Kobil_EMV_CAP.txt: new firmware + +2007-10-24 16:01 rousseau + + * [r2674] supported_readers.txt: add Eutron Digipass 860 in the + supported list + +2007-10-24 15:58 rousseau + + * [r2673] Eutron_Digipass_860.txt, Makefile.am: add Eutron Digipass + 860 + +2007-10-24 15:50 rousseau + + * [r2672] Eutron_CryptoIdentity.txt: new firmware + +2007-10-24 15:49 rousseau + + * [r2671] supported_readers.txt: add "Eutron Smart Pocket" in the + supported list + +2007-10-24 15:48 rousseau + + * [r2670] Eutron_Smart_Pocket.txt, Makefile.am: add + Eutron_Smart_Pocket.txt + +2007-10-24 15:27 rousseau + + * [r2669] supported_readers.txt: add "Kobil EMV CAP - SecOVID + Reader III" in the "should work" list + +2007-10-24 15:25 rousseau + + * [r2668] Kobil_EMV_CAP.txt, Makefile.am: add Kobil_EMV_CAP.txt + +2007-10-23 09:33 rousseau + + * [r2667] SCR3320.txt, SCR333.txt, SCR3340.txt: firmware update + +2007-10-21 16:37 rousseau + + * [r2666] SCR331.txt: regenerated on linux + +2007-10-21 14:55 rousseau + + * [r2665] SCR331.txt: update firmware + +2007-10-16 19:51 rousseau + + * [r2656] supported_readers.txt: add "Lenovo Integrated Smart Card + Reader" in "Should work but untested + by me" list + +2007-10-16 19:45 rousseau + + * [r2655] Lenovo.txt, Makefile.am: add Lenovo Integrated Smart Card + Reader + +2007-10-14 14:15 rousseau + + * [r2652] SCR3310.txt, SCR3311.txt, SCR335.txt: new firmware + version + +2007-10-11 14:45 rousseau + + * [r2649] GemPCPinpad.txt, GemPCTwin.txt: update + +2007-09-28 09:55 rousseau + + * [r2628] supported_readers.txt: add Eutron CryptoIdentity + +2007-09-28 09:54 rousseau + + * [r2627] Eutron_CryptoIdentity.txt, Makefile.am: add Eutron + CryptoIdentity (generated under FreeBSD 6.2-STABLE) + +2007-09-21 20:49 rousseau + + * [r2626] supported_readers.txt: add Giesecke & Devrient CardToken + 350 and 550. + They were listed in the README, the web site but not in this + list. + +2007-08-21 21:14 rousseau + + * [r2617] supported_readers.txt: add SafeNet IKey4000 in the + "Should work but untested by me" list + +2007-08-21 21:12 rousseau + + * [r2616] Makefile.am, SafeNet_IKey4000.txt: add SafeNet IKey4000 + +2007-08-03 20:07 rousseau + + * [r2608] GnD_StarSignCardToken350.txt, + GnD_StarSignCardToken550.txt, Makefile.am: add Giesecke & + Devrient StarSign Card Token 350 and 550 + +2007-08-03 14:31 rousseau + + * [r2606] CardMan5321.txt, Makefile.am, supported_readers.txt: add + CardMan5321 + +2007-08-02 20:13 rousseau + + * [r2604] supported_readers.txt: add O2 Micro Oz776 (ProductID + 0x7772) to the "Should work but untested + by me" list + +2007-08-02 20:07 rousseau + + * [r2603] Makefile.am, Oz776_7772.txt: add new O2Micro Oz776 + +2007-06-30 16:07 rousseau + + * [r2582] ActivkeySim.txt: update + +2007-06-25 12:23 rousseau + + * [r2579] JCOP41V221.txt, supported_readers.txt: add "Philips + Semiconductors JCOP41V221" ICCD card in "Should work but + untested by me" list + +2007-06-18 08:27 rousseau + + * [r2566] Sitecom_MD-010.txt: remove trash at end of file + +2007-05-10 09:10 rousseau + + * [r2521] Makefile.am, e-gate.txt, supported_readers.txt: add + SchlumbergerSema Cyberflex Access e-gate in the should work list + +2007-05-10 08:03 rousseau + + * [r2516] Makefile.am, Sitecom_MD-010.txt, supported_readers.txt: + add Sitecom USB simcard reader MD-010 in the "Should work but + untested + by me" list + +2007-05-10 07:57 rousseau + + * [r2515] supported_readers.txt: correct KOBIL mIDentity names + +2007-05-03 15:21 rousseau + + * [r2509] supported_readers.txt: add OmniKey CardMan 4321 in + "Should work but untested by me" list + +2007-05-03 15:19 rousseau + + * [r2508] CardMan4321.txt, Makefile.am: add CardMan4321.txt + +2007-03-20 21:23 rousseau + + * [r2488] SCR331-DI.txt, SCR331.txt, SCR3310.txt, SCR3311.txt: + firmware updates + +2007-03-15 20:50 rousseau + + * [r2483] FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt, + FujitsuSiemens_SmartCard_USB_2A.txt, Makefile.am, + supported_readers.txt: add Fujitsu Siemens Computers SmartCard + USB 2A and SmartCard Keyboard + USB 2A readers + +2007-02-28 21:12 rousseau + + * [r2454] supported_readers.txt: differentiate the two KOBIL + mIDentity devices (Basic and Classic) + +2007-02-25 13:22 rousseau + + * [r2440] supported_readers.txt: add (new) KOBIL mIDentity + +2007-01-27 15:42 rousseau + + * [r2360] Makefile.am, SK-3106.txt: SK-3106.txt is a duplicate of + DellSK-3106.txt + +2007-01-04 20:26 rousseau + + * [r2297] HPUSBSmartCardReader.txt, supported_readers.txt: add HP + USB Smartcard Reader + +2006-12-20 20:41 rousseau + + * [r2277] CardMan1021.txt, Makefile.am, supported_readers.txt: add + OmniKey CardMan 1021 + +2006-12-20 20:40 rousseau + + * [r2276] CardMan3021.txt: a line was wrapped + +2006-12-05 21:12 rousseau + + * [r2269] KAAN_Advanced.txt: upgrade firmware to 1.02 + +2006-12-05 21:04 rousseau + + * [r2268] KAAN_Base.txt: upgrade firmware to 1.02 + +2006-11-30 22:35 rousseau + + * [r2251] Makefile.am: change C3PO_LTC32_USBv_old.txt in + C3PO_LTC32_USBv2_old.txt + +2006-11-23 19:58 rousseau + + * [r2237] C3PO_KBR36.txt, C3PO_LTC32_USBv2.txt, + C3PO_LTC32_USBv2_old.txt, C3PO_TLTC2USB.txt, Makefile.am: add + C3PO_* files + +2006-11-18 20:56 rousseau + + * [r2224] supported_readers.txt: add C3PO TLTC2USB, LTC32 USBv2 + with keyboard support and KBR36 in the + "Should work but untested by me" list + +2006-11-17 16:39 rousseau + + * [r2222] Teo.txt, supported_readers.txt: add Teo by Xiring in the + supported list + +2006-11-17 16:36 rousseau + + * [r2221] LTC32.txt, supported_readers.txt: add C3PO LTC32 + +2006-09-22 14:51 rousseau + + * [r2174] CardMan5125.txt, supported_readers.txt: add OmniKey + CardMan 5125 in the should work but unsupported list + +2006-09-22 14:04 rousseau + + * [r2172] supported_readers.txt: move the RSA SID800 in the + supported list now that I have a working + model + +2006-09-22 14:04 rousseau + + * [r2171] sid800.txt: update using a new SID800 model. + Unfortunately the firmware version has + not changed so it is not possible to detect a non working model + +2006-09-14 19:55 rousseau + + * [r2161] CardMan5121.txt, CardMan5125.txt, supported_readers.txt: + The reader was a 5121 in fact + +2006-09-10 19:56 rousseau + + * [r2153] AU9520.txt: new firmware (1.02) + +2006-08-11 16:10 rousseau + + * [r2133] CL1356T.txt, Makefile.am: add id3 Semiconductors CL1356T + in the "should work but unsuported" list + +2006-08-10 22:31 rousseau + + * [r2131] Makefile.am, iDream.txt: Add iDream (or THRC2002-2) to + the "Unsupported or partly supported CCID + readers" list. + + Thanks to Dr Jean-Pierre Szikora for the report + +2006-07-09 15:03 rousseau + + * [r2101] AU9520.txt, supported_readers.txt: add Alcor Micro AU9520 + +2006-07-09 14:50 rousseau + + * [r2100] id3_CL1356D.txt, supported_readers.txt: add id3 + Semiconductors CL1356D + +2006-05-19 11:58 rousseau + + * [r2047] SPR532.txt: update with firmware 5.10 + +2006-05-16 22:00 rousseau + + * [r2044] ActivkeySim.txt, supported_readers.txt: add Actividentity + (ActiveCard) Activkey Sim + +2006-05-04 12:13 rousseau + + * [r2038] supported_readers.txt: add C3PO LTC31 (new model, USB + product id 0x0006) in the supported list + +2006-05-04 11:33 rousseau + + * [r2037] supported_readers.txt: add "HP USB Smart Card Keyboard" + in the "Should work but untested by + me:" list + +2006-05-04 11:31 rousseau + + * [r2036] HPUSBSmartCardKeyboard.txt, Makefile.am: add + HPUSBSmartCardKeyboard.txt + +2006-05-03 20:18 rousseau + + * [r2034] CardMan3021.txt, Makefile.am: add OmniKey CardMan 3021 in + the "Should work but untested by me" list + +2006-05-03 17:46 rousseau + + * [r2033] LTC31v2.txt, Makefile.am: add LTC31 (new version) + +2006-04-20 14:39 rousseau + + * [r2017] ACR38U-CCID.txt, CardMan3121.txt, CryptoIdentity.txt, + GemPCKey.txt, GemPCTwin.txt, KAAN_Advanced.txt, KAAN_Base.txt, + KAAN_SIM_III.txt, LTC31.txt, MySmartPad.txt, Oz776S.txt, + SCR331-DI.txt, SCR331.txt, SCR3310.txt, SCR335.txt, SCR355.txt, + SIM_Pocket_Combo.txt, SPR532.txt, + Verisign_secure_storage_token.txt, mIDentity.txt, sid800.txt: + regenerate using the latest version of parse + +2006-04-20 13:34 rousseau + + * [r2016] CardMan3621.txt, Makefile.am, supported_readers.txt: add + OmniKey CardMan 3621 in the "Should work but untested by me" list + Thanks to Bruce Stephens. + +2006-04-14 18:46 rousseau + + * [r2004] Makefile.am: add SCR3311.txt, SCR355.txt and SDI010.txt + +2006-04-14 18:45 rousseau + + * [r2003] SDI010.txt, SSI010.txt: rename SSI010.txt in SDI010.txt + +2006-04-14 18:41 rousseau + + * [r2001] Makefile.am: add ASE_IIIe.txt and ASEDrive_IIIe_KB.txt + +2006-04-14 18:41 rousseau + + * [r2000] ASEDrive_IIIe_KB.txt, supported_readers.txt: add Athena + ASE IIIe KB USB + +2006-04-14 18:38 rousseau + + * [r1999] ASE_IIIe.txt: update firmware version + +2006-03-21 19:25 rousseau + + * [r1968] Makefile.am, Winbond.txt, supported_readers.txt: add + Winbond Electronics W81E381 chipset + +2006-03-21 08:48 rousseau + + * [r1950] SSI010.txt, supported_readers.txt: add support for SCM + SDI 010 contactless reader + + thanks to Oleg Makarenko for the patch + +2006-03-21 08:30 rousseau + + * [r1949] AxaltoV3.txt, Makefile.am: add Axalto Reflex USB V3 + +2006-03-20 08:45 rousseau + + * [r1945] supported_readers.txt: add Axalto Reflex USB v3 in the + "should work" list + +2006-03-03 17:10 rousseau + + * [r1908] CardMan3821.txt, CardMan6121.txt, Makefile.am, + supported_readers.txt: add OmniKey CardMan 3821 and CardMan 6121 + +2006-03-03 09:01 rousseau + + * [r1904] CherrySmartTerminalST2XXX.txt: new firmware (5.08) + +2006-02-28 22:59 rousseau + + * [r1903] Makefile.am, SCR333.txt: add SCR333.txt + +2006-02-21 23:02 rousseau + + * [r1874] Makefile.am: distribute ActivCardV2.txt and + ActivCardV3.txt + +2006-02-21 23:02 rousseau + + * [r1873] supported_readers.txt: add ActivCard USB Reader 3.0 + +2006-02-21 23:01 rousseau + + * [r1872] ActivCardV2.txt, ActivCardV3.txt: add ActivCard v2 and v3 + descriptions + +2006-02-20 19:17 rousseau + + * [r1867] Makefile.am: add SCM SCR3320.txt and SCR3340.txt + +2006-02-20 19:17 rousseau + + * [r1866] SCR3320.txt: add SCM SCR3320 - Smart Card Reader + +2006-02-20 19:16 rousseau + + * [r1865] SCR3340.txt: add SCR3340 - ExpressCard54 Smart Card + Reader + +2006-02-07 19:21 rousseau + + * [r1864] supported_readers.txt: add "SCM SCR 3340 ExpressCard54" + in the "Should work but untested by me" + list + +2006-02-07 09:47 rousseau + + * [r1862] GemPC_Express.txt, Makefile.am, supported_readers.txt: + add Gemplus GemPC Express + +2006-02-06 15:45 rousseau + + * [r1861] supported_readers.txt: rename POS Pro & SIM Pro to a more + real name "Gemplus GemCore xxx" + +2006-01-25 19:18 rousseau + + * [r1841] Makefile.am: add CardMan5125.txt + +2006-01-25 19:16 rousseau + + * [r1839] CardMan5125.txt, supported_readers.txt: add OmniKey + CardMan 5125 + +2006-01-24 22:10 rousseau + + * [r1834] supported_readers.txt: add SmartEpad + +2006-01-24 16:17 rousseau + + * [r1831] Makefile.am: add MySmartPad.txt + +2006-01-20 13:44 rousseau + + * [r1820] SCR3311.txt: move the SCM Micro SCR 3311 from the "should + work" list to the + "supported" list + +2006-01-18 11:01 rousseau + + * [r1810] GemCoreSIMPro.txt, Makefile.am: add GemCore SIM Pro + +2006-01-18 10:55 rousseau + + * [r1809] supported_readers.txt: add GemCore POS Pro & Gemplus SIM + Pro + --Cette ligne, et les suivantes ci-dessous, seront ignorées-- + + M readers/supported_readers.txt + +2006-01-11 16:03 rousseau + + * [r1798] GemPCPinpad.txt, supported_readers.txt: add Gemplus GemPC + Pinpad + +2006-01-03 20:03 rousseau + + * [r1789] supported_readers.txt: add SCM Micro SCR 3311 and 3320 in + the "Should work but untested by me" + list + +2006-01-03 18:45 rousseau + + * [r1787] SCR355.txt, supported_readers.txt: add support for SCM + Micro SCR 355 + +2006-01-02 09:19 rousseau + + * [r1785] Makefile.am: use ACR38U-CCID.txt instead of ACR38.txt + +2005-12-14 13:28 rousseau + + * [r1782] Verisign_secure_storage_token.txt: update with new + ./parse version + +2005-12-07 20:27 rousseau + + * [r1778] ACR38.txt, ACR38U-CCID.txt, supported_readers.txt: + replace ACR 38 by ACR 38U-CCID since they are two different + readers + +2005-12-01 15:41 rousseau + + * [r1776] ASE_IIIe.txt, supported_readers.txt: add Athena ASE IIIe + USB V2 in "Supported CCID readers" list + +2005-11-27 19:43 rousseau + + * [r1760] MySmartPad.txt: new file for MySMART PAD V2.0 + +2005-11-27 17:22 rousseau + + * [r1758] Makefile.am: add 3 missing reader descriptions + +2005-11-22 07:21 rousseau + + * [r1729] supported_readers.txt: add SCM SCR 3310 NTTCom. + See + http://archives.neohapsis.com/archives/dev/muscle/2005-q4/0217.html + +2005-10-19 08:11 rousseau + + * [r1692] SPR532.txt: firmware 5.07 + +2005-09-01 12:32 rousseau + + * [r1633] supported_readers.txt: add Cherry ST1044U + +2005-09-01 12:29 rousseau + + * [r1632] CherrySmartTerminalST2XXX.txt, supported_readers.txt: add + Cherry SmartTerminal ST-2XXX + +2005-08-25 20:06 rousseau + + * [r1625] CherryST1044U.txt: new file + +2005-08-16 06:50 rousseau + + * [r1619] .cvsignore: removed since we use SVN and not CVS anymore + + Thanks to Martin Paljak for the idea + +2005-08-11 13:51 rousseau + + * [r1610] CherryXX44.txt: update adding clock frequencies and data + rates + +2005-05-27 07:04 rousseau + + * [r1545] CryptoIdentity.txt, supported_readers.txt: add Eutron + CryptoIdentity + +2005-05-20 08:54 rousseau + + * [r1520] sid800.txt: regenerate using new ./parse + +2005-05-05 10:31 rousseau + + * [r1514] Makefile.am, SCR331-DI-NTTCom.txt: add + SCR331-DI-NTTCom.txt + +2005-05-05 10:27 rousseau + + * [r1513] Makefile.am: rename KAAN_mIDentity.txt in mIDentity.txt + +2005-05-05 10:25 rousseau + + * [r1512] ACR38.txt, CardMan3121.txt, GemPCKey.txt, + KAAN_Advanced.txt, KAAN_Base.txt, LTC31.txt, Oz776S.txt, + SCR331-DI.txt, SCR331.txt, SCR3310.txt, SCR335.txt, + SIM_Pocket_Combo.txt, SPR532.txt, mIDentity.txt: regenerate using + the latest src/parse program + +2005-05-04 15:58 rousseau + + * [r1508] supported_readers.txt: add SCM Micro SCR 331-DI NTTCom in + the "Should work but untested by me" + list + +2005-05-04 09:30 rousseau + + * [r1506] supported_readers.txt: rename "Kobil KAAN mIDentity" in + "Kobil mIDentity" + +2005-05-04 06:04 rousseau + + * [r1503] supported_readers.txt: add the manufacturer name in the + reader name + +2005-05-02 11:47 rousseau + + * [r1493] CherryXX33.txt, DellSCRK.txt, GemPC433_SL.txt, + GemPCTwin.txt, KAAN_SIM_III.txt: regenerate using the new parse + command + +2005-04-27 13:40 rousseau + + * [r1474] Makefile.am: add the new or missing readers + +2005-04-27 13:23 rousseau + + * [r1471] Verisign_secure_storage_token.txt: Verisign Secure + Storage Token + +2005-04-27 13:22 rousseau + + * [r1470] Verisign_secure_token.txt: Verisign Secure Token (without + mass memory) + +2005-04-27 13:22 rousseau + + * [r1469] supported_readers.txt: add Verisign Secure Token and + VeriSign Secure Storage Token + +2005-04-22 09:04 rousseau + + * [r1436] supported_readers.txt: add Eutron SIM Pocket Combo + +2005-04-13 21:39 rousseau + + * [r1426] SIM_Pocket_Combo.txt: Eutron SIM Pocket Combo + (the reader is dual slot and is seen as two readers) + +2005-04-13 19:33 rousseau + + * [r1425] sid800.txt: RSA SecurID SID800 Hardware Authenticator + +2005-03-04 21:30 rousseau + + * [r1397] KAAN_SIM_III.txt, mIDentity.txt: Add KAAN SIM III and + KAAN mIDentity + +2005-03-04 21:07 rousseau + + * [r1394] supported_readers.txt: add Kobil KAAN mIDentity in + supported reader list + +2005-03-04 11:14 rousseau + + * [r1393] supported_readers.txt: add Kobil KAAN SIM III in + supported readers list + +2005-03-04 10:44 rousseau + + * [r1392] supported_readers.txt: add SCR 3310 + +2005-03-04 10:31 rousseau + + * [r1391] SCR3310.txt: SCR3310 + +2005-02-25 17:29 rousseau + + * [r1356] CardMan3121.txt, CherryXX33.txt, CherryXX44.txt, + GemPC433_SL.txt, KAAN_Advanced.txt, KAAN_Base.txt, SCR331-DI.txt, + SCR331.txt, SCR335.txt, SPR532.txt: typo: correct ICC by CCID + where needed + +2005-02-20 14:01 rousseau + + * [r1324] supported_readers.txt: add Kobil KAAN Base & KAAN + Advanced readers + +2005-02-20 14:00 rousseau + + * [r1323] KAAN_Advanced.txt, KAAN_Base.txt: firmware 0.37 + +2005-02-04 08:12 rousseau + + * [r1322] ACR38.txt: new firmware (but still with version 1.0) with + the wMaxPacketSize bug removed + +2005-01-26 18:24 rousseau + + * [r1319] Makefile.am: add the new or missing readers + +2005-01-26 18:24 rousseau + + * [r1318] CherryXX44.txt, KAAN_Advanced.txt, KAAN_Base.txt: new + readers descriptions + +2005-01-20 19:51 rousseau + + * [r1316] supported_readers.txt: add Cherry XX44 (SmartBoard + G83-6744) + +2005-01-13 10:43 rousseau + + * [r1313] SCR335.txt: New model with firmware 5.14 (instead of + 4.16) + +2004-12-19 17:09 rousseau + + * [r1297] SPR532.txt: update with firmware 5.04 + +2004-10-19 08:41 rousseau + + * [r1288] supported_readers.txt: add Oz776 + +2004-10-14 14:33 rousseau + + * [r1285] DellSCRK.txt: add idVendor & idProduct using the new + parse command + +2004-10-07 20:58 rousseau + + * [r1284] Makefile.am: reorganize the list and add Oz776S.txt + +2004-10-07 20:40 rousseau + + * [r1283] Oz776S.txt: O2Micro Oz776S USB Hub smartcard reader + +2004-10-07 20:34 rousseau + + * [r1282] SCR331-DI.txt, SCR335.txt, SPR532.txt: add idVendor & + idProduct using the new parse command + +2004-10-07 19:59 rousseau + + * [r1279] SCR331.txt: add idVendor & idProduct using the new parse + command + +2004-10-06 12:13 rousseau + + * [r1278] ACR38.txt, CardMan3121.txt, CherryXX33.txt, + DellSK-3106.txt, GemPC433_SL.txt, GemPCKey.txt, GemPCTwin.txt, + LTC31.txt: add idVendor & idProduct using the new parse command + +2004-05-26 14:02 rousseau + + * [r906] DellSK-3106.txt: Dell keyboard SK-3106 + +2004-05-24 07:27 rousseau + + * [r886] ACR38.txt, supported_readers.txt: add Advanced Card + Systems ACR 38 + +2004-05-24 06:39 rousseau + + * [r885] CherryXX33.txt, supported_readers.txt: add Cherry XX33 + +2004-05-04 12:45 rousseau + + * [r825] Makefile.am: add DellSCRK.txt + +2004-05-04 12:44 rousseau + + * [r824] DellSCRK.txt, supported_readers.txt: add Dell smart card + reader keyboard + +2004-04-08 12:43 rousseau + + * [r780] SK-3106.txt, SPR532.txt: parse bPINSupport field + +2004-04-07 20:10 rousseau + + * [r778] Makefile.am: also distribute SK-3106.txt + +2004-04-05 09:53 rousseau + + * [r763] SK-3106.txt, supported_readers.txt: add support for the + Dell keyboard SK-3106 + +2004-02-27 17:37 rousseau + + * [r707] supported_readers.txt: add SCR 333 + +2004-02-14 12:26 rousseau + + * [r701] Makefile.am: distribute SCR331-DI.txt and + supported_readers.txt + +2004-02-03 14:59 rousseau + + * [r669] SCR331-DI.txt: new file + +2004-02-02 10:05 rousseau + + * [r665] supported_readers.txt: use create_Info_plist.pl to + generate the installed Info.plist from an + Info.plist template and a list of supported readers. + +2004-01-27 13:51 rousseau + + * [r653] ., .cvsignore: ignore some build files + +2003-11-03 16:08 rousseau + + * [r547] Makefile.am: also distribute SPR532.txt + +2003-10-29 18:02 rousseau + + * [r530] SPR532.txt: add SPR 532 description even if it is not a + "real" CCID reader. + +2003-09-10 09:45 rousseau + + * [r418] Makefile.am: add readers/ in generated .tar.gz archive + +2003-09-10 09:29 rousseau + + * [r417] CardMan3121.txt, GemPC433_SL.txt, GemPCKey.txt, + GemPCTwin.txt, LTC31.txt, SCR331.txt, SCR335.txt: use new parse + indentation for more readability of supported features + +2003-08-12 12:40 rousseau + + * [r269] ., CardMan3121.txt, GemPC433_SL.txt, GemPCKey.txt, + GemPCTwin.txt, LTC31.txt, SCR331.txt, SCR335.txt: Initial + revision + diff --git a/ccid/ccid/readers/Charismathics.txt b/ccid/ccid/readers/Charismathics.txt deleted file mode 100644 index 0676e9e..0000000 --- a/ccid/ccid/readers/Charismathics.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x19E7 - iManufacturer: charismathics - idProduct: 0x0002 - iProduct: plug'n'crypt CCID token - bcdDevice: 1.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CherryST1044U.txt b/ccid/ccid/readers/CherryST1044U.txt deleted file mode 100644 index 67c7b2f..0000000 --- a/ccid/ccid/readers/CherryST1044U.txt +++ /dev/null @@ -1,166 +0,0 @@ -Parsing Interface Descriptor for device: 001/004 - idVendor: 0x046A - iManufacturer: Cherry GmbH - idProduct: 0x002D - iProduct: SmartTerminal XX44 - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0x04 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CherrySmartBoardXX1X.txt b/ccid/ccid/readers/CherrySmartBoardXX1X.txt deleted file mode 100644 index f01d1ac..0000000 --- a/ccid/ccid/readers/CherrySmartBoardXX1X.txt +++ /dev/null @@ -1,188 +0,0 @@ - idVendor: 0x046A - iManufacturer: Cherry GmbH - idProduct: 0x005B - iProduct: SmartBoard XX1X - bcdDevice: 3.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.01 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 127 - Support 1953 bps - Support 2150 bps - Support 2343 bps - Support 2580 bps - Support 2604 bps - Support 2688 bps - Support 2929 bps - Support 3125 bps - Support 3225 bps - Support 3584 bps - Support 3906 bps - Support 4032 bps - Support 4301 bps - Support 4687 bps - Support 5161 bps - Support 5167 bps - Support 5208 bps - Support 5376 bps - Support 5859 bps - Support 6201 bps - Support 6250 bps - Support 6451 bps - Support 7168 bps - Support 7751 bps - Support 7812 bps - Support 8064 bps - Support 8602 bps - Support 9375 bps - Support 10322 bps - Support 10335 bps - Support 10416 bps - Support 10752 bps - Support 11718 bps - Support 12403 bps - Support 12500 bps - Support 12903 bps - Support 14336 bps - Support 15503 bps - Support 15625 bps - Support 16129 bps - Support 17204 bps - Support 18750 bps - Support 20645 bps - Support 20671 bps - Support 20833 bps - Support 21505 bps - Support 23437 bps - Support 24806 bps - Support 25000 bps - Support 25806 bps - Support 28125 bps - Support 28673 bps - Support 30967 bps - Support 31007 bps - Support 31250 bps - Support 32258 bps - Support 34408 bps - Support 35156 bps - Support 37500 bps - Support 38709 bps - Support 39062 bps - Support 41290 bps - Support 41343 bps - Support 41666 bps - Support 43010 bps - Support 46875 bps - Support 48387 bps - Support 49612 bps - Support 50000 bps - Support 51612 bps - Support 52083 bps - Support 53763 bps - Support 56250 bps - Support 57347 bps - Support 58593 bps - Support 62015 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 70312 bps - Support 71684 bps - Support 74418 bps - Support 75000 bps - Support 78125 bps - Support 80645 bps - Support 82580 bps - Support 82687 bps - Support 83333 bps - Support 86021 bps - Support 93023 bps - Support 93750 bps - Support 99224 bps - Support 100000 bps - Support 103225 bps - Support 103359 bps - Support 104166 bps - Support 107526 bps - Support 112500 bps - Support 114695 bps - Support 117187 bps - Support 124031 bps - Support 125000 bps - Support 129032 bps - Support 137634 bps - Support 143369 bps - Support 150000 bps - Support 154838 bps - Support 155038 bps - Support 156250 bps - Support 165374 bps - Support 166666 bps - Support 172043 bps - Support 187500 bps - Support 198449 bps - Support 200000 bps - Support 206451 bps - Support 206718 bps - Support 215053 bps - Support 229390 bps - Support 248062 bps - Support 250000 bps - Support 258064 bps - Support 275268 bps - Support 300000 bps - Support 330749 bps - Support 344086 bps - Support 412903 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CherrySmartTerminalST2XXX.txt b/ccid/ccid/readers/CherrySmartTerminalST2XXX.txt deleted file mode 100644 index 11ee2c9..0000000 --- a/ccid/ccid/readers/CherrySmartTerminalST2XXX.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x046A - iManufacturer: Cherry GmbH - idProduct: 0x003E - iProduct: SmartTerminal ST-2xxx - bcdDevice: 5.08 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CherryXX33.txt b/ccid/ccid/readers/CherryXX33.txt deleted file mode 100644 index 3c2bfb7..0000000 --- a/ccid/ccid/readers/CherryXX33.txt +++ /dev/null @@ -1,51 +0,0 @@ -Parsing Interface Descriptor for device: 003/009 - idVendor: 0x046A - iManufacturer: Cherry GmbH - idProduct: 0x0005 - iProduct: SmartBoard XX33 - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0x00 - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020472 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0 - bClassEnveloppe: 0 - wLcdLayout: 0x0000 - bPINSupport: 0x01 - PIN Verification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CherryXX44.txt b/ccid/ccid/readers/CherryXX44.txt deleted file mode 100644 index 874bada..0000000 --- a/ccid/ccid/readers/CherryXX44.txt +++ /dev/null @@ -1,168 +0,0 @@ -Parsing Interface Descriptor for device: 004/012 - idVendor: 0x046A - iManufacturer: Cherry GmbH - idProduct: 0x0010 - iProduct: SmartBoard XX44 - bcdDevice: 1.04 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0x04 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/CryptoIdentity.txt b/ccid/ccid/readers/CryptoIdentity.txt deleted file mode 100644 index 10830c6..0000000 --- a/ccid/ccid/readers/CryptoIdentity.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x073D - iManufacturer: Eutron - idProduct: 0x0007 - iProduct: CryptoIdentity CCID - bcdDevice: 1.11 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 344068 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010330 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/DellSCRK.txt b/ccid/ccid/readers/DellSCRK.txt deleted file mode 100644 index 35d6849..0000000 --- a/ccid/ccid/readers/DellSCRK.txt +++ /dev/null @@ -1,91 +0,0 @@ - idVendor: 0x413C - iManufacturer: Dell - idProduct: 0x2101 - iProduct: Dell Smart Card Reader Keyboard - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x01 - PIN Verification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/DellSK-3106.txt b/ccid/ccid/readers/DellSK-3106.txt deleted file mode 100644 index f39b2d9..0000000 --- a/ccid/ccid/readers/DellSK-3106.txt +++ /dev/null @@ -1,52 +0,0 @@ -Parsing Interface Descriptor for device: 003/006 - idVendor: 0x413C - iManufacturer: Gemplus - idProduct: 0x2100 - iProduct: Dell USB Smartcard Keyboard - bcdDevice: 0.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 92 - UNSUPPORTED SubClass - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0xFF - PROPRIETARY bDescriptorType - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0x00 - dwDataRate: 10752 bps - dwMaxDataRate: 129032 bps - bNumDataRatesSupported: 0 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - Automatic ICC clock frequency change according to parameters - Automatic baud rate change according to frequency and Fi, Di parameters - NAD value other than 00 accepted (T=1) - TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0 - bClassEnveloppe: 0 - wLcdLayout: 0x0000 - bPINSupport: 0x01 - PIN Verification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Eutron_CryptoIdentity.txt b/ccid/ccid/readers/Eutron_CryptoIdentity.txt deleted file mode 100644 index 8c1f9c2..0000000 --- a/ccid/ccid/readers/Eutron_CryptoIdentity.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x073D - iManufacturer: Eutron - idProduct: 0x0008 - iProduct: CryptoIdentity CCID - bcdDevice: 1.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Eutron_Digipass_860.txt b/ccid/ccid/readers/Eutron_Digipass_860.txt deleted file mode 100644 index e5496a9..0000000 --- a/ccid/ccid/readers/Eutron_Digipass_860.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x073D - iManufacturer: Eutron - idProduct: 0x0B00 - iProduct: Digipass 860 - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Eutron_Smart_Pocket.txt b/ccid/ccid/readers/Eutron_Smart_Pocket.txt deleted file mode 100644 index dfd1683..0000000 --- a/ccid/ccid/readers/Eutron_Smart_Pocket.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x073D - iManufacturer: Eutron - idProduct: 0x0C01 - iProduct: Card Reader - bcdDevice: 1.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt b/ccid/ccid/readers/FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt deleted file mode 100644 index 4c89c8c..0000000 --- a/ccid/ccid/readers/FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt +++ /dev/null @@ -1,170 +0,0 @@ - idVendor: 0x0BF8 - iManufacturer: Fujitsu Siemens Computers - idProduct: 0x1005 - iProduct: SmartCard Keyboard USB 2A - bcdDevice: 1.06 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/FujitsuSiemens_SmartCard_USB_2A.txt b/ccid/ccid/readers/FujitsuSiemens_SmartCard_USB_2A.txt deleted file mode 100644 index d44dbc5..0000000 --- a/ccid/ccid/readers/FujitsuSiemens_SmartCard_USB_2A.txt +++ /dev/null @@ -1,170 +0,0 @@ - idVendor: 0x0BF8 - iManufacturer: Fujitsu Siemens Computers - idProduct: 0x1006 - iProduct: SmartCard USB 2A - bcdDevice: 2.03 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 4 - Got 256 clock frequencies but was expecting 4 - Support 4000 kHz - Support 4800 kHz - Support 6000 kHz - Support 8000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 106 - Got 256 data rates but was expecting 106 - Support 10752 bps - Support 21505 bps - Support 43010 bps - Support 86021 bps - Support 172043 bps - Support 344086 bps - Support 129032 bps - Support 215053 bps - Support 12903 bps - Support 25806 bps - Support 51612 bps - Support 103225 bps - Support 206451 bps - Support 412903 bps - Support 154838 bps - Support 258064 bps - Support 7168 bps - Support 14336 bps - Support 28673 bps - Support 57347 bps - Support 114695 bps - Support 229390 bps - Support 143369 bps - Support 8602 bps - Support 17204 bps - Support 34408 bps - Support 68817 bps - Support 137634 bps - Support 275268 bps - Support 5376 bps - Support 64516 bps - Support 107526 bps - Support 6451 bps - Support 77419 bps - Support 8064 bps - Support 16129 bps - Support 32258 bps - Support 96774 bps - Support 161290 bps - Support 3584 bps - Support 71684 bps - Support 4301 bps - Support 2688 bps - Support 53763 bps - Support 3225 bps - Support 38709 bps - Support 4032 bps - Support 48387 bps - Support 80645 bps - Support 2150 bps - Support 2580 bps - Support 5161 bps - Support 10322 bps - Support 20645 bps - Support 41290 bps - Support 82580 bps - Support 30967 bps - Support 7812 bps - Support 15625 bps - Support 31250 bps - Support 62500 bps - Support 125000 bps - Support 250000 bps - Support 93750 bps - Support 156250 bps - Support 9375 bps - Support 18750 bps - Support 37500 bps - Support 75000 bps - Support 150000 bps - Support 300000 bps - Support 112500 bps - Support 187500 bps - Support 5208 bps - Support 10416 bps - Support 20833 bps - Support 41666 bps - Support 83333 bps - Support 166666 bps - Support 104166 bps - Support 6250 bps - Support 12500 bps - Support 25000 bps - Support 50000 bps - Support 100000 bps - Support 200000 bps - Support 3906 bps - Support 46875 bps - Support 78125 bps - Support 4687 bps - Support 56250 bps - Support 5859 bps - Support 11718 bps - Support 23437 bps - Support 70312 bps - Support 117187 bps - Support 2604 bps - Support 52083 bps - Support 3125 bps - Support 1953 bps - Support 39062 bps - Support 2343 bps - Support 28125 bps - Support 2929 bps - Support 35156 bps - Support 58593 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000207B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemCoreSIMPro.txt b/ccid/ccid/readers/GemCoreSIMPro.txt deleted file mode 100644 index 8797952..0000000 --- a/ccid/ccid/readers/GemCoreSIMPro.txt +++ /dev/null @@ -1,91 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x3480 - iProduct: GemCore SIM Pro Smart Card Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x01 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 500000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - Support 500000 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemPC433_SL.txt b/ccid/ccid/readers/GemPC433_SL.txt deleted file mode 100644 index ff4c596..0000000 --- a/ccid/ccid/readers/GemPC433_SL.txt +++ /dev/null @@ -1,50 +0,0 @@ -Parsing Interface Descriptor for device: 001/038 - idVendor: 0x08E6 - iManufacturer: GEMPLUS - idProduct: 0x4433 - iProduct: Gemplus USB SmartCard Reader 433-Swap - bcdDevice: 0.01 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0x00 - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020472 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0 - bClassEnveloppe: 0 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemPCKey.txt b/ccid/ccid/readers/GemPCKey.txt deleted file mode 100644 index 5ee6c8e..0000000 --- a/ccid/ccid/readers/GemPCKey.txt +++ /dev/null @@ -1,90 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x3438 - iProduct: USB SmartCard Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemPCPinpad.txt b/ccid/ccid/readers/GemPCPinpad.txt deleted file mode 100644 index 7cba001..0000000 --- a/ccid/ccid/readers/GemPCPinpad.txt +++ /dev/null @@ -1,93 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x3478 - iProduct: USB GemPCPinpad SmartCard Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 500000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - Support 500000 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemPCTwin.txt b/ccid/ccid/readers/GemPCTwin.txt deleted file mode 100644 index 5d8d9cb..0000000 --- a/ccid/ccid/readers/GemPCTwin.txt +++ /dev/null @@ -1,90 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x3437 - iProduct: USB SmartCard Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemPC_Express.txt b/ccid/ccid/readers/GemPC_Express.txt deleted file mode 100644 index 93a1576..0000000 --- a/ccid/ccid/readers/GemPC_Express.txt +++ /dev/null @@ -1,89 +0,0 @@ -Parsing Interface Descriptor for device: 004/002 - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x34EC - iProduct: USB GemPC Express - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Gem_e-SealPro.txt b/ccid/ccid/readers/Gem_e-SealPro.txt deleted file mode 100644 index 579d5d7..0000000 --- a/ccid/ccid/readers/Gem_e-SealPro.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x2202 - iProduct: Gem e-Seal Pro USB Token - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 2 - bulk-IN and bulk-OUT - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 92 - UNSUPPORTED SubClass - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0xFF - PROPRIETARY bDescriptorType - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 1.500 MHz - dwMaximumClock: 1.500 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 1500 kHz - dwDataRate: 4032 bps - dwMaxDataRate: 46875 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 4032 bps - Support 23437 bps - Support 46875 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GemaltoSmartEnterpriseGuardian.txt b/ccid/ccid/readers/GemaltoSmartEnterpriseGuardian.txt deleted file mode 100644 index 4e1eb3e..0000000 --- a/ccid/ccid/readers/GemaltoSmartEnterpriseGuardian.txt +++ /dev/null @@ -1,52 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemalto - idProduct: 0x8000 - iProduct: Smart Enterprise Guardian Secure USB Device - bcdDevice: 2.21 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0001 - T=0 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 7.500 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 20112 bps - dwMaxDataRate: 223200 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0001007A - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 270 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Gemalto_PDT.txt b/ccid/ccid/readers/Gemalto_PDT.txt deleted file mode 100644 index de142e8..0000000 --- a/ccid/ccid/readers/Gemalto_PDT.txt +++ /dev/null @@ -1,49 +0,0 @@ - idVendor: 0x0973 - iManufacturer: GEMALTO - idProduct: 0x1227 - iProduct: PDT - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 0 - Control only - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 2 - ICCD Version B, Control transfers, (optional interrupt-IN) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 261 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GnD_StarSignCardToken350.txt b/ccid/ccid/readers/GnD_StarSignCardToken350.txt deleted file mode 100644 index 48f1b12..0000000 --- a/ccid/ccid/readers/GnD_StarSignCardToken350.txt +++ /dev/null @@ -1,49 +0,0 @@ - idVendor: 0x1059 - iManufacturer: Giesecke & Devrient GmbH - idProduct: 0x000C - iProduct: ICCD Smartcard - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 1 - Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 2 - ICCD Version B, Control transfers, (optional interrupt-IN) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 280 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/GnD_StarSignCardToken550.txt b/ccid/ccid/readers/GnD_StarSignCardToken550.txt deleted file mode 100644 index 83a887d..0000000 --- a/ccid/ccid/readers/GnD_StarSignCardToken550.txt +++ /dev/null @@ -1,49 +0,0 @@ - idVendor: 0x1059 - iManufacturer: Giesecke & Devrient GmbH - idProduct: 0x000D - iProduct: ICCD Smartcard - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 1 - Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 2 - ICCD Version B, Control transfers, (optional interrupt-IN) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 261 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/HPUSBSmartCardKeyboard.txt b/ccid/ccid/readers/HPUSBSmartCardKeyboard.txt deleted file mode 100644 index 4821487..0000000 --- a/ccid/ccid/readers/HPUSBSmartCardKeyboard.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x03F0 - iManufacturer: Hewlett-Packard Company - idProduct: 0x1024 - iProduct: HP USB Smart Card Keyboard - bcdDevice: 5.34 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 2 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/HP_MFP_SmartCardReader.txt b/ccid/ccid/readers/HP_MFP_SmartCardReader.txt deleted file mode 100644 index 50fa113..0000000 --- a/ccid/ccid/readers/HP_MFP_SmartCardReader.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x03F0 - iManufacturer: Hewlett Packard - idProduct: 0x2924 - iProduct: MFP Smart Card Reader - bcdDevice: 5.25 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/KAAN_Advanced.txt b/ccid/ccid/readers/KAAN_Advanced.txt deleted file mode 100644 index 67a0b03..0000000 --- a/ccid/ccid/readers/KAAN_Advanced.txt +++ /dev/null @@ -1,62 +0,0 @@ - idVendor: 0x0D46 - iManufacturer: KOBIL - idProduct: 0x3002 - iProduct: KAAN Advanced - bcdDevice: 1.19 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 4.800 MHz - bNumClockSupported: 0 (will use whatever is returned) - wrong size for GET CLOCK FREQUENCIES: 1 - dwDataRate: 12903 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000406BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 432 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/KAAN_Base.txt b/ccid/ccid/readers/KAAN_Base.txt deleted file mode 100644 index 446b50e..0000000 --- a/ccid/ccid/readers/KAAN_Base.txt +++ /dev/null @@ -1,60 +0,0 @@ - idVendor: 0x0D46 - iManufacturer: KOBIL - idProduct: 0x3001 - iProduct: KAAN Base - bcdDevice: 1.19 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 4.800 MHz - bNumClockSupported: 0 (will use whatever is returned) - wrong size for GET CLOCK FREQUENCIES: 1 - dwDataRate: 12903 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000406BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 432 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/KAAN_SIM_III.txt b/ccid/ccid/readers/KAAN_SIM_III.txt deleted file mode 100644 index b42852d..0000000 --- a/ccid/ccid/readers/KAAN_SIM_III.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x0D46 - iManufacturer: KOBIL - idProduct: 0x3003 - iProduct: KAAN SIM III - bcdDevice: 0.38 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.800 MHz - dwMaximumClock: 4.800 MHz - bNumClockSupported: 0 (will use whatever is returned) - wrong size for GET CLOCK FREQUENCIES: 1 - dwDataRate: 12903 bps - dwMaxDataRate: 412903 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000206BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/KEBTechnology_KONA_USB_SmartCard.txt b/ccid/ccid/readers/KEBTechnology_KONA_USB_SmartCard.txt deleted file mode 100644 index d52773e..0000000 --- a/ccid/ccid/readers/KEBTechnology_KONA_USB_SmartCard.txt +++ /dev/null @@ -1,49 +0,0 @@ - idVendor: 0x04CC - iManufacturer: KEBTechnology - idProduct: 0x5072 - iProduct: KONA USB SmartCard - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 1 - Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 2 - ICCD Version B, Control transfers, (optional interrupt-IN) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0001 - T=0 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00000840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 00.... Character level exchange - dwMaxCCIDMessageLength: 261 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Kobil_EMV_CAP.txt b/ccid/ccid/readers/Kobil_EMV_CAP.txt deleted file mode 100644 index 3851240..0000000 --- a/ccid/ccid/readers/Kobil_EMV_CAP.txt +++ /dev/null @@ -1,59 +0,0 @@ - idVendor: 0x0D46 - iManufacturer: KOBIL Systems - idProduct: 0x3010 - iProduct: KOBIL Class 3 Reader - bcdDevice: 0.39 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: ? - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 2.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: No such file or directory - dwDataRate: 10573 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: No such file or directory - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000406BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 536 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0210 - 16 lines - 2 characters per line - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/LTC31.txt b/ccid/ccid/readers/LTC31.txt deleted file mode 100644 index f30eeed..0000000 --- a/ccid/ccid/readers/LTC31.txt +++ /dev/null @@ -1,45 +0,0 @@ - idVendor: 0x0783 - iManufacturer: C3PO - idProduct: 0x0003 - iProduct: LTC3x USB - bcdDevice: 1.16 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 10752 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010002 - ....02 Automatic parameter configuration based on ATR data - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/LTC31v2.txt b/ccid/ccid/readers/LTC31v2.txt deleted file mode 100644 index 0dc8e61..0000000 --- a/ccid/ccid/readers/LTC31v2.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x0783 - iManufacturer: C3PO - idProduct: 0x0006 - iProduct: USB SMART CARD READER - bcdDevice: 0.08 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 20.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 9600 bps - dwMaxDataRate: 230400 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000001 - 2-wire protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Lenovo.txt b/ccid/ccid/readers/Lenovo.txt deleted file mode 100644 index 81a64c0..0000000 --- a/ccid/ccid/readers/Lenovo.txt +++ /dev/null @@ -1,91 +0,0 @@ - idVendor: 0x17EF - iManufacturer: Lenovo - idProduct: 0x1003 - iProduct: Integrated Smart Card Reader - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 500000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - Support 500000 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Makefile.am b/ccid/ccid/readers/Makefile.am index 029375e..3445f3d 100644 --- a/ccid/ccid/readers/Makefile.am +++ b/ccid/ccid/readers/Makefile.am @@ -1,107 +1,3 @@ -# $Id: Makefile.am 3494 2009-05-08 06:30:56Z rousseau $ - -EXTRA_DIST = \ - ACR122U.txt \ - ACR122U_PICC.txt \ - ACR38U-CCID.txt \ - ActivCardV2.txt \ - ActivCardV3.txt \ - Aladdin_eToken_PRO_USB_72K_Java.txt \ - Alya.txt \ - ASEDrive_IIIe_KB.txt \ - ASE_IIIe.txt \ - ATMEL_AT91SO.txt \ - AxaltoV3.txt \ - BludriveII.txt \ - Broadcom_5880.txt \ - C3PO_KBR36.txt \ - C3PO_LTC32_USBv2.txt \ - C3PO_TLTC2USB.txt \ - CardMan1021.txt \ - CardMan3021.txt \ - CardMan3121.txt \ - CardMan3621.txt \ - CardMan3821.txt \ - CardMan4321.txt \ - CardMan5125.txt \ - CardMan5321.txt \ - CardMan6121.txt \ - Charismathics.txt \ - CherrySmartBoardXX1X.txt \ - CherrySmartTerminalST2XXX.txt \ - CherryST1044U.txt \ - CherryXX33.txt \ - CherryXX44.txt \ - CL1356T.txt \ - CryptoIdentity.txt \ - DellSCRK.txt \ - DellSK-3106.txt \ - e-gate.txt \ - Eutron_CryptoIdentity.txt \ - Eutron_Digipass_860.txt \ - Eutron_Smart_Pocket.txt \ - FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt \ - FujitsuSiemens_SmartCard_USB_2A.txt \ - Gemalto_PDT.txt \ - GemaltoSmartEnterpriseGuardian.txt \ - GemCoreSIMPro.txt \ - Gem_e-SealPro.txt \ - GemPC433_SL.txt \ - GemPC_Express.txt \ - GemPCKey.txt \ - GemPCPinpad.txt \ - GemPCTwin.txt \ - GnD_StarSignCardToken350.txt \ - GnD_StarSignCardToken550.txt \ - HP_MFP_SmartCardReader.txt \ - HPUSBSmartCardKeyboard.txt \ - id3_CL1356A_HID.txt \ - id3_CL1356D.txt \ - iDream.txt \ - KAAN_Advanced.txt \ - KAAN_Base.txt \ - KAAN_SIM_III.txt \ - KEBTechnology_KONA_USB_SmartCard.txt \ - Kobil_EMV_CAP.txt \ - Lenovo.txt \ - LTC31.txt \ - LTC31v2.txt \ - mIDentity.txt \ - mIDentityXL.txt \ - MySmartPad.txt \ - Oberthur-CosmoCard.txt \ - Oz776_7772.txt \ - Oz776S.txt \ - Precise_250_MC.txt \ - ReinerSCT.txt \ - Philips_SmartMX.txt \ - SCR3310.txt \ - SCR3311.txt \ - SCR331-DI-NTTCom.txt \ - SCR331-DI.txt \ - SCR331.txt \ - SCR3320.txt \ - SCR333.txt \ - SCR3340.txt \ - SCR335.txt \ - SCR355.txt \ - SDI010.txt \ - sid800.txt \ - SIM_Pocket_Combo.txt \ - Sitecom_MD-010.txt \ - SPR532.txt \ - SpringCard_CSB6_Basic.txt \ - SpringCard_EasyFinger_Ultimate.txt \ - SpringCard_CSB6_Ultimate.txt \ - SpringCard_Prox_N_Roll.txt \ - SpringCard_EasyFinger_Standard.txt \ - SpringCard_CrazyWriter.txt \ - SpringCard_CSB6_Secure.txt \ - supported_readers.txt \ - Validy_TokenA.txt \ - Vasco_DP905.txt \ - Vega-Alpha.txt \ - Verisign_secure_storage_token.txt \ - Verisign_secure_token.txt \ - Winbond.txt +# $Id: Makefile.am 4747 2010-02-09 21:23:49Z rousseau $ +EXTRA_DIST = supported_readers.txt diff --git a/ccid/ccid/readers/Makefile.in b/ccid/ccid/readers/Makefile.in index 2dea9ed..235a9f8 100644 --- a/ccid/ccid/readers/Makefile.in +++ b/ccid/ccid/readers/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,11 +14,57 @@ @SET_MAKE@ -# $Id: Makefile.am 3494 2009-05-08 06:30:56Z rousseau $ +# $Id: Makefile.am 4747 2010-02-09 21:23:49Z rousseau $ VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -34,22 +80,43 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = readers -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -64,6 +131,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -88,7 +156,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -96,6 +163,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -109,11 +177,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -129,15 +200,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -164,7 +237,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -173,119 +245,17 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ usbdropdir = @usbdropdir@ -EXTRA_DIST = \ - ACR122U.txt \ - ACR122U_PICC.txt \ - ACR38U-CCID.txt \ - ActivCardV2.txt \ - ActivCardV3.txt \ - Aladdin_eToken_PRO_USB_72K_Java.txt \ - Alya.txt \ - ASEDrive_IIIe_KB.txt \ - ASE_IIIe.txt \ - ATMEL_AT91SO.txt \ - AxaltoV3.txt \ - BludriveII.txt \ - Broadcom_5880.txt \ - C3PO_KBR36.txt \ - C3PO_LTC32_USBv2.txt \ - C3PO_TLTC2USB.txt \ - CardMan1021.txt \ - CardMan3021.txt \ - CardMan3121.txt \ - CardMan3621.txt \ - CardMan3821.txt \ - CardMan4321.txt \ - CardMan5125.txt \ - CardMan5321.txt \ - CardMan6121.txt \ - Charismathics.txt \ - CherrySmartBoardXX1X.txt \ - CherrySmartTerminalST2XXX.txt \ - CherryST1044U.txt \ - CherryXX33.txt \ - CherryXX44.txt \ - CL1356T.txt \ - CryptoIdentity.txt \ - DellSCRK.txt \ - DellSK-3106.txt \ - e-gate.txt \ - Eutron_CryptoIdentity.txt \ - Eutron_Digipass_860.txt \ - Eutron_Smart_Pocket.txt \ - FujitsuSiemens_SmartCard_Keyboard_USB_2A.txt \ - FujitsuSiemens_SmartCard_USB_2A.txt \ - Gemalto_PDT.txt \ - GemaltoSmartEnterpriseGuardian.txt \ - GemCoreSIMPro.txt \ - Gem_e-SealPro.txt \ - GemPC433_SL.txt \ - GemPC_Express.txt \ - GemPCKey.txt \ - GemPCPinpad.txt \ - GemPCTwin.txt \ - GnD_StarSignCardToken350.txt \ - GnD_StarSignCardToken550.txt \ - HP_MFP_SmartCardReader.txt \ - HPUSBSmartCardKeyboard.txt \ - id3_CL1356A_HID.txt \ - id3_CL1356D.txt \ - iDream.txt \ - KAAN_Advanced.txt \ - KAAN_Base.txt \ - KAAN_SIM_III.txt \ - KEBTechnology_KONA_USB_SmartCard.txt \ - Kobil_EMV_CAP.txt \ - Lenovo.txt \ - LTC31.txt \ - LTC31v2.txt \ - mIDentity.txt \ - mIDentityXL.txt \ - MySmartPad.txt \ - Oberthur-CosmoCard.txt \ - Oz776_7772.txt \ - Oz776S.txt \ - Precise_250_MC.txt \ - ReinerSCT.txt \ - Philips_SmartMX.txt \ - SCR3310.txt \ - SCR3311.txt \ - SCR331-DI-NTTCom.txt \ - SCR331-DI.txt \ - SCR331.txt \ - SCR3320.txt \ - SCR333.txt \ - SCR3340.txt \ - SCR335.txt \ - SCR355.txt \ - SDI010.txt \ - sid800.txt \ - SIM_Pocket_Combo.txt \ - Sitecom_MD-010.txt \ - SPR532.txt \ - SpringCard_CSB6_Basic.txt \ - SpringCard_EasyFinger_Ultimate.txt \ - SpringCard_CSB6_Ultimate.txt \ - SpringCard_Prox_N_Roll.txt \ - SpringCard_EasyFinger_Standard.txt \ - SpringCard_CrazyWriter.txt \ - SpringCard_CSB6_Secure.txt \ - supported_readers.txt \ - Validy_TokenA.txt \ - Vasco_DP905.txt \ - Vega-Alpha.txt \ - Verisign_secure_storage_token.txt \ - Verisign_secure_token.txt \ - Winbond.txt - +EXTRA_DIST = supported_readers.txt all: all-am .SUFFIXES: @@ -298,9 +268,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign readers/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign readers/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu readers/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu readers/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -318,17 +288,18 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: + +cscope cscopelist: distdir: $(DISTFILES) @@ -347,13 +318,17 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -371,16 +346,22 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -399,6 +380,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -407,18 +390,28 @@ install-data-am: install-dvi: install-dvi-am +install-dvi-am: + install-exec-am: install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -442,15 +435,17 @@ uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/ccid/ccid/readers/MySmartPad.txt b/ccid/ccid/readers/MySmartPad.txt deleted file mode 100644 index c56bf4a..0000000 --- a/ccid/ccid/readers/MySmartPad.txt +++ /dev/null @@ -1,48 +0,0 @@ - idVendor: 0x09BE - iManufacturer: MYSMART - idProduct: 0x0002 - iProduct: MySMART PAD V2.0 - bcdDevice: 2.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 92 - UNSUPPORTED SubClass - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0xFF - PROPRIETARY bDescriptorType - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x00 - dwProtocols: 0x0000 0x0300 - dwDefaultClock: 1024.000 MHz - dwMaximumClock: 1024.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 129032 bps - bNumDataRatesSupported: 254 - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 0 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x03000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Oberthur-CosmoCard.txt b/ccid/ccid/readers/Oberthur-CosmoCard.txt deleted file mode 100644 index 23b3a8d..0000000 --- a/ccid/ccid/readers/Oberthur-CosmoCard.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x1A74 - iManufacturer: OCS ID-One Cosmo Card - idProduct: 0x6354 - iProduct: USB Smart Chip Device - bcdDevice: 1.01 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 0 - Control only - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 2 - ICCD Version B, Control transfers, (optional interrupt-IN) - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 2.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 261 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Oz776S.txt b/ccid/ccid/readers/Oz776S.txt deleted file mode 100644 index d3fedb1..0000000 --- a/ccid/ccid/readers/Oz776S.txt +++ /dev/null @@ -1,47 +0,0 @@ - idVendor: 0x0B97 - iManufacturer: O2 - idProduct: 0x7762 - iProduct: O2Micro CCID SC Reader - bcdDevice: 1.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 9600 bps - dwMaxDataRate: 307200 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 9600 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00000030 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - 00.... Character level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Oz776_7772.txt b/ccid/ccid/readers/Oz776_7772.txt deleted file mode 100644 index 9b88da3..0000000 --- a/ccid/ccid/readers/Oz776_7772.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x0B97 - iManufacturer: O2 - idProduct: 0x7772 - iProduct: O2Micro CCID SC Reader - bcdDevice: 1.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 9600 bps - dwMaxDataRate: 307200 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 9600 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00000030 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - 00.... Character level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Philips_SmartMX.txt b/ccid/ccid/readers/Philips_SmartMX.txt deleted file mode 100644 index a473e77..0000000 --- a/ccid/ccid/readers/Philips_SmartMX.txt +++ /dev/null @@ -1,49 +0,0 @@ - idVendor: 0x04B9 - iManufacturer: Philips Semiconductors - idProduct: 0x1400 - iProduct: SmartMX Sample - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 1 - Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 2 - ICCD Version B, Control transfers, (optional interrupt-IN) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00020840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 261 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Precise_250_MC.txt b/ccid/ccid/readers/Precise_250_MC.txt deleted file mode 100644 index 6cb347c..0000000 --- a/ccid/ccid/readers/Precise_250_MC.txt +++ /dev/null @@ -1,52 +0,0 @@ - idVendor: 0x08C3 - iManufacturer: Precise Biometrics - idProduct: 0x0401 - iProduct: Precise 250 MC - bcdDevice: 34.61 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 7.500 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 241936 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000400BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 524288 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/ReinerSCT.txt b/ccid/ccid/readers/ReinerSCT.txt deleted file mode 100644 index 18d7101..0000000 --- a/ccid/ccid/readers/ReinerSCT.txt +++ /dev/null @@ -1,59 +0,0 @@ - idVendor: 0x0C4B - iManufacturer: Reiner-SCT - idProduct: 0x0300 - iProduct: cyberJack pinpad(a) - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 10.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10072 bps - dwMaxDataRate: 250000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010030 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 270 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR331-DI-NTTCom.txt b/ccid/ccid/readers/SCR331-DI-NTTCom.txt deleted file mode 100644 index 49639dc..0000000 --- a/ccid/ccid/readers/SCR331-DI-NTTCom.txt +++ /dev/null @@ -1,52 +0,0 @@ -Parsing Interface Descriptor for device: 003/005 - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5120 - iProduct: SCR331-DI USB Smart Card Reader - bcdDevice: 6.27 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x01 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 12.000 MHz - bNumClockSupported: 0x00 - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 255 - bClassEnveloppe: 255 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR331-DI.txt b/ccid/ccid/readers/SCR331-DI.txt deleted file mode 100644 index fa98f76..0000000 --- a/ccid/ccid/readers/SCR331-DI.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5111 - iProduct: SCR331-DI USB Smart Card Reader - bcdDevice: 6.32 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x01 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 12.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR331.txt b/ccid/ccid/readers/SCR331.txt deleted file mode 100644 index 6bd72a8..0000000 --- a/ccid/ccid/readers/SCR331.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0xE001 - iProduct: SCRx31 USB Smart Card Reader - bcdDevice: 5.25 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR3310.txt b/ccid/ccid/readers/SCR3310.txt deleted file mode 100644 index 7acb504..0000000 --- a/ccid/ccid/readers/SCR3310.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5116 - iProduct: SCR3310 USB Smart Card Reader - bcdDevice: 5.23 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR3311.txt b/ccid/ccid/readers/SCR3311.txt deleted file mode 100644 index 4f56652..0000000 --- a/ccid/ccid/readers/SCR3311.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x511D - iProduct: SCR3311 USB Smart Card Reader - bcdDevice: 5.23 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR3320.txt b/ccid/ccid/readers/SCR3320.txt deleted file mode 100644 index 4c0fa6c..0000000 --- a/ccid/ccid/readers/SCR3320.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5117 - iProduct: SCR3320 - Smart Card Reader - bcdDevice: 5.23 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR333.txt b/ccid/ccid/readers/SCR333.txt deleted file mode 100644 index 8439373..0000000 --- a/ccid/ccid/readers/SCR333.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5113 - iProduct: SCR33x USB Smart Card Reader - bcdDevice: 5.23 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR3340.txt b/ccid/ccid/readers/SCR3340.txt deleted file mode 100644 index 44089fd..0000000 --- a/ccid/ccid/readers/SCR3340.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5119 - iProduct: SCR3340 - ExpressCard54 Smart Card Reader - bcdDevice: 5.23 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR335.txt b/ccid/ccid/readers/SCR335.txt deleted file mode 100644 index 44fe79d..0000000 --- a/ccid/ccid/readers/SCR335.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5115 - iProduct: SCR33x USB Smart Card Reader - bcdDevice: 5.23 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SCR355.txt b/ccid/ccid/readers/SCR355.txt deleted file mode 100644 index 328945f..0000000 --- a/ccid/ccid/readers/SCR355.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5410 - iProduct: SCR35xx USB Smart Card Reader - bcdDevice: 5.21 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 263 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SDI010.txt b/ccid/ccid/readers/SDI010.txt deleted file mode 100644 index 05ab285..0000000 --- a/ccid/ccid/readers/SDI010.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0x5121 - iProduct: SDI010 Smart Card Reader - bcdDevice: 7.27 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x01 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 252 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SIM_Pocket_Combo.txt b/ccid/ccid/readers/SIM_Pocket_Combo.txt deleted file mode 100644 index 2f9ac43..0000000 --- a/ccid/ccid/readers/SIM_Pocket_Combo.txt +++ /dev/null @@ -1,100 +0,0 @@ - idVendor: 0x073D - iManufacturer: Eutron - idProduct: 0x0C00 - iProduct: Card Reader - bcdDevice: 1.08 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 344068 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010330 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 - idVendor: 0x073D - iManufacturer: Eutron - idProduct: 0x0C00 - iProduct: SIM Reader - bcdDevice: 1.08 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 344068 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010330 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SPR532.txt b/ccid/ccid/readers/SPR532.txt deleted file mode 100644 index 7f53589..0000000 --- a/ccid/ccid/readers/SPR532.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x04E6 - iManufacturer: SCM Microsystems Inc. - idProduct: 0xE003 - iProduct: SPRx32 USB Smart Card Reader - bcdDevice: 5.10 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 8.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10753 bps - dwMaxDataRate: 344105 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000100BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 270 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Sitecom_MD-010.txt b/ccid/ccid/readers/Sitecom_MD-010.txt deleted file mode 100644 index eaf82c5..0000000 --- a/ccid/ccid/readers/Sitecom_MD-010.txt +++ /dev/null @@ -1,109 +0,0 @@ - idVendor: 0x0DF6 - iManufacturer: Sitecom - idProduct: 0x800A - iProduct: Sitecom USB simcard reader MD-010 - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.700 MHz - dwMaximumClock: 3.700 MHz - bNumClockSupported: 1 - Support 3700 kHz - dwDataRate: 9946 bps - dwMaxDataRate: 318280 bps - bNumDataRatesSupported: 53 - Support 1807 bps - Support 1989 bps - Support 2409 bps - Support 2487 bps - Support 3315 bps - Support 3613 bps - Support 3978 bps - Support 4818 bps - Support 4973 bps - Support 6631 bps - Support 7227 bps - Support 7957 bps - Support 9635 bps - Support 9946 bps - Support 13262 bps - Support 14453 bps - Support 15914 bps - Support 19271 bps - Support 19892 bps - Support 21680 bps - Support 23871 bps - Support 26523 bps - Support 28906 bps - Support 29839 bps - Support 31828 bps - Support 36133 bps - Support 38542 bps - Support 39785 bps - Support 43359 bps - Support 48177 bps - Support 49731 bps - Support 53047 bps - Support 57813 bps - Support 59677 bps - Support 63656 bps - Support 66308 bps - Support 72266 bps - Support 77083 bps - Support 79570 bps - Support 86719 bps - Support 96354 bps - Support 99462 bps - Support 106093 bps - Support 115625 bps - Support 119355 bps - Support 132616 bps - Support 144531 bps - Support 154167 bps - Support 159140 bps - Support 198925 bps - Support 212186 bps - Support 231250 bps - Support 318280 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000204BE - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_CSB6_Basic.txt b/ccid/ccid/readers/SpringCard_CSB6_Basic.txt deleted file mode 100644 index 6bb0f97..0000000 --- a/ccid/ccid/readers/SpringCard_CSB6_Basic.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7121 - iProduct: CSB6 Basic - bcdDevice: 1.47 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_CSB6_Secure.txt b/ccid/ccid/readers/SpringCard_CSB6_Secure.txt deleted file mode 100644 index ccf9dca..0000000 --- a/ccid/ccid/readers/SpringCard_CSB6_Secure.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7123 - iProduct: CSB6 Secure - bcdDevice: 1.47 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x02 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_CSB6_Ultimate.txt b/ccid/ccid/readers/SpringCard_CSB6_Ultimate.txt deleted file mode 100644 index 7553a33..0000000 --- a/ccid/ccid/readers/SpringCard_CSB6_Ultimate.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7124 - iProduct: CSB6 Ultimate - bcdDevice: 1.46 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x04 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_CrazyWriter.txt b/ccid/ccid/readers/SpringCard_CrazyWriter.txt deleted file mode 100644 index 2322271..0000000 --- a/ccid/ccid/readers/SpringCard_CrazyWriter.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7113 - iProduct: CrazyWriter - bcdDevice: 1.47 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x02 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_EasyFinger_Standard.txt b/ccid/ccid/readers/SpringCard_EasyFinger_Standard.txt deleted file mode 100644 index dea2e6b..0000000 --- a/ccid/ccid/readers/SpringCard_EasyFinger_Standard.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7136 - iProduct: EasyFinger Standard - bcdDevice: 1.47 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x01 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_EasyFinger_Ultimate.txt b/ccid/ccid/readers/SpringCard_EasyFinger_Ultimate.txt deleted file mode 100644 index dcbf63c..0000000 --- a/ccid/ccid/readers/SpringCard_EasyFinger_Ultimate.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7138 - iProduct: EasyFinger Ultimate - bcdDevice: 1.47 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x03 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/SpringCard_Prox_N_Roll.txt b/ccid/ccid/readers/SpringCard_Prox_N_Roll.txt deleted file mode 100644 index 38aa157..0000000 --- a/ccid/ccid/readers/SpringCard_Prox_N_Roll.txt +++ /dev/null @@ -1,56 +0,0 @@ - idVendor: 0x1C34 - iManufacturer: SpringCard - idProduct: 0x7141 - iProduct: Prox'N'Roll - bcdDevice: 1.47 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.686 MHz - dwMaximumClock: 13.560 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 9909 bps - dwMaxDataRate: 12643980 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Broken pipe - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x0002047E - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....40 Automatic parameters negotiation made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Validy_TokenA.txt b/ccid/ccid/readers/Validy_TokenA.txt deleted file mode 100644 index 3aee380..0000000 --- a/ccid/ccid/readers/Validy_TokenA.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x1CF0 - iManufacturer: Validy - idProduct: 0x0001 - iProduct: TokenA sl vt - bcdDevice: 1.03 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 2 - bulk-IN and bulk-OUT - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 1 - Support 3580 kHz - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 1 - Support 9600 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00040042 - ....02 Automatic parameter configuration based on ATR data - ....40 Automatic parameters negotiation made by the CCID - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 1024 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Vasco_DP905.txt b/ccid/ccid/readers/Vasco_DP905.txt deleted file mode 100644 index d686e0f..0000000 --- a/ccid/ccid/readers/Vasco_DP905.txt +++ /dev/null @@ -1,111 +0,0 @@ - idVendor: 0x1A44 - iManufacturer: VASCO - idProduct: 0x0001 - iProduct: DP905 - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x03 - 5.0V - 3.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.700 MHz - dwMaximumClock: 3.700 MHz - bNumClockSupported: 1 - Support 3700 kHz - dwDataRate: 9946 bps - dwMaxDataRate: 318280 bps - bNumDataRatesSupported: 53 - Support 1807 bps - Support 1989 bps - Support 2409 bps - Support 2487 bps - Support 3315 bps - Support 3613 bps - Support 3978 bps - Support 4818 bps - Support 4973 bps - Support 6631 bps - Support 7227 bps - Support 7957 bps - Support 9635 bps - Support 9946 bps - Support 13262 bps - Support 14453 bps - Support 15914 bps - Support 19271 bps - Support 19892 bps - Support 21680 bps - Support 23871 bps - Support 26523 bps - Support 28906 bps - Support 29839 bps - Support 31828 bps - Support 36133 bps - Support 38542 bps - Support 39785 bps - Support 43359 bps - Support 48177 bps - Support 49731 bps - Support 53047 bps - Support 57813 bps - Support 59677 bps - Support 63656 bps - Support 66308 bps - Support 72266 bps - Support 77083 bps - Support 79570 bps - Support 86719 bps - Support 96354 bps - Support 99462 bps - Support 106093 bps - Support 115625 bps - Support 119355 bps - Support 132616 bps - Support 144531 bps - Support 154167 bps - Support 159140 bps - Support 198925 bps - Support 212186 bps - Support 231250 bps - Support 318280 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000007 - 2-wire protocol - 3-wire protocol - I2C protocol - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000204BE - ....02 Automatic parameter configuration based on ATR data - ....04 Automatic activation of ICC on inserting - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Vega-Alpha.txt b/ccid/ccid/readers/Vega-Alpha.txt deleted file mode 100644 index 7642f96..0000000 --- a/ccid/ccid/readers/Vega-Alpha.txt +++ /dev/null @@ -1,93 +0,0 @@ - idVendor: 0x0982 - iManufacturer: COVADIS - idProduct: 0x0008 - iProduct: VEGA-ALPHA - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 10752 bps - dwMaxDataRate: 500000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 10753 bps - Support 14337 bps - Support 15625 bps - Support 17204 bps - Support 20833 bps - Support 21505 bps - Support 23438 bps - Support 25806 bps - Support 28674 bps - Support 31250 bps - Support 32258 bps - Support 34409 bps - Support 39063 bps - Support 41667 bps - Support 43011 bps - Support 46875 bps - Support 52083 bps - Support 53763 bps - Support 57348 bps - Support 62500 bps - Support 64516 bps - Support 68817 bps - Support 71685 bps - Support 78125 bps - Support 83333 bps - Support 86022 bps - Support 93750 bps - Support 104167 bps - Support 107527 bps - Support 114695 bps - Support 125000 bps - Support 129032 bps - Support 143369 bps - Support 156250 bps - Support 166667 bps - Support 172043 bps - Support 215054 bps - Support 229391 bps - Support 250000 bps - Support 344086 bps - Support 500000 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x03 - PIN Verification supported - PIN Modification supported - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Verisign_secure_storage_token.txt b/ccid/ccid/readers/Verisign_secure_storage_token.txt deleted file mode 100644 index aff234e..0000000 --- a/ccid/ccid/readers/Verisign_secure_storage_token.txt +++ /dev/null @@ -1,53 +0,0 @@ - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0x1359 - iProduct: Token GEM USB COMBI-M - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 2 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 92 - UNSUPPORTED SubClass - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0xFF - PROPRIETARY bDescriptorType - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 1.500 MHz - dwMaximumClock: 1.500 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 1500 kHz - dwDataRate: 4032 bps - dwMaxDataRate: 46875 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - Support 4032 bps - Support 23437 bps - Support 46875 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Verisign_secure_token.txt b/ccid/ccid/readers/Verisign_secure_token.txt deleted file mode 100644 index 80f6750..0000000 --- a/ccid/ccid/readers/Verisign_secure_token.txt +++ /dev/null @@ -1,53 +0,0 @@ -Parsing Interface Descriptor for device: 001/095 - idVendor: 0x08E6 - iManufacturer: Gemplus - idProduct: 0xACE0 - iProduct: Token GEM USB COMBI - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 2 - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 92 - UNSUPPORTED SubClass - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0xFF - PROPRIETARY bDescriptorType - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 1.500 MHz - dwMaximumClock: 1.500 MHz - bNumClockSupported: 0x00 - Support 4032 bps - Support 23437 bps - Support 46875 bps - dwDataRate: 4032 bps - dwMaxDataRate: 46875 bps - bNumDataRatesSupported: 0 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010230 - Automatic ICC clock frequency change according to parameters - Automatic baud rate change according to frequency and Fi, Di parameters - NAD value other than 00 accepted (T=1) - TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0 - bClassEnveloppe: 0 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/Winbond.txt b/ccid/ccid/readers/Winbond.txt deleted file mode 100644 index 588243d..0000000 --- a/ccid/ccid/readers/Winbond.txt +++ /dev/null @@ -1,55 +0,0 @@ -Trying to open USB bus/device: 003/009 - idVendor: 0x0416 - iManufacturer: Winbond - idProduct: 0x3815 - iProduct: CCID SmartCard Controller - bcdDevice: 0.06 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 3.000 MHz - dwMaximumClock: 3.000 MHz - bNumClockSupported: 1 - Got 3 clock frequencies but was expecting 1 - Support 3000 kHz - dwDataRate: 8065 bps - dwMaxDataRate: 32258 bps - bNumDataRatesSupported: 3 - Support 8065 bps - Support 16129 bps - Support 32258 bps - dwMaxIFSD: 123 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000004B2 - ....02 Automatic parameter configuration based on ATR data - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..04.. Automatic IFSD exchange as first exchange (T=1) - 00.... Character level exchange - dwMaxCCIDMessageLength: 138 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/e-gate.txt b/ccid/ccid/readers/e-gate.txt deleted file mode 100644 index f1dc605..0000000 --- a/ccid/ccid/readers/e-gate.txt +++ /dev/null @@ -1,51 +0,0 @@ - idVendor: 0x0973 - iManufacturer: SchlumbergerSema - idProduct: 0x0003 - iProduct: SchlumbergerSema Cyberflex Access - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 0 - Control only - bInterfaceClass: 0xFF - NOT A CCID DEVICE - Class is 0xFF (proprietary) - bInterfaceSubClass: 0 - bInterfaceProtocol: 1 - ICCD Version A, Control transfers, (no interrupt-IN) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0001 - T=0 - dwDefaultClock: 3.580 MHz - dwMaximumClock: 3.580 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Device or resource busy - dwDataRate: 9600 bps - dwMaxDataRate: 9600 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request: Device or resource busy - dwMaxIFSD: 0 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00000840 - ....40 Automatic parameters negotiation made by the CCID - ..08.. Unknown (ICCD?) - 00.... Character level exchange - dwMaxCCIDMessageLength: 256 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/iDream.txt b/ccid/ccid/readers/iDream.txt deleted file mode 100644 index 8e7f90c..0000000 --- a/ccid/ccid/readers/iDream.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x062D - iManufacturer: THRC - idProduct: 0x0001 - iProduct: USB Smart Card Reader - bcdDevice: 0.96 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 4 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 129032 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010138 - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..01.. CCID can set ICC in clock stop mode - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/id3_CL1356A_HID.txt b/ccid/ccid/readers/id3_CL1356A_HID.txt deleted file mode 100644 index 417f2cf..0000000 --- a/ccid/ccid/readers/id3_CL1356A_HID.txt +++ /dev/null @@ -1,52 +0,0 @@ - idVendor: 0x0B81 - iManufacturer: id3 Semiconductors - idProduct: 0x0220 - iProduct: Contactless Reader - bcdDevice: 0.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bulk-IN, bulk-OUT and Interrupt-IN - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 0 kHz - dwDataRate: 106000 bps - dwMaxDataRate: 847000 bps - bNumDataRatesSupported: 4 - Support 0 bps - Support 0 bps - Support 0 bps - Support 0 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00040042 - ....02 Automatic parameter configuration based on ATR data - ....40 Automatic parameters negotiation made by the CCID - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/id3_CL1356D.txt b/ccid/ccid/readers/id3_CL1356D.txt deleted file mode 100644 index e72d9d0..0000000 --- a/ccid/ccid/readers/id3_CL1356D.txt +++ /dev/null @@ -1,50 +0,0 @@ - idVendor: 0x0B81 - iManufacturer: id3 Semiconductors - idProduct: 0x0200 - iProduct: Contactless Reader - bcdDevice: 0.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.10 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x01 - 5.0V - dwProtocols: 0x0000 0x0002 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - Support 4000 kHz - dwDataRate: 106000 bps - dwMaxDataRate: 847000 bps - bNumDataRatesSupported: 4 - Support 106000 bps - Support 212000 bps - Support 424000 bps - Support 847000 bps - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00040042 - ....02 Automatic parameter configuration based on ATR data - ....40 Automatic parameters negotiation made by the CCID - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/mIDentity.txt b/ccid/ccid/readers/mIDentity.txt deleted file mode 100644 index 29ffdf6..0000000 --- a/ccid/ccid/readers/mIDentity.txt +++ /dev/null @@ -1,55 +0,0 @@ - idVendor: 0x0D46 - iManufacturer: KOBIL Systems - idProduct: 0x4000 - iProduct: mIDentity M - bcdDevice: 0.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 250000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - IFD does not support GET_DATA_RATES request - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000206BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 02.... Short APDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/mIDentityXL.txt b/ccid/ccid/readers/mIDentityXL.txt deleted file mode 100644 index def005b..0000000 --- a/ccid/ccid/readers/mIDentityXL.txt +++ /dev/null @@ -1,57 +0,0 @@ - idVendor: 0x0D46 - iManufacturer: KOBIL Systems - idProduct: 0x4001 - iProduct: mIDentity XL - bcdDevice: 1.17 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 1 - bAlternateSetting: 0 - bNumEndpoints: 2 - bulk-IN and bulk-OUT - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - bulk transfer, optional interrupt-IN (CCID) - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x07 - 5.0V - 3.0V - 1.8V - dwProtocols: 0x0000 0x0003 - T=0 - T=1 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request: Broken pipe - dwDataRate: 10752 bps - dwMaxDataRate: 250000 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x000406BA - ....02 Automatic parameter configuration based on ATR data - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ....80 Automatic PPS made by the CCID - ..02.. NAD value other than 00 accepted (T=1) - ..04.. Automatic IFSD exchange as first exchange (T=1) - 04.... Short and Extended APDU level exchange - dwMaxCCIDMessageLength: 512 bytes - bClassGetResponse: 0xFF - echoes the APDU class - bClassEnveloppe: 0xFF - echoes the APDU class - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/sid800.txt b/ccid/ccid/readers/sid800.txt deleted file mode 100644 index e095745..0000000 --- a/ccid/ccid/readers/sid800.txt +++ /dev/null @@ -1,47 +0,0 @@ - idVendor: 0x15E1 - iManufacturer: RSA - idProduct: 0x2007 - iProduct: RSA SecurID (R) Authenticator - bcdDevice: 1.00 (firmware release?) - bLength: 9 - bDescriptorType: 4 - bInterfaceNumber: 0 - bAlternateSetting: 0 - bNumEndpoints: 3 - bInterfaceClass: 0x0B [Chip Card Interface Device Class (CCID)] - bInterfaceSubClass: 0 - bInterfaceProtocol: 0 - iInterface: 0 - CCID Class Descriptor - bLength: 0x36 - bDescriptorType: 0x21 - bcdCCID: 1.00 - bMaxSlotIndex: 0x00 - bVoltageSupport: 0x02 - 3.0V - dwProtocols: 0x0000 0x0001 - T=0 - dwDefaultClock: 4.000 MHz - dwMaximumClock: 4.000 MHz - bNumClockSupported: 0 (will use whatever is returned) - IFD does not support GET CLOCK FREQUENCIES request - dwDataRate: 10752 bps - dwMaxDataRate: 344086 bps - bNumDataRatesSupported: 0 (will use whatever is returned) - wrong size for GET_DATA_RATES: 1 - dwMaxIFSD: 254 - dwSynchProtocols: 0x00000000 - dwMechanical: 0x00000000 - No special characteristics - dwFeatures: 0x00010238 - ....08 Automatic ICC voltage selection - ....10 Automatic ICC clock frequency change according to parameters - ....20 Automatic baud rate change according to frequency and Fi, Di params - ..02.. NAD value other than 00 accepted (T=1) - 01.... TPDU level exchange - dwMaxCCIDMessageLength: 271 bytes - bClassGetResponse: 0x00 - bClassEnveloppe: 0x00 - wLcdLayout: 0x0000 - bPINSupport: 0x00 - bMaxCCIDBusySlots: 1 diff --git a/ccid/ccid/readers/supported_readers.txt b/ccid/ccid/readers/supported_readers.txt index 5c69458..4aaab85 100644 --- a/ccid/ccid/readers/supported_readers.txt +++ b/ccid/ccid/readers/supported_readers.txt @@ -1,167 +1,386 @@ -# list of readers supported by the CCID driver -# $Id: supported_readers.txt 4318 2009-07-17 13:43:45Z rousseau $ +# +# List of readers supported by the CCID driver +# Generated: 2013-11-25 +# +# DO NOT EDIT BY HAND -# Gemplus -0x08E6:0x2202:Gemplus Gem e-Seal Pro -0x08E6:0x3437:Gemplus GemPC Twin -0x08E6:0x3438:Gemplus GemPC Key -0x08E6:0x3478:Gemplus GemPC Pinpad -0x08E6:0x3479:Gemplus GemCore POS Pro -0x08E6:0x3480:Gemplus GemCore SIM Pro -0x08E6:0x34EC:Gemplus GemPC Express -0x08E6:0x4433:Gemplus GemPC433 SL -0x08E6:0x5503:Gemalto Prox Dual -0x08E6:0x5504:Gemalto Prox SU -0x08E6:0x8000:Smart Enterprise Guardian -# Verisign branded -0x08E6:0xACE0:Verisign Secure Token -0x08E6:0x1359:VeriSign Secure Storage Token -# Gemalto -0x0973:0x1227:Gemalto PDT - -# SCM Microsystems -0x04E6:0x5111:SCM SCR 331-DI -0x04E6:0x5113:SCM SCR 333 -0x04E6:0x5115:SCM SCR 335 -0x04E6:0x5116:SCM SCR 3310 -0x04E6:0x5117:SCM SCR 3320 -0x04E6:0x5119:SCM SCR 3340 ExpressCard54 -0x04E6:0x511A:SCM SCR 3310 NTTCom -0x04E6:0x511C:Axalto Reflex USB v3 -0x04E6:0x511D:SCM SCR 3311 -0x04E6:0x5120:SCM SCR 331-DI NTTCom -0x04E6:0x5121:SCM SDI 010 -0x04E6:0xE001:SCM SCR 331 -0x04E6:0x5410:SCM SCR 355 -0x04E6:0xE003:SCM SPR 532 - -# OmniKey -0x076B:0x1021:OmniKey CardMan 1021 -0x076B:0x3021:OmniKey CardMan 3121 -0x076B:0x3621:OmniKey CardMan 3621 -0x076B:0x3821:OmniKey CardMan 3821 -0x076B:0x4321:OmniKey CardMan 4321 -0x076B:0x5121:OmniKey CardMan 5121 -0x076B:0x5125:OmniKey CardMan 5125 -0x076B:0x5321:OmniKey CardMan 5321 -0x076B:0x6622:OmniKey CardMan 6121 -0x076B:0xA021:Smart Card Reader -0x076B:0xA022:Teo by Xiring +# Website: http://pcsclite.alioth.debian.org/ccid.html + +########################## +# section: supported +########################## + +# ACS +0x072F:0x90CC:ACS ACR 38U-CCID + +# ActivIdentity +0x09C3:0x0013:ActivIdentity USB Reader V3 +0x09C3:0x0014:ActivIdentity Activkey_Sim + +# Alcor Micro +0x058F:0x9520:Alcor Micro AU9520 +0x058F:0x9540:Alcor Micro AU9540 + +# Athena +0x0DC3:0x1004:Athena ASE IIIe +0x0DC3:0x1102:Athena ASEDrive IIIe KB # C3PO -0x0783:0x0006:C3PO LTC31 -0x0783:0x0007:C3PO TLTC2USB -0x0783:0x0008:C3PO LTC32 USBv2 with keyboard support -0x0783:0x0009:C3PO KBR36 -0x0783:0x0010:C3PO LTC32 -0x0783:0x9002:C3PO TLTC2USB +0x0783:0x0006:C3PO LTC31 v2 -# ActivCard -0x09C3:0x0013:ActivCard USB Reader 3.0 -0x09C3:0x0014:Activkey Sim +# Cherry GmbH +0x046A:0x0005:Cherry GmbH SmartBoard XX33 +0x046A:0x0010:Cherry GmbH SmartBoard XX44 +0x046A:0x002D:Cherry GmbH SmartTerminal XX44 +0x046A:0x003E:Cherry GmbH SmartTerminal ST-2xxx -# Silitek -0x047B:0x020B:Silitek SK-3105 +# COVADIS +0x0982:0x0007:COVADIS ALYA # Dell -0x413c:0x2100:Dell keyboard SK-3106 -0x413c:0X2101:Dell smart card reader keyboard - -# Cherry -0x046a:0x0005:Cherry XX33 -0x046a:0x0010:Cherry XX44 -0x046a:0x002D:Cherry ST1044U -0x046a:0x003E:Cherry SmartTerminal ST-2XXX -0x046A:0x005B:Cherry SmartBoard XX1X -0x046A:0x0070:Cherry SmartTerminal XX1X - -# Advanced Card Systems -0x072f:0x90cc:ACS ACR 38U-CCID -0x072F:0x2200:ACS ACR122U PICC Interface +0x413C:0x2100:Dell keyboard SK-3106 +0x413C:0x2101:Dell Dell Smart Card Reader Keyboard -# O2 Micro -0x0b97:0x7762:O2 Micro Oz776 -0x0b97:0x7772:O2 Micro Oz776 +# Eutron +0x073D:0x0007:Eutron CryptoIdentity CCID +0x073D:0x0008:Eutron CryptoIdentity CCID +0x073D:0x0B00:Eutron Digipass 860 +0x073D:0x0C00:Eutron Card Reader +0x073D:0x0C01:Eutron Smart Pocket -# Kobil +# Feitian +0x096E:0x0807:Feitian ePass2003 + +# Gemalto +0x08E6:0x1227:Gemalto PDT +0x08E6:0x3437:Gemalto PC Twin Reader +0x08E6:0x3438:Gemalto USB Shell Token V2 +0x08E6:0x3478:Gemalto USB GemPCPinpad SmartCard Reader +0x08E6:0x3480:Gemalto GemCore SIM Pro Smart Card Reader +0x08E6:0x34C0:Gemalto Ezio Shield +0x08E6:0x34C3:Gemalto EZIO CB+ +0x08E6:0x4433:Gemalto Gemplus USB SmartCard Reader 433-Swap +0x08E6:0x5503:Gemalto Prox Dual USB PC LinkReader +0x08E6:0x5504:Gemalto Prox SU USB PC LinkReader +0x08E6:0x8000:Gemalto Smart Enterprise Guardian Secure USB Device +0x08E6:0x8141:Gemalto IDBridge K3000 + +# Giesecke & Devrient GmbH +0x1059:0x0017:Giesecke & Devrient GmbH StarSign Crypto USB Token + +# id3 Semiconductors +0x0B81:0x0200:id3 Semiconductors CL1356T + +# Ingenico +0x0F14:0x003D:Ingenico WITEO USB Smart Card Reader + +# KOBIL 0x0D46:0x3001:KOBIL KAAN Base 0x0D46:0x3002:KOBIL KAAN Advanced -0x0d46:0x3003:KOBIL KAAN SIM III -0x0d46:0x3010:KOBIL EMV CAP - SecOVID Reader III -0x0d46:0x4000:KOBIL mIDentity M -0x0d46:0x4001:KOBIL mIDentity XL +0x0D46:0x3003:KOBIL KAAN SIM III +0x0D46:0x3010:KOBIL EMV CAP - SecOVID Reader III -# Eutron -0x073D:0x0B00:Eutron Digipass 860 -0x073D:0x0C00:Eutron SIM Pocket Combo -0x073D:0x0C01:Eutron Smart Pocket -0x073D:0x0007:Eutron CryptoIdentity -0x073D:0x0008:Eutron CryptoIdentity +# Lenovo +0x17EF:0x1003:Lenovo Integrated Smart Card Reader + +# MYSMART +0x09BE:0x0002:MYSMART MySMART PAD V2.0 + +# OMNIKEY AG +0x076B:0x3021:OMNIKEY AG CardMan 3121 + +# Precise Biometrics +0x076B:0xA022:Precise Biometrics Sense MC + +# SCM Microsystems Inc. +0x03F0:0x0824:SCM Microsystems Inc. HP USB Smartcard Reader +0x04E6:0x5111:SCM Microsystems Inc. SCR 331-DI +0x04E6:0x5116:SCM Microsystems Inc. SCR 3310 +0x04E6:0x511D:SCM Microsystems Inc. SCR 3311 +0x04E6:0x5410:SCM Microsystems Inc. SCR 355 +0x04E6:0xE001:SCM Microsystems Inc. SCR 331 +0x04E6:0xE003:SCM Microsystems Inc. SPR 532 + +# TianYu CCID Key +0xA625:0x0801:TianYu CCID Key TianYu CCID SmartKey + +# Verisign +0x08E6:0x1359:Verisign Secure Storage Token +0x08E6:0xACE0:Verisign Secure Token + +# XIRING +0x0F14:0x0011:XIRING XI-SIGN USB V2 +0x0F14:0x0037:XIRING MyLeo +0x0F14:0x0038:XIRING Leo v2 + +########################## +# section: shouldwork +########################## + +# Access IS +0x0DB5:0x0138:Access IS ePassport Reader + +# ACS +0x072F:0x1204:ACS ACR101 ICC Reader +0x072F:0x8201:ACS APG8201 PINhandy 1 +0x072F:0x8202:ACS APG8201 USB Reader +0x072F:0x90DB:ACS CryptoMate64 + +# Akasa + +# Aktiv +0x0A89:0x0025:Aktiv Rutoken lite +0x0A89:0x0030:Aktiv Rutoken ECP +0x0A89:0x0080:Aktiv PINPad Ex +0x0A89:0x0081:Aktiv PINPad In + +# Aktiv Co., ProgramPark +0x0A89:0x0060:Aktiv Co., ProgramPark Rutoken Magistra + +# Alcor Micro +0x058F:0x9522:Alcor Micro AU9522 + +# ASK-RFID +0x1FD3:0xCC1D:ASK-RFID CPL108 # Athena -0x0DC3:0x1004:Athena ASE IIIe -0x0DC3:0x1102:Athena ASEDrive IIIe KB +0x0DC3:0x0900:Athena IDProtect Key v2 + +# ATMEL +0x03EB:0x6004:ATMEL AT91SO CCID Smart Card Reader +0x03EB:0x6009:ATMEL AT98SC032CT-USB +0x03EB:0x600B:ATMEL AT91SC192192CT-USB ICCD reader +0x03EB:0x6010:ATMEL AT90SCR100 +0x03EB:0x6011:ATMEL AT90SCR050 +0x03EB:0x6012:ATMEL VaultIC420 Smart Object +0x03EB:0x6014:ATMEL VaultIC440 + +# Avtor +0x15CF:0x0019:Avtor SecureToken +0x15CF:0x001D:Avtor SC Reader 371 + +# Axalto +0x04E6:0x511C:Axalto Reflex USB v3 -# SmartEpad -0x09BE:0x0002:SmartEpad +# BIFIT +0x23A0:0x0001:BIFIT USB-Token iBank2key +0x23A0:0x0002:BIFIT iBank2Key -# Winbond Electronics (for OEM only so the name may be different) -0x0416:0x3815:Winbond +# Bit4id +0x25DD:0x1101:Bit4id miniLector-s +0x25DD:0x1201:Bit4id cryptokey +0x25DD:0x2221:Bit4id iAM +0x25DD:0x2321:Bit4id CKey4 +0x25DD:0x3111:Bit4id miniLector -# HP -0x03F0:0x1024:HP USB Smart Card Keyboard -0x03F0:0x0824:HP USB Smartcard Reader -0x03F0:0x2924:HP MFP Smart Card Reader +# BLUTRONICS +0x1B0E:0x1078:BLUTRONICS BLUDRIVE II CCID -# id3 Semiconductors -0x0B81:0x0200:id3 CL1356D -0x0B81:0x0220:id3 CL1356A HID +# Broadcom Corp +0x0A5C:0x5800:Broadcom Corp 5880 +0x0A5C:0x5802:Broadcom Corp 5880 -# Alcor Micro Corp. -0x058F:0x9520:Alcor Micro AU9520 -0x058F:0x9520:Alcor Micro SCR001 +# C3PO +0x0783:0x0007:C3PO TLTC2USB +0x0783:0x0009:C3PO KBR36 +0x0783:0x0010:C3PO LTC32 +0x0783:0x0036:C3PO LTC36 -# RSA -0x15E1:0x2007:RSA SecurID +# CCB +0x8829:0xCCB2:CCB eSafeLD + +# charismathics +0x19E7:0x0002:charismathics plug'n'crypt CCID token + +# Cherry GmbH +0x046A:0x005B:Cherry GmbH SmartBoard XX1X +0x046A:0x0070:Cherry GmbH SmartTerminal XX1X +0x046A:0x0072:Cherry GmbH SmartTerminal ST-1275 + +# COVADIS +0x0982:0x0008:COVADIS VEGA-ALPHA +0x0982:0x0040:COVADIS Auriga + +# Dectel +0x0BDA:0x0165:Dectel CI692 + +# Feitian Technologies +0x096E:0x0505:Feitian Technologies FT SCR310 + +# Free Software Initiative of Japan +0x234B:0x0000:Free Software Initiative of Japan Gnuk # Fujitsu Siemens Computers -0x0BF8:0x1005:Fujitsu Siemens SmartCard Keyboard USB 2A -0x0BF8:0x1006:Fujitsu Siemens SmartCard USB 2A +0x0BF8:0x1005:Fujitsu Siemens Computers SmartCard Keyboard USB 2A +0x0BF8:0x1006:Fujitsu Siemens Computers SmartCard USB 2A -# Sitecom -0x0DF6:0x800A:Sitecom USB simcard reader MD-010 +# FujitsuTechnologySolutions GmbH +0x0BF8:0x1017:FujitsuTechnologySolutions GmbH SmartCase KB SCR eSIG + +# Gemalto +0x08E6:0x2202:Gemalto Gem e-Seal Pro USB Token +0x08E6:0x34C1:Gemalto ING Shield Pro SC +0x08E6:0x34C2:Gemalto Ezio Shield +0x08E6:0x34C5:Gemalto Ezio Shield Branch Reader +0x08E6:0x34EC:Gemalto GemPC Express +0x08E6:0x4042:Gemalto SA .NET Dual +0x08E6:0x5743:Gemalto Hybrid Smartcard Reader +0x08E6:0x8108:Gemalto Smart Enterprise Guardian Secure USB Device + +# Gemplus +0x08E6:0x3479:Gemplus GemCore POS Pro Smart Card Reader + +# Generic +0x0BDA:0x0169:Generic USB2.0-CRW -# Schlumberger/Axlalto/Gemalto -0x0973:0x0003:SchlumbergerSema Cyberflex Access +# German Privacy Foundation +0x20A0:0x4107:German Privacy Foundation Crypto Stick v1.2 -# Philips -0x0471:0x040F:Philips JCOP41V221 +# Giesecke & Devrient GmbH +0x1059:0x000C:Giesecke & Devrient GmbH Star Sign Card Token 350 (ICCD) +0x1059:0x000D:Giesecke & Devrient GmbH Star Sign Card Token 550 (ICCD) -# Philips SmartMX (Rainbow/SafeNet Key 4000?) -0x04B9:0x1400:Philips SmartMX +# GIS Ltd +0x0F1A:0x0002:GIS Ltd SmartMouse USB -# Giesecke & Devrient -0x1059:0x000C:GnD CardToken 350 -0x1059:0x000D:GnD CardToken 550 +# GoldKey Security +0x19C8:0x0012:GoldKey Security PIV Token + +# HDZB +0x1677:0x0025:HDZB uKeyCI800-K18 + +# Hewlett Packard +0x03F0:0x2924:Hewlett Packard MFP Smart Card Reader + +# HID OMNIKEY +0x076B:0x5127:HID OMNIKEY 5127 CK +0x076B:0x5326:HID OMNIKEY 5326 DFR +0x076B:0x5427:HID OMNIKEY 5427 CK + +# id3 Semiconductors +0x0B81:0x0220:id3 Semiconductors CL1356A_HID + +# Identive +0x04E6:0x5710:Identive CLOUD 2700 F Smart Card Reader +0x04E6:0x5720:Identive Identive CLOUD 4500 F Dual Interface Reader +0x04E6:0x5721:Identive Identive CLOUD 4510 F Contactless + SAM Reader +0x04E6:0x5810:Identive CLOUD 2700 R Smart Card Reader + +# Inside Secure +0x2406:0x6300:Inside Secure VaultIC 420 Smart Object +0x2406:0x6301:Inside Secure VaultIC 440 Smart Object +0x2406:0x6302:Inside Secure VaultIC 460 Smart Object +0x2406:0x6403:Inside Secure AT90SCR100 +0x2406:0x6404:Inside Secure AT90SCR050 +0x2406:0x6407:Inside Secure AT90SCR200 + +# KEBTechnology +0x04CC:0x5072:KEBTechnology KONA USB SmartCard + +# Kingtrust +0x0483:0x0007:Kingtrust Multi-Reader + +# KOBIL Systems +0x0D46:0x3014:KOBIL Systems Smart Token +0x0D46:0x301D:KOBIL Systems IDToken +0x0D46:0x4189:KOBIL Systems mIDentity 4smart +0x0D46:0x41A9:KOBIL Systems mIDentity 4smart AES +0x0D46:0x4289:KOBIL Systems mIDentity visual +0x0D46:0x4389:KOBIL Systems mIDentity fullsize +0x0D46:0x43A9:KOBIL Systems mIDentity fullsize AES # Lenovo -0x17EF:0x1003:Lenovo Integrated Smart Card Reader +0x17EF:0x6007:Lenovo Lenovo USB Smartcard Keyboard -# Charismathics -0x19E7:0x0002:Charismathics token +# Macally +0x08AE:0x0BDF:Macally NFC CCID eNetPad -# Blutronics -0x1B0E:0x1078:Blutronics Bludrive II CCID +# Morpho +0x079B:0x0026:Morpho MSO350/MSO351 Fingerprint Sensor & SmartCard Reader +0x079B:0x0052:Morpho MSO1350 Fingerprint Sensor & SmartCard Reader -# Covadis -0x0982:0x0007:Covadis Alya -0x0982:0x0008:Covadis Vega +# MSI +0x0BDA:0x0161:MSI StarReader SMART -# Vasco -0x1A44:0x0001:Vasco DP905 +# Neowave +0x1E0D:0x0013:Neowave Weneo +0x1E0D:0x0033:Neowave Weneo +0x1E0D:0x1023:Neowave Weneo +0x1E0D:0x8033:Neowave Weneo -# Validy -0x1CF0:0x0001:Validy TokenA sl vt +# NTT Communications Corp. +0x04E6:0x511A:NTT Communications Corp. SCR3310-NTTCom USB SmartCard Reader + +# NXP +0x1FC9:0x010B:NXP PR533 + +# OBERTHUR TECHNOLOGIES +0x1A74:0xB111:OBERTHUR TECHNOLOGIES ID-ONE TOKEN SLIM v2 + +# OCS ID-One Cosmo Card +0x1A74:0x6354:OCS ID-One Cosmo Card USB Smart Chip Device + +# OMNIKEY +0x076B:0x1021:OMNIKEY CardMan 1021 +0x076B:0x4321:OMNIKEY CardMan 4321 +0x076B:0x5321:OMNIKEY CardMan 5321 +0x076B:0x6321:OMNIKEY 6321 CLi USB + +# OMNIKEY AG +0x076B:0x3621:OMNIKEY AG CardMan 3621 +0x076B:0x3821:OMNIKEY AG CardMan 3821 +0x076B:0x5121:OMNIKEY AG CardMan 5121 +0x076B:0x5125:OMNIKEY AG CardMan 5125 +0x076B:0x6622:OMNIKEY AG CardMan 6121 +0x076B:0xA021:OMNIKEY AG Smart Card Reader + +# Panasonic +0x04DA:0x117A:Panasonic Panasonic USB Smart Card Reader 7A-Smart + +# Philips Semiconductors +0x0471:0x040F:Philips Semiconductors JCOP41V221 +0x04B9:0x1400:Philips Semiconductors SmartMX Sample + +# Planeta +0x21AB:0x0010:Planeta RC700-NFC CCID + +# Raritan +0x14DD:0x1006:Raritan D2CIM-DVUSB VM/CCID + +# REINER SCT +0x0C4B:0x0504:REINER SCT cyberJack go +0x0C4B:0x9102:REINER SCT cyberJack RFID basis + +# SafeTech +0x24A2:0x0102:SafeTech SafeTouch + +# SchlumbergerSema +0x0973:0x0003:SchlumbergerSema SchlumbergerSema Cyberflex Access + +# SCM Microsystems Inc. +0x04E6:0x5113:SCM Microsystems Inc. SCR33x USB Smart Card Reader +0x04E6:0x5115:SCM Microsystems Inc. SCR 335 +0x04E6:0x5117:SCM Microsystems Inc. SCR3320 - Smart Card Reader +0x04E6:0x5119:SCM Microsystems Inc. SCR3340 - ExpressCard54 Smart Card Reader +0x04E6:0x511F:SCM Microsystems Inc. SCR3310 USB Smart Card Reader +0x04E6:0x5120:SCM Microsystems Inc. SCR331-DI USB Smart Card Reader +0x04E6:0x5121:SCM Microsystems Inc. SDI010 Smart Card Reader +0x04E6:0x512B:SCM Microsystems Inc. SDI011 Contactless Reader +0x04E6:0x512C:SCM Microsystems Inc. SDI011 Contactless Reader +0x04E6:0x5291:SCM Microsystems Inc. SCL010 Contactless Reader +0x04E6:0x5293:SCM Microsystems Inc. SCL01x Contactless Reader + +# Secure Device Solutions +0x0B81:0x8007:Secure Device Solutions DOMINO-Key TWIN + +# SecuTech +0x0403:0xC587:SecuTech SecuTech Token + +# Sitecom +0x0DF6:0x800A:Sitecom Sitecom USB simcard reader MD-010 + +# Softforum Co., Ltd +0x04E8:0x0007:Softforum Co., Ltd XecureHSM # SpringCard 0x1C34:0x7113:SpringCard CrazyWriter @@ -171,68 +390,189 @@ 0x1C34:0x7136:SpringCard EasyFinger Standard 0x1C34:0x7138:SpringCard EasyFinger Ultimate 0x1C34:0x7141:SpringCard Prox'N'Roll +0x1C34:0x8141:SpringCard NFC'Roll +0x1C34:0x91B1:SpringCard H663 Series +0x1C34:0xA1A1:SpringCard H512 Series -# Oberthur -0x1A74:0x6354:OCS ID-One Cosmo Card +# SYNNIX +0x1206:0x2105:SYNNIX STD200 -# Aladdin -0x0529:0x0620:Aladdin eToken PRO USB 72K Java +# Teridian Semiconductors +0x1862:0x0000:Teridian Semiconductors TSC12xxFV.09 -# Atmel -0x03EB:0x6004:Atmel AT91SO -0x03EB:0x6009:Atmel AT98SC032CT -0x03EB:0x600B:Atmel AT91SC192192CT-USB ICCD +# Tianyu +0xA625:0x0810:Tianyu Smart Card Reader -# KEBTechnology -0x04CC:0x5072:KONA USB SmartCard +# Todos +0x0B0C:0x0050:Todos Argos Mini II +0x0B0C:0x0052:Todos CX00 -# Xiring -0x0F14:0x0011:Xiring XI-SIGN USB V2 +# ubisys +0x19A6:0x0009:ubisys 13.56MHz RFID (CCID) + +# Validy +0x1CF0:0x0001:Validy TokenA sl vt + +# VASCO +0x1A44:0x0001:VASCO DP905v1.1 +0x1A44:0x0101:VASCO DIGIPASS KEY 101 +0x1A44:0x0112:VASCO DIGIPASS KEY 860 +0x1A44:0x0115:VASCO DIGIPASS KEY 200 +0x1A44:0x0117:VASCO DIGIPASS KEY 860 +0x1A44:0x0119:VASCO DIGIPASS KEY 200 +0x1A44:0x0120:VASCO DIGIPASS KEY 202 +0x1A44:0x0122:VASCO DIGIPASS KEY 202 +0x1A44:0x0855:VASCO DP855 +0x1A44:0x0865:VASCO DP865 +0x1A44:0x0920:VASCO DIGIPASS 920 # VMware 0x0E0F:0x0004:VMware Virtual USB CCID -# Realtek? -0x0BDA:0x0161:MSI StarReader SMART -0x0BDA:0x0169:Realtek +# Winbond +0x0416:0x3815:Winbond CCID SmartCard Controller -# Aktiv Co., ProgramPark -0x0A89:0x0060:Aktiv Rutoken Magistra -0x0A89:0x0030:Aktiv Rutoken ECP +# XIRING -# TianYu CCID Key -0xA625:0x0801:TianYu CCID SmartKey +# Yubico +0x1050:0x0111:Yubico Yubikey NEO OTP+CCID +0x1050:0x0112:Yubico Yubikey NEO CCID -# Precise Biometrics -0x08C3:0x0401:Precise 250 MC -0x08C3:0x0402:Precise 200 MC +########################## +# section: unsupported +########################## -# Raritan -0x14DD:0x1006:Raritan D2CIM-DVUSB VM/CCID +# ACS +0x072F:0x2200:ACS ACR122U PICC Interface + +# ActivCard +0x09C3:0x0008:ActivCard ActivCard USB Reader V2 + +# Aladdin +0x0529:0x0620:Aladdin eToken PRO USB 72K Java + +# ATMEL +0x03EB:0x6016:ATMEL VaultIC460 + +# Broadcom Corp +0x0A5C:0x5801:Broadcom Corp 5880 + +# C3PO +0x0783:0x0003:C3PO LTC3x USB # Feitian 0x096E:0x0503:Feitian SCR301 -# Softforum -0x04E8:0x0007:Softforum XecureHSM +# Hewlett-Packard Company +0x03F0:0x0036:Hewlett-Packard Company HP USB CCID Smartcard Keyboard +0x03F0:0x1024:Hewlett-Packard Company HP USB Smart Card Keyboard -# Neowave -0x1E0D:0x0013:Neowave Weneo -0x1E0D:0x8033:Neowave Weneo +# KOBIL Systems +0x0D46:0x4000:KOBIL Systems mIDentity M +0x0D46:0x4001:KOBIL Systems mIDentity XL -# Synnix -0x1206:0x2105:Synnix STD200 +# O2 +0x0B97:0x7762:O2 Micro Oz776 +0x0B97:0x7772:O2 Micro Oz776 -# Panasonic -0x04DA:0x117A:Panasonic USB Smart Card Reader 7A-Smart +# Precise Biometrics +0x08C3:0x0401:Precise Biometrics Precise 250 MC +0x08C3:0x0402:Precise Biometrics Precise 200 MC + +# RSA +0x15E1:0x2007:RSA RSA SecurID (R) Authenticator + +# THRC +0x062D:0x0001:THRC Smart Card Reader + +########################## +# section: disabled +########################## + +# jNet Technology inc. +#0x0483:0x2010:jNet Technology inc. jToken s1 + +# MX5 +#0x0980:0x902F:MX5 MX5 SMART CCID DRIVER + +# OCS ID-One Cosmo Card +#0x1A74:0x6356:OCS ID-One Cosmo Card USB Smart Chip Device -# Bogus readers but partly supported -# See the README file for a bug description -0x09C3:0x0008:ActivCard USB Reader 2.0 -0x0783:0x0003:C3PO LTC31 +# Reiner-SCT #0x0C4B:0x0300:Reiner-SCT cyberJack pinpad(a) -#0x0483:0x2010:jNet Technology jToken s1 -#0x0A5C:0x5800:Broadcom 5880 -#0x04E6:0x5291:SCM SCL010 Contactless Reader -#0x062D:0x0001:iDream or ID-SMID01 + +# SCM Microsystems Inc. +#0x04E6:0x5292:SCM Microsystems Inc. SCL01x Contactless Reader + +# SMART +#0x0B8C:0x000E:SMART SBV280 + +########################## +# section: duplicates +########################## +#0x04E6:0x5291:SCM Microsystems Inc. SCL010 Contactless Reader (SCL010.txt) +#0x04E6:0x5291:SCM Microsystems Inc. SCL010 Contactless Reader (SCM_SCL010.txt) + +#0x04E6:0x5410:SCM Microsystems Inc. SCR35xx v2.0 USB SC Reader (SCR3500.txt) +#0x04E6:0x5410:SCM Microsystems Inc. SCR 355 (SCR355.txt) + +#0x04E6:0x5720:Identive Identive CLOUD 4500 F Dual Interface Reader (Identive_CLOUD_4500_F.txt) +#0x04E6:0x5720:Identive Identive CLOUD 4500 F Dual Interface Reader (Identive_CLOUD_4500_F.txt_i1) +#0x04E6:0x5720:Identive Identive CLOUD 4700 F Dual Interface Reader (Identive_CLOUD_4700_F.txt) +#0x04E6:0x5720:Identive Identive CLOUD 4700 F Dual Interface Reader (Identive_CLOUD_4700_F.txt_i1) + +#0x04E6:0x5721:Identive Identive CLOUD 4510 F Contactless + SAM Reader (Identive_CLOUD_4510_F.txt) +#0x04E6:0x5721:Identive Identive CLOUD 4510 F Contactless + SAM Reader (Identive_CLOUD_4510_F.txt_i1) +#0x04E6:0x5721:Identive Identive CLOUD 4710 F Contactless + SAM Reader (Identive_CLOUD_4710_F.txt) +#0x04E6:0x5721:Identive Identive CLOUD 4710 F Contactless + SAM Reader (Identive_CLOUD_4710_F.txt_i1) + +#0x058F:0x9520:Alcor Micro AU9520 (AU9520.txt) +#0x058F:0x9520:Akasa AK-CR-03 (Akasa_AK-CR-03.txt) +#0x058F:0x9520:Alcor Micro SCR001 (Alcor_SCR001.txt) + +#0x072F:0x90CC:ACS ACR122U (ACR122U.txt) +#0x072F:0x90CC:ACS ACR 38U-CCID (ACR38U-CCID.txt) +#0x072F:0x90CC:ACS ACR100 (ACS_ACR100.txt) +#0x072F:0x90CC:ACS ACR38 plugin (ACS_ACR38_plugin.txt) +#0x072F:0x90CC:ACS AET65 (ACS_AET65.txt) + +#0x073D:0x0C00:Eutron Card Reader (Eutron_SIM_Pocket_Combo_(Card_Reader).txt) +#0x073D:0x0C00:Eutron SIM Reader (Eutron_SIM_Pocket_Combo_(SIM_Reader).txt) + +#0x076B:0x3021:OMNIKEY AG CardMan 3021 (CardMan3021.txt) +#0x076B:0x3021:OMNIKEY AG CardMan 3121 (CardMan3121.txt) + +#0x076B:0xA022:Precise Biometrics Sense MC (Precise_Sense_MC.txt) +#0x076B:0xA022:XIRING Teo (Teo.txt) + +#0x08E6:0x3437:Gemalto PC Twin Reader (GemPCTwin.txt) +#0x08E6:0x3437:Gemalto IDBridge CT30 (Gemalto_IDBridge_CT30.txt) + +#0x08E6:0x3438:Gemalto USB Shell Token V2 (GemPCKey.txt) +#0x08E6:0x3438:Gemalto IDBridge K30 (Gemalto_IDBridge_K30.txt) + +#0x08E6:0x3478:Gemalto USB GemPCPinpad SmartCard Reader (GemPCPinpad.txt) +#0x08E6:0x3478:Gemalto USB GemPCPinpad SmartCard Reader (GemPCPinpadv2.txt) + +#0x08E6:0x5503:Gemalto Prox Dual USB PC LinkReader (GemProxDU.txt) +#0x08E6:0x5503:Gemalto Prox Dual USB PC LinkReader (GemProxDU.txt_i1) + +#0x08E6:0x5504:Gemalto Prox SU USB PC LinkReader (GemProxSU.txt) +#0x08E6:0x5504:Gemalto Prox SU USB PC LinkReader (GemProxSU.txt_i1) + +#0x0A5C:0x5801:Broadcom Corp 5880 (Broadcom_5880v2.txt) +#0x0A5C:0x5801:Broadcom Corp 5880 (Broadcom_5880v2.txt_i1) + +#0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v3.txt) +#0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v4.txt) +#0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v4.txt_i1) + +#0x0B81:0x0200:id3 Semiconductors CL1356T (id3_CL1356T.txt) +#0x0B81:0x0200:id3 Semiconductors CL1356T5 (id3_CL1356T5.txt) + +#0x0F14:0x0011:XIRING XI-SIGN USB V2 (Xiring_XI-SIGN.txt) +#0x0F14:0x0011:XIRING XI-SIGN USB V2 (Xiring_XI-SIGN_6000.txt) + +#0x0F14:0x003D:Ingenico WITEO USB Smart Card Reader (Ingenico_WITEO_badge.txt) +#0x0F14:0x003D:Ingenico WITEO USB Smart Card Reader (Ingenico_WITEO_base.txt) diff --git a/ccid/ccid/src/92_pcscd_ccid.rules b/ccid/ccid/src/92_pcscd_ccid.rules new file mode 100644 index 0000000..735e4a7 --- /dev/null +++ b/ccid/ccid/src/92_pcscd_ccid.rules @@ -0,0 +1,20 @@ +# udev rules for CCID devices + +# $Id: 92_pcscd_ccid.rules 6623 2013-05-07 09:11:26Z rousseau $ + +# Gemplus PCMCIA Card +#SUBSYSTEMS=="pcmcia", DRIVERS=="serial_cs", ACTION=="add", ATTRS{prod_id1}=="Gemplus", ATTRS{prod_id2}=="SerialPort", ATTRS{prod_id3}=="GemPC Card", RUN+="/usr/sbin/pcscd --hotplug" + +# If not adding the device, go away +ACTION!="add", GOTO="pcscd_ccid_rules_end" +SUBSYSTEM!="usb", GOTO="pcscd_ccid_rules_end" +ENV{DEVTYPE}!="usb_device", GOTO="pcscd_ccid_rules_end" + +# Kobil mIDentity +ATTRS{idVendor}=="0d46", ATTRS{idProduct}=="4081", RUN+="/usr/sbin/Kobil_mIDentity_switch" + +# set USB power management to auto. +ENV{ID_USB_INTERFACES}==":0b0000:", RUN+="/bin/sh -c 'echo auto > /sys/$devpath/power/control'" + +# All done +LABEL="pcscd_ccid_rules_end" diff --git a/ccid/ccid/src/Info.plist.src b/ccid/ccid/src/Info.plist.src index ea8fc3a..65ba139 100644 --- a/ccid/ccid/src/Info.plist.src +++ b/ccid/ccid/src/Info.plist.src @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - MAGIC_BUNDLE + MAGIC_TARGET CFBundleIdentifier org.debian.alioth.pcsclite.smartcardccid CFBundleInfoDictionaryVersion @@ -20,7 +20,7 @@ CFBundleVersion 0.0.1d1 ifdCapabilities - MAGIC_IFDCAPABILITIES + 0x00000000 - CFBundleExecutable - MAGIC_TARGET - ifdManufacturerString Ludovic Rousseau (ludovic.rousseau@free.fr) diff --git a/ccid/ccid/src/Makefile.am b/ccid/ccid/src/Makefile.am index 627b92c..5c9b920 100644 --- a/ccid/ccid/src/Makefile.am +++ b/ccid/ccid/src/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am 4310 2009-07-06 15:03:37Z rousseau $ +# $Id: Makefile.am 6752 2013-09-16 18:27:04Z rousseau $ CCID_BUNDLE = $(bundle) CCID_LIB = libccid.$(DYN_LIB_EXT) @@ -8,14 +8,17 @@ CCID_VERSION=CCID_VERSION=`$(srcdir)/convert_version.pl $(PACKAGE_VERSION)` lib_LTLIBRARIES = LIBS_TO_INSTALL = +LIBS_TO_UNINSTALL = if WITH_LIBUSB lib_LTLIBRARIES += libccid.la LIBS_TO_INSTALL += install_ccid -bin_PROGRAMS = parse +LIBS_TO_UNINSTALL += uninstall_ccid +noinst_PROGRAMS = parse endif if WITH_TWIN_SERIAL lib_LTLIBRARIES += libccidtwin.la LIBS_TO_INSTALL += install_ccidtwin +LIBS_TO_UNINSTALL += uninstall_ccidtwin endif COMMON = ccid.c \ @@ -44,69 +47,64 @@ T1 = towitoko/atr.c \ TOKEN_PARSER = tokenparser.l parser.h \ strlcpy.c \ misc.h \ - strlcpycat.h + strlcpycat.h \ + simclist.c \ + simclist.h PROVIDED_BY_PCSC = debug.c libccid_la_SOURCES = $(COMMON) $(USB) $(TOKEN_PARSER) $(PROVIDED_BY_PCSC) $(T1) libccid_la_LIBADD = $(LEXLIB) $(LIBUSB_LIBS) $(PTHREAD_LIBS) libccid_la_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) $(PTHREAD_CFLAGS) \ - $(SYMBOL_VISIBILITY) -D$(CCID_VERSION) + $(SYMBOL_VISIBILITY) -D$(CCID_VERSION) -DSIMCLIST_NO_DUMPRESTORE +libccid_la_LDFLAGS = -avoid-version libccidtwin_la_SOURCES = $(COMMON) $(SERIAL) $(TOKEN_PARSER) \ $(PROVIDED_BY_PCSC) $(T1) libccidtwin_la_CFLAGS = $(PCSC_CFLAGS) $(PTHREAD_CFLAGS) $(SYMBOL_VISIBILITY) \ - -DTWIN_SERIAL -D$(CCID_VERSION) + -DTWIN_SERIAL -D$(CCID_VERSION) -DSIMCLIST_NO_DUMPRESTORE libccidtwin_la_LIBADD = $(PTHREAD_LIBS) +libccidtwin_la_LDFLAGS = -avoid-version -parse_SOURCES = parse.c debug.c -parse_LDADD = libccid.la $(LIBUSB_LIBS) -parse_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) +parse_SOURCES = parse.c debug.c ccid_usb.c $(TOKEN_PARSER) +parse_LDADD = $(LIBUSB_LIBS) +parse_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) -DSIMCLIST_NO_DUMPRESTORE EXTRA_DIST = Info.plist.src create_Info_plist.pl reader.conf.in \ towitoko/COPYING towitoko/README openct/LICENSE \ - convert_version.pl pcscd_ccid.rules + convert_version.pl 92_pcscd_ccid.rules +# We can't use install-exec-local since we want to overwrite the install +# rule. We do not want to _add_ files to install install: $(LIBS_TO_INSTALL) -if UDEV -ifdCapabilities=0x00000001 -INSTALL_UDEV_RULE_FILE=@echo -e "\n\33[01;31m***************\n" ; echo "copy the src/pcscd_ccid.rules file in udev directory (/etc/udev/rules.d/)" ; echo -e "\n***************\n\33[0m" -else -ifdCapabilities=0x00000000 -endif +INSTALL_UDEV_RULE_FILE=@/bin/echo -e "\n\33[01;31m***************\n" ; echo "copy the src/92_pcscd_ccid.rules file in udev directory (/etc/udev/rules.d/)" ; /bin/echo -e "\n***************\n\33[0m" Info.plist: Info.plist.src $(srcdir)/../readers/supported_readers.txt - $(srcdir)/create_Info_plist.pl $(srcdir)/../readers/supported_readers.txt $(srcdir)/Info.plist.src --ifdCapabilities=$(ifdCapabilities) --target=$(CCID_LIB) --version=$(VERSION) --bundle=$(CCID_BUNDLE) $(NOCLASS) > Info.plist - + $(srcdir)/create_Info_plist.pl $(srcdir)/../readers/supported_readers.txt $(srcdir)/Info.plist.src --target=$(CCID_LIB) --version=$(VERSION) $(NOCLASS) > Info.plist + DISTCLEANFILES = tokenparser.c Info.plist install_ccid: libccid.la Info.plist $(mkinstalldirs) $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE)/Contents/$(BUNDLE_HOST)/ cp Info.plist $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE)/Contents/ - cp .libs/$(CCID_LIB) $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE)/Contents/$(BUNDLE_HOST)/$(CCID_LIB).$(VERSION) - ln -fs $(CCID_LIB).$(VERSION) $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE)/Contents/$(BUNDLE_HOST)/$(CCID_LIB) + cp .libs/$(CCID_LIB) $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE)/Contents/$(BUNDLE_HOST)/$(CCID_LIB) $(INSTALL_UDEV_RULE_FILE) install_ccidtwin: libccidtwin.la $(mkinstalldirs) $(DESTDIR)$(ccidtwindir) - cp .libs/$(CCIDTWIN_LIB) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB).$(VERSION) - ln -fs $(CCIDTWIN_LIB).$(VERSION) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) - if [ -e $(DESTDIR)/etc/reader.conf ] ; \ - then \ - echo "Edit existing /etc/reader.conf" ; \ - else \ - $(mkinstalldirs) $(DESTDIR)/etc ; \ - perl -ne "s|TARGET|$(ccidtwindir)/$(CCIDTWIN_LIB)| ; print" $(srcdir)/reader.conf.in > $(DESTDIR)/etc/reader.conf ; \ - fi + cp .libs/$(CCIDTWIN_LIB) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) + $(mkinstalldirs) $(DESTDIR)/$(serialconfdir) ; \ + perl -ne "s|TARGET|$(ccidtwindir)/$(CCIDTWIN_LIB)| ; print" $(srcdir)/reader.conf.in > $(DESTDIR)/$(serialconfdir)/libccidtwin # do not uninstall the serial driver by default # use explicitely 'make uninstall_ccidtwin' -uninstall: uninstall_ccid +uninstall: $(LIBS_TO_UNINSTALL) uninstall_ccid: rm -rf $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE) uninstall_ccidtwin: - rm -f $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB).$(VERSION) + rm -f $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) + rm -f $(DESTDIR)/$(serialconfdir)/libccidtwin diff --git a/ccid/ccid/src/Makefile.in b/ccid/ccid/src/Makefile.in index f239afa..905c54d 100644 --- a/ccid/ccid/src/Makefile.in +++ b/ccid/ccid/src/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,14 +14,60 @@ @SET_MAKE@ -# $Id: Makefile.am 4310 2009-07-06 15:03:37Z rousseau $ +# $Id: Makefile.am 6752 2013-09-16 18:27:04Z rousseau $ DRIVER_DEST="$(DSTROOT)" VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -38,30 +84,54 @@ build_triplet = @build@ host_triplet = @host@ @WITH_LIBUSB_TRUE@am__append_1 = libccid.la @WITH_LIBUSB_TRUE@am__append_2 = install_ccid -@WITH_LIBUSB_TRUE@bin_PROGRAMS = parse$(EXEEXT) -@WITH_TWIN_SERIAL_TRUE@am__append_3 = libccidtwin.la -@WITH_TWIN_SERIAL_TRUE@am__append_4 = install_ccidtwin +@WITH_LIBUSB_TRUE@am__append_3 = uninstall_ccid +@WITH_LIBUSB_TRUE@noinst_PROGRAMS = parse$(EXEEXT) +@WITH_TWIN_SERIAL_TRUE@am__append_4 = libccidtwin.la +@WITH_TWIN_SERIAL_TRUE@am__append_5 = install_ccidtwin +@WITH_TWIN_SERIAL_TRUE@am__append_6 = uninstall_ccidtwin subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - tokenparser.c +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + tokenparser.c $(top_srcdir)/depcomp $(top_srcdir)/ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" -libLTLIBRARIES_INSTALL = $(INSTALL) +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libccid_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ @@ -69,84 +139,144 @@ libccid_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ am__libccid_la_SOURCES_DIST = ccid.c ccid.h ccid_ifdhandler.h \ commands.c commands.h debug.h defs.h ifdhandler.c utils.c \ utils.h ccid_usb.c ccid_usb.h tokenparser.l parser.h strlcpy.c \ - misc.h strlcpycat.h debug.c towitoko/atr.c towitoko/atr.h \ - towitoko/defines.h towitoko/pps.c towitoko/pps.h \ - openct/buffer.c openct/buffer.h openct/checksum.c \ - openct/checksum.h openct/proto-t1.c openct/proto-t1.h + misc.h strlcpycat.h simclist.c simclist.h debug.c \ + towitoko/atr.c towitoko/atr.h towitoko/defines.h \ + towitoko/pps.c towitoko/pps.h openct/buffer.c openct/buffer.h \ + openct/checksum.c openct/checksum.h openct/proto-t1.c \ + openct/proto-t1.h am__objects_1 = libccid_la-ccid.lo libccid_la-commands.lo \ libccid_la-ifdhandler.lo libccid_la-utils.lo am__objects_2 = libccid_la-ccid_usb.lo -am__objects_3 = libccid_la-tokenparser.lo libccid_la-strlcpy.lo +am__objects_3 = libccid_la-tokenparser.lo libccid_la-strlcpy.lo \ + libccid_la-simclist.lo am__objects_4 = libccid_la-debug.lo -am__objects_5 = libccid_la-atr.lo libccid_la-pps.lo \ - libccid_la-buffer.lo libccid_la-checksum.lo \ - libccid_la-proto-t1.lo +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_5 = towitoko/libccid_la-atr.lo towitoko/libccid_la-pps.lo \ + openct/libccid_la-buffer.lo openct/libccid_la-checksum.lo \ + openct/libccid_la-proto-t1.lo am_libccid_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) libccid_la_OBJECTS = $(am_libccid_la_OBJECTS) -libccid_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libccid_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libccid_la_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + $(CFLAGS) $(libccid_la_LDFLAGS) $(LDFLAGS) -o $@ @WITH_LIBUSB_TRUE@am_libccid_la_rpath = -rpath $(libdir) libccidtwin_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libccidtwin_la_SOURCES_DIST = ccid.c ccid.h ccid_ifdhandler.h \ commands.c commands.h debug.h defs.h ifdhandler.c utils.c \ utils.h ccid_serial.c ccid_serial.h tokenparser.l parser.h \ - strlcpy.c misc.h strlcpycat.h debug.c towitoko/atr.c \ - towitoko/atr.h towitoko/defines.h towitoko/pps.c \ - towitoko/pps.h openct/buffer.c openct/buffer.h \ + strlcpy.c misc.h strlcpycat.h simclist.c simclist.h debug.c \ + towitoko/atr.c towitoko/atr.h towitoko/defines.h \ + towitoko/pps.c towitoko/pps.h openct/buffer.c openct/buffer.h \ openct/checksum.c openct/checksum.h openct/proto-t1.c \ openct/proto-t1.h am__objects_6 = libccidtwin_la-ccid.lo libccidtwin_la-commands.lo \ libccidtwin_la-ifdhandler.lo libccidtwin_la-utils.lo am__objects_7 = libccidtwin_la-ccid_serial.lo am__objects_8 = libccidtwin_la-tokenparser.lo \ - libccidtwin_la-strlcpy.lo + libccidtwin_la-strlcpy.lo libccidtwin_la-simclist.lo am__objects_9 = libccidtwin_la-debug.lo -am__objects_10 = libccidtwin_la-atr.lo libccidtwin_la-pps.lo \ - libccidtwin_la-buffer.lo libccidtwin_la-checksum.lo \ - libccidtwin_la-proto-t1.lo +am__objects_10 = towitoko/libccidtwin_la-atr.lo \ + towitoko/libccidtwin_la-pps.lo openct/libccidtwin_la-buffer.lo \ + openct/libccidtwin_la-checksum.lo \ + openct/libccidtwin_la-proto-t1.lo am_libccidtwin_la_OBJECTS = $(am__objects_6) $(am__objects_7) \ $(am__objects_8) $(am__objects_9) $(am__objects_10) libccidtwin_la_OBJECTS = $(am_libccidtwin_la_OBJECTS) -libccidtwin_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libccidtwin_la_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +libccidtwin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libccidtwin_la_CFLAGS) $(CFLAGS) $(libccidtwin_la_LDFLAGS) \ + $(LDFLAGS) -o $@ @WITH_TWIN_SERIAL_TRUE@am_libccidtwin_la_rpath = -rpath $(libdir) -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am_parse_OBJECTS = parse-parse.$(OBJEXT) parse-debug.$(OBJEXT) +PROGRAMS = $(noinst_PROGRAMS) +am__objects_11 = parse-tokenparser.$(OBJEXT) parse-strlcpy.$(OBJEXT) \ + parse-simclist.$(OBJEXT) +am_parse_OBJECTS = parse-parse.$(OBJEXT) parse-debug.$(OBJEXT) \ + parse-ccid_usb.$(OBJEXT) $(am__objects_11) parse_OBJECTS = $(am_parse_OBJECTS) -parse_DEPENDENCIES = libccid.la $(am__DEPENDENCIES_1) -parse_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(parse_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +parse_DEPENDENCIES = $(am__DEPENDENCIES_1) +parse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(parse_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_@AM_V@) +am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap SOURCES = $(libccid_la_SOURCES) $(libccidtwin_la_SOURCES) \ $(parse_SOURCES) DIST_SOURCES = $(am__libccid_la_SOURCES_DIST) \ $(am__libccidtwin_la_SOURCES_DIST) $(parse_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -161,6 +291,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -185,7 +316,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -193,6 +323,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -206,11 +337,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -226,15 +360,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -261,7 +397,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -270,9 +405,11 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ @@ -282,8 +419,9 @@ CCID_BUNDLE = $(bundle) CCID_LIB = libccid.$(DYN_LIB_EXT) CCIDTWIN_LIB = libccidtwin.$(DYN_LIB_EXT) CCID_VERSION = CCID_VERSION=`$(srcdir)/convert_version.pl $(PACKAGE_VERSION)` -lib_LTLIBRARIES = $(am__append_1) $(am__append_3) -LIBS_TO_INSTALL = $(am__append_2) $(am__append_4) +lib_LTLIBRARIES = $(am__append_1) $(am__append_4) +LIBS_TO_INSTALL = $(am__append_2) $(am__append_5) +LIBS_TO_UNINSTALL = $(am__append_3) $(am__append_6) COMMON = ccid.c \ ccid.h \ ccid_ifdhandler.h \ @@ -312,31 +450,33 @@ T1 = towitoko/atr.c \ TOKEN_PARSER = tokenparser.l parser.h \ strlcpy.c \ misc.h \ - strlcpycat.h + strlcpycat.h \ + simclist.c \ + simclist.h PROVIDED_BY_PCSC = debug.c libccid_la_SOURCES = $(COMMON) $(USB) $(TOKEN_PARSER) $(PROVIDED_BY_PCSC) $(T1) libccid_la_LIBADD = $(LEXLIB) $(LIBUSB_LIBS) $(PTHREAD_LIBS) libccid_la_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) $(PTHREAD_CFLAGS) \ - $(SYMBOL_VISIBILITY) -D$(CCID_VERSION) + $(SYMBOL_VISIBILITY) -D$(CCID_VERSION) -DSIMCLIST_NO_DUMPRESTORE +libccid_la_LDFLAGS = -avoid-version libccidtwin_la_SOURCES = $(COMMON) $(SERIAL) $(TOKEN_PARSER) \ $(PROVIDED_BY_PCSC) $(T1) libccidtwin_la_CFLAGS = $(PCSC_CFLAGS) $(PTHREAD_CFLAGS) $(SYMBOL_VISIBILITY) \ - -DTWIN_SERIAL -D$(CCID_VERSION) + -DTWIN_SERIAL -D$(CCID_VERSION) -DSIMCLIST_NO_DUMPRESTORE libccidtwin_la_LIBADD = $(PTHREAD_LIBS) -parse_SOURCES = parse.c debug.c -parse_LDADD = libccid.la $(LIBUSB_LIBS) -parse_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) +libccidtwin_la_LDFLAGS = -avoid-version +parse_SOURCES = parse.c debug.c ccid_usb.c $(TOKEN_PARSER) +parse_LDADD = $(LIBUSB_LIBS) +parse_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) -DSIMCLIST_NO_DUMPRESTORE EXTRA_DIST = Info.plist.src create_Info_plist.pl reader.conf.in \ towitoko/COPYING towitoko/README openct/LICENSE \ - convert_version.pl pcscd_ccid.rules + convert_version.pl 92_pcscd_ccid.rules -@UDEV_FALSE@ifdCapabilities = 0x00000000 -@UDEV_TRUE@ifdCapabilities = 0x00000001 -@UDEV_TRUE@INSTALL_UDEV_RULE_FILE = @echo -e "\n\33[01;31m***************\n" ; echo "copy the src/pcscd_ccid.rules file in udev directory (/etc/udev/rules.d/)" ; echo -e "\n***************\n\33[0m" +INSTALL_UDEV_RULE_FILE = @/bin/echo -e "\n\33[01;31m***************\n" ; echo "copy the src/92_pcscd_ccid.rules file in udev directory (/etc/udev/rules.d/)" ; /bin/echo -e "\n***************\n\33[0m" DISTCLEANFILES = tokenparser.c Info.plist all: all-am @@ -351,9 +491,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -371,387 +511,502 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + list2="$$list2 $$p"; \ else :; fi; \ - done + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libccid.la: $(libccid_la_OBJECTS) $(libccid_la_DEPENDENCIES) - $(libccid_la_LINK) $(am_libccid_la_rpath) $(libccid_la_OBJECTS) $(libccid_la_LIBADD) $(LIBS) -libccidtwin.la: $(libccidtwin_la_OBJECTS) $(libccidtwin_la_DEPENDENCIES) - $(libccidtwin_la_LINK) $(am_libccidtwin_la_rpath) $(libccidtwin_la_OBJECTS) $(libccidtwin_la_LIBADD) $(LIBS) -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -parse$(EXEEXT): $(parse_OBJECTS) $(parse_DEPENDENCIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +towitoko/$(am__dirstamp): + @$(MKDIR_P) towitoko + @: > towitoko/$(am__dirstamp) +towitoko/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) towitoko/$(DEPDIR) + @: > towitoko/$(DEPDIR)/$(am__dirstamp) +towitoko/libccid_la-atr.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +towitoko/libccid_la-pps.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +openct/$(am__dirstamp): + @$(MKDIR_P) openct + @: > openct/$(am__dirstamp) +openct/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) openct/$(DEPDIR) + @: > openct/$(DEPDIR)/$(am__dirstamp) +openct/libccid_la-buffer.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccid_la-checksum.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccid_la-proto-t1.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) + +libccid.la: $(libccid_la_OBJECTS) $(libccid_la_DEPENDENCIES) $(EXTRA_libccid_la_DEPENDENCIES) + $(AM_V_CCLD)$(libccid_la_LINK) $(am_libccid_la_rpath) $(libccid_la_OBJECTS) $(libccid_la_LIBADD) $(LIBS) +towitoko/libccidtwin_la-atr.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +towitoko/libccidtwin_la-pps.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +openct/libccidtwin_la-buffer.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccidtwin_la-checksum.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccidtwin_la-proto-t1.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) + +libccidtwin.la: $(libccidtwin_la_OBJECTS) $(libccidtwin_la_DEPENDENCIES) $(EXTRA_libccidtwin_la_DEPENDENCIES) + $(AM_V_CCLD)$(libccidtwin_la_LINK) $(am_libccidtwin_la_rpath) $(libccidtwin_la_OBJECTS) $(libccidtwin_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +parse$(EXEEXT): $(parse_OBJECTS) $(parse_DEPENDENCIES) $(EXTRA_parse_DEPENDENCIES) @rm -f parse$(EXEEXT) - $(parse_LINK) $(parse_OBJECTS) $(parse_LDADD) $(LIBS) + $(AM_V_CCLD)$(parse_LINK) $(parse_OBJECTS) $(parse_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f openct/*.$(OBJEXT) + -rm -f openct/*.lo + -rm -f towitoko/*.$(OBJEXT) + -rm -f towitoko/*.lo distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-atr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-ccid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-ccid_usb.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-checksum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-commands.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-ifdhandler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-pps.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-simclist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-strlcpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-tokenparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-utils.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-atr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-ccid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-ccid_serial.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-checksum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-commands.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-ifdhandler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-pps.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-simclist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-strlcpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-tokenparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-ccid_usb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-simclist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-strlcpy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-tokenparser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccid_la-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccid_la-checksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccid_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccidtwin_la-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccidtwin_la-checksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccidtwin_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccid_la-atr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccid_la-pps.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccidtwin_la-atr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccidtwin_la-pps.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libccid_la-ccid.lo: ccid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid.Tpo -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-ccid.Tpo $(DEPDIR)/libccid_la-ccid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid.c' object='libccid_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid.Tpo -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-ccid.Tpo $(DEPDIR)/libccid_la-ccid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid.c' object='libccid_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c libccid_la-commands.lo: commands.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-commands.lo -MD -MP -MF $(DEPDIR)/libccid_la-commands.Tpo -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-commands.Tpo $(DEPDIR)/libccid_la-commands.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='commands.c' object='libccid_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-commands.lo -MD -MP -MF $(DEPDIR)/libccid_la-commands.Tpo -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-commands.Tpo $(DEPDIR)/libccid_la-commands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='commands.c' object='libccid_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c libccid_la-ifdhandler.lo: ifdhandler.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccid_la-ifdhandler.Tpo -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-ifdhandler.Tpo $(DEPDIR)/libccid_la-ifdhandler.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ifdhandler.c' object='libccid_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccid_la-ifdhandler.Tpo -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-ifdhandler.Tpo $(DEPDIR)/libccid_la-ifdhandler.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ifdhandler.c' object='libccid_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c libccid_la-utils.lo: utils.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-utils.lo -MD -MP -MF $(DEPDIR)/libccid_la-utils.Tpo -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-utils.Tpo $(DEPDIR)/libccid_la-utils.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils.c' object='libccid_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-utils.lo -MD -MP -MF $(DEPDIR)/libccid_la-utils.Tpo -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-utils.Tpo $(DEPDIR)/libccid_la-utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libccid_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c libccid_la-ccid_usb.lo: ccid_usb.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid_usb.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid_usb.Tpo -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-ccid_usb.Tpo $(DEPDIR)/libccid_la-ccid_usb.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid_usb.c' object='libccid_la-ccid_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid_usb.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid_usb.Tpo -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-ccid_usb.Tpo $(DEPDIR)/libccid_la-ccid_usb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_usb.c' object='libccid_la-ccid_usb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c libccid_la-tokenparser.lo: tokenparser.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccid_la-tokenparser.Tpo -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-tokenparser.Tpo $(DEPDIR)/libccid_la-tokenparser.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tokenparser.c' object='libccid_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccid_la-tokenparser.Tpo -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-tokenparser.Tpo $(DEPDIR)/libccid_la-tokenparser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='libccid_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c libccid_la-strlcpy.lo: strlcpy.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccid_la-strlcpy.Tpo -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-strlcpy.Tpo $(DEPDIR)/libccid_la-strlcpy.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strlcpy.c' object='libccid_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccid_la-strlcpy.Tpo -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-strlcpy.Tpo $(DEPDIR)/libccid_la-strlcpy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='libccid_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c + +libccid_la-simclist.lo: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-simclist.lo -MD -MP -MF $(DEPDIR)/libccid_la-simclist.Tpo -c -o libccid_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-simclist.Tpo $(DEPDIR)/libccid_la-simclist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='libccid_la-simclist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c libccid_la-debug.lo: debug.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-debug.lo -MD -MP -MF $(DEPDIR)/libccid_la-debug.Tpo -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-debug.Tpo $(DEPDIR)/libccid_la-debug.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='libccid_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-debug.lo -MD -MP -MF $(DEPDIR)/libccid_la-debug.Tpo -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-debug.Tpo $(DEPDIR)/libccid_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='libccid_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -libccid_la-atr.lo: towitoko/atr.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-atr.lo -MD -MP -MF $(DEPDIR)/libccid_la-atr.Tpo -c -o libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-atr.Tpo $(DEPDIR)/libccid_la-atr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/atr.c' object='libccid_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccid_la-atr.lo: towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT towitoko/libccid_la-atr.lo -MD -MP -MF towitoko/$(DEPDIR)/libccid_la-atr.Tpo -c -o towitoko/libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccid_la-atr.Tpo towitoko/$(DEPDIR)/libccid_la-atr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/atr.c' object='towitoko/libccid_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -libccid_la-pps.lo: towitoko/pps.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-pps.lo -MD -MP -MF $(DEPDIR)/libccid_la-pps.Tpo -c -o libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-pps.Tpo $(DEPDIR)/libccid_la-pps.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/pps.c' object='libccid_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccid_la-pps.lo: towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT towitoko/libccid_la-pps.lo -MD -MP -MF towitoko/$(DEPDIR)/libccid_la-pps.Tpo -c -o towitoko/libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccid_la-pps.Tpo towitoko/$(DEPDIR)/libccid_la-pps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/pps.c' object='towitoko/libccid_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -libccid_la-buffer.lo: openct/buffer.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-buffer.lo -MD -MP -MF $(DEPDIR)/libccid_la-buffer.Tpo -c -o libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-buffer.Tpo $(DEPDIR)/libccid_la-buffer.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/buffer.c' object='libccid_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccid_la-buffer.lo: openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT openct/libccid_la-buffer.lo -MD -MP -MF openct/$(DEPDIR)/libccid_la-buffer.Tpo -c -o openct/libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccid_la-buffer.Tpo openct/$(DEPDIR)/libccid_la-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/buffer.c' object='openct/libccid_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o openct/libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -libccid_la-checksum.lo: openct/checksum.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-checksum.lo -MD -MP -MF $(DEPDIR)/libccid_la-checksum.Tpo -c -o libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-checksum.Tpo $(DEPDIR)/libccid_la-checksum.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/checksum.c' object='libccid_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccid_la-checksum.lo: openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT openct/libccid_la-checksum.lo -MD -MP -MF openct/$(DEPDIR)/libccid_la-checksum.Tpo -c -o openct/libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccid_la-checksum.Tpo openct/$(DEPDIR)/libccid_la-checksum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/checksum.c' object='openct/libccid_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o openct/libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -libccid_la-proto-t1.lo: openct/proto-t1.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-proto-t1.lo -MD -MP -MF $(DEPDIR)/libccid_la-proto-t1.Tpo -c -o libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-proto-t1.Tpo $(DEPDIR)/libccid_la-proto-t1.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/proto-t1.c' object='libccid_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccid_la-proto-t1.lo: openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT openct/libccid_la-proto-t1.lo -MD -MP -MF openct/$(DEPDIR)/libccid_la-proto-t1.Tpo -c -o openct/libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccid_la-proto-t1.Tpo openct/$(DEPDIR)/libccid_la-proto-t1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/proto-t1.c' object='openct/libccid_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o openct/libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c libccidtwin_la-ccid.lo: ccid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid.Tpo -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-ccid.Tpo $(DEPDIR)/libccidtwin_la-ccid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid.c' object='libccidtwin_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid.Tpo -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-ccid.Tpo $(DEPDIR)/libccidtwin_la-ccid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid.c' object='libccidtwin_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c libccidtwin_la-commands.lo: commands.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-commands.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-commands.Tpo -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-commands.Tpo $(DEPDIR)/libccidtwin_la-commands.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='commands.c' object='libccidtwin_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-commands.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-commands.Tpo -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-commands.Tpo $(DEPDIR)/libccidtwin_la-commands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='commands.c' object='libccidtwin_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c libccidtwin_la-ifdhandler.lo: ifdhandler.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo $(DEPDIR)/libccidtwin_la-ifdhandler.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ifdhandler.c' object='libccidtwin_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo $(DEPDIR)/libccidtwin_la-ifdhandler.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ifdhandler.c' object='libccidtwin_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c libccidtwin_la-utils.lo: utils.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-utils.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-utils.Tpo -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-utils.Tpo $(DEPDIR)/libccidtwin_la-utils.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils.c' object='libccidtwin_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-utils.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-utils.Tpo -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-utils.Tpo $(DEPDIR)/libccidtwin_la-utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libccidtwin_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c libccidtwin_la-ccid_serial.lo: ccid_serial.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid_serial.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo $(DEPDIR)/libccidtwin_la-ccid_serial.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid_serial.c' object='libccidtwin_la-ccid_serial.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid_serial.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo $(DEPDIR)/libccidtwin_la-ccid_serial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_serial.c' object='libccidtwin_la-ccid_serial.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c libccidtwin_la-tokenparser.lo: tokenparser.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-tokenparser.Tpo -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-tokenparser.Tpo $(DEPDIR)/libccidtwin_la-tokenparser.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tokenparser.c' object='libccidtwin_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-tokenparser.Tpo -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-tokenparser.Tpo $(DEPDIR)/libccidtwin_la-tokenparser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='libccidtwin_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c libccidtwin_la-strlcpy.lo: strlcpy.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-strlcpy.Tpo -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-strlcpy.Tpo $(DEPDIR)/libccidtwin_la-strlcpy.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strlcpy.c' object='libccidtwin_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-strlcpy.Tpo -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-strlcpy.Tpo $(DEPDIR)/libccidtwin_la-strlcpy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='libccidtwin_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c + +libccidtwin_la-simclist.lo: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-simclist.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-simclist.Tpo -c -o libccidtwin_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-simclist.Tpo $(DEPDIR)/libccidtwin_la-simclist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='libccidtwin_la-simclist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c libccidtwin_la-debug.lo: debug.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-debug.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-debug.Tpo -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-debug.Tpo $(DEPDIR)/libccidtwin_la-debug.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='libccidtwin_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-debug.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-debug.Tpo -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-debug.Tpo $(DEPDIR)/libccidtwin_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='libccidtwin_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -libccidtwin_la-atr.lo: towitoko/atr.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-atr.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-atr.Tpo -c -o libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-atr.Tpo $(DEPDIR)/libccidtwin_la-atr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/atr.c' object='libccidtwin_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccidtwin_la-atr.lo: towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT towitoko/libccidtwin_la-atr.lo -MD -MP -MF towitoko/$(DEPDIR)/libccidtwin_la-atr.Tpo -c -o towitoko/libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccidtwin_la-atr.Tpo towitoko/$(DEPDIR)/libccidtwin_la-atr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/atr.c' object='towitoko/libccidtwin_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -libccidtwin_la-pps.lo: towitoko/pps.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-pps.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-pps.Tpo -c -o libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-pps.Tpo $(DEPDIR)/libccidtwin_la-pps.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/pps.c' object='libccidtwin_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccidtwin_la-pps.lo: towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT towitoko/libccidtwin_la-pps.lo -MD -MP -MF towitoko/$(DEPDIR)/libccidtwin_la-pps.Tpo -c -o towitoko/libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccidtwin_la-pps.Tpo towitoko/$(DEPDIR)/libccidtwin_la-pps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/pps.c' object='towitoko/libccidtwin_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -libccidtwin_la-buffer.lo: openct/buffer.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-buffer.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-buffer.Tpo -c -o libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-buffer.Tpo $(DEPDIR)/libccidtwin_la-buffer.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/buffer.c' object='libccidtwin_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccidtwin_la-buffer.lo: openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT openct/libccidtwin_la-buffer.lo -MD -MP -MF openct/$(DEPDIR)/libccidtwin_la-buffer.Tpo -c -o openct/libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccidtwin_la-buffer.Tpo openct/$(DEPDIR)/libccidtwin_la-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/buffer.c' object='openct/libccidtwin_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o openct/libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -libccidtwin_la-checksum.lo: openct/checksum.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-checksum.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-checksum.Tpo -c -o libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-checksum.Tpo $(DEPDIR)/libccidtwin_la-checksum.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/checksum.c' object='libccidtwin_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccidtwin_la-checksum.lo: openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT openct/libccidtwin_la-checksum.lo -MD -MP -MF openct/$(DEPDIR)/libccidtwin_la-checksum.Tpo -c -o openct/libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccidtwin_la-checksum.Tpo openct/$(DEPDIR)/libccidtwin_la-checksum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/checksum.c' object='openct/libccidtwin_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o openct/libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -libccidtwin_la-proto-t1.lo: openct/proto-t1.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-proto-t1.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-proto-t1.Tpo -c -o libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-proto-t1.Tpo $(DEPDIR)/libccidtwin_la-proto-t1.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/proto-t1.c' object='libccidtwin_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccidtwin_la-proto-t1.lo: openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT openct/libccidtwin_la-proto-t1.lo -MD -MP -MF openct/$(DEPDIR)/libccidtwin_la-proto-t1.Tpo -c -o openct/libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccidtwin_la-proto-t1.Tpo openct/$(DEPDIR)/libccidtwin_la-proto-t1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/proto-t1.c' object='openct/libccidtwin_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o openct/libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c parse-parse.o: parse.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.o -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse.c' object='parse-parse.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.o -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse.c' object='parse-parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c parse-parse.obj: parse.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.obj -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse.c' object='parse-parse.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.obj -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse.c' object='parse-parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` parse-debug.o: debug.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.o -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='parse-debug.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.o -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='parse-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c parse-debug.obj: debug.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.obj -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='parse-debug.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.obj -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='parse-debug.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` + +parse-ccid_usb.o: ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-ccid_usb.o -MD -MP -MF $(DEPDIR)/parse-ccid_usb.Tpo -c -o parse-ccid_usb.o `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-ccid_usb.Tpo $(DEPDIR)/parse-ccid_usb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_usb.c' object='parse-ccid_usb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-ccid_usb.o `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c + +parse-ccid_usb.obj: ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-ccid_usb.obj -MD -MP -MF $(DEPDIR)/parse-ccid_usb.Tpo -c -o parse-ccid_usb.obj `if test -f 'ccid_usb.c'; then $(CYGPATH_W) 'ccid_usb.c'; else $(CYGPATH_W) '$(srcdir)/ccid_usb.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-ccid_usb.Tpo $(DEPDIR)/parse-ccid_usb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_usb.c' object='parse-ccid_usb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-ccid_usb.obj `if test -f 'ccid_usb.c'; then $(CYGPATH_W) 'ccid_usb.c'; else $(CYGPATH_W) '$(srcdir)/ccid_usb.c'; fi` + +parse-tokenparser.o: tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-tokenparser.o -MD -MP -MF $(DEPDIR)/parse-tokenparser.Tpo -c -o parse-tokenparser.o `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-tokenparser.Tpo $(DEPDIR)/parse-tokenparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='parse-tokenparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-tokenparser.o `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c + +parse-tokenparser.obj: tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-tokenparser.obj -MD -MP -MF $(DEPDIR)/parse-tokenparser.Tpo -c -o parse-tokenparser.obj `if test -f 'tokenparser.c'; then $(CYGPATH_W) 'tokenparser.c'; else $(CYGPATH_W) '$(srcdir)/tokenparser.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-tokenparser.Tpo $(DEPDIR)/parse-tokenparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='parse-tokenparser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-tokenparser.obj `if test -f 'tokenparser.c'; then $(CYGPATH_W) 'tokenparser.c'; else $(CYGPATH_W) '$(srcdir)/tokenparser.c'; fi` + +parse-strlcpy.o: strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-strlcpy.o -MD -MP -MF $(DEPDIR)/parse-strlcpy.Tpo -c -o parse-strlcpy.o `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-strlcpy.Tpo $(DEPDIR)/parse-strlcpy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='parse-strlcpy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-strlcpy.o `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c + +parse-strlcpy.obj: strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-strlcpy.obj -MD -MP -MF $(DEPDIR)/parse-strlcpy.Tpo -c -o parse-strlcpy.obj `if test -f 'strlcpy.c'; then $(CYGPATH_W) 'strlcpy.c'; else $(CYGPATH_W) '$(srcdir)/strlcpy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-strlcpy.Tpo $(DEPDIR)/parse-strlcpy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='parse-strlcpy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-strlcpy.obj `if test -f 'strlcpy.c'; then $(CYGPATH_W) 'strlcpy.c'; else $(CYGPATH_W) '$(srcdir)/strlcpy.c'; fi` + +parse-simclist.o: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-simclist.o -MD -MP -MF $(DEPDIR)/parse-simclist.Tpo -c -o parse-simclist.o `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-simclist.Tpo $(DEPDIR)/parse-simclist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='parse-simclist.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-simclist.o `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c + +parse-simclist.obj: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-simclist.obj -MD -MP -MF $(DEPDIR)/parse-simclist.Tpo -c -o parse-simclist.obj `if test -f 'simclist.c'; then $(CYGPATH_W) 'simclist.c'; else $(CYGPATH_W) '$(srcdir)/simclist.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-simclist.Tpo $(DEPDIR)/parse-simclist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='parse-simclist.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-simclist.obj `if test -f 'simclist.c'; then $(CYGPATH_W) 'simclist.c'; else $(CYGPATH_W) '$(srcdir)/simclist.c'; fi` .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs + -rm -rf openct/.libs openct/_libs + -rm -rf towitoko/.libs towitoko/_libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -772,23 +1027,25 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) -install-binPROGRAMS: install-libLTLIBRARIES - installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \ + for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install-exec: install-exec-am @@ -799,16 +1056,26 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f openct/$(DEPDIR)/$(am__dirstamp) + -rm -f openct/$(am__dirstamp) + -rm -f towitoko/$(DEPDIR)/$(am__dirstamp) + -rm -f towitoko/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -817,11 +1084,11 @@ maintainer-clean-generic: -rm -f tokenparser.c clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool mostlyclean-am +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) openct/$(DEPDIR) towitoko/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -832,6 +1099,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -840,22 +1109,32 @@ install-data-am: install-dvi: install-dvi-am -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) openct/$(DEPDIR) towitoko/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -872,15 +1151,15 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES +uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool ctags \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ @@ -888,14 +1167,16 @@ uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-libLTLIBRARIES + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-libLTLIBRARIES +# We can't use install-exec-local since we want to overwrite the install +# rule. We do not want to _add_ files to install install: $(LIBS_TO_INSTALL) Info.plist: Info.plist.src $(srcdir)/../readers/supported_readers.txt - $(srcdir)/create_Info_plist.pl $(srcdir)/../readers/supported_readers.txt $(srcdir)/Info.plist.src --ifdCapabilities=$(ifdCapabilities) --target=$(CCID_LIB) --version=$(VERSION) --bundle=$(CCID_BUNDLE) $(NOCLASS) > Info.plist + $(srcdir)/create_Info_plist.pl $(srcdir)/../readers/supported_readers.txt $(srcdir)/Info.plist.src --target=$(CCID_LIB) --version=$(VERSION) $(NOCLASS) > Info.plist install_ccid: libccid.la Info.plist $(mkinstalldirs) $(DRIVER_DEST)$(usbdropdir)/$(CCID_BUNDLE)/Contents/$(BUNDLE_HOST)/ @@ -906,25 +1187,21 @@ install_ccid: libccid.la Info.plist install_ccidtwin: libccidtwin.la $(mkinstalldirs) $(DESTDIR)$(ccidtwindir) - cp .libs/$(CCIDTWIN_LIB) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB).$(VERSION) - ln -fs $(CCIDTWIN_LIB).$(VERSION) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) - if [ -e $(DESTDIR)/etc/reader.conf ] ; \ - then \ - echo "Edit existing /etc/reader.conf" ; \ - else \ - $(mkinstalldirs) $(DESTDIR)/etc ; \ - perl -ne "s|TARGET|$(ccidtwindir)/$(CCIDTWIN_LIB)| ; print" $(srcdir)/reader.conf.in > $(DESTDIR)/etc/reader.conf ; \ - fi + cp .libs/$(CCIDTWIN_LIB) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) + $(mkinstalldirs) $(DESTDIR)/$(serialconfdir) ; \ + perl -ne "s|TARGET|$(ccidtwindir)/$(CCIDTWIN_LIB)| ; print" $(srcdir)/reader.conf.in > $(DESTDIR)/$(serialconfdir)/libccidtwin # do not uninstall the serial driver by default # use explicitely 'make uninstall_ccidtwin' -uninstall: uninstall_ccid +uninstall: $(LIBS_TO_UNINSTALL) uninstall_ccid: rm -rf $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE) uninstall_ccidtwin: - rm -f $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB).$(VERSION) + rm -f $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) + rm -f $(DESTDIR)/$(serialconfdir)/libccidtwin + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/ccid/ccid/src/Makefile.in.orig b/ccid/ccid/src/Makefile.in.orig index d2ca621..80b7759 100644 --- a/ccid/ccid/src/Makefile.in.orig +++ b/ccid/ccid/src/Makefile.in.orig @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,14 +14,60 @@ @SET_MAKE@ -# $Id: Makefile.am 4310 2009-07-06 15:03:37Z rousseau $ +# $Id: Makefile.am 6752 2013-09-16 18:27:04Z rousseau $ DRIVER_DEST="$(DSTROOT)" VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -38,30 +84,54 @@ build_triplet = @build@ host_triplet = @host@ @WITH_LIBUSB_TRUE@am__append_1 = libccid.la @WITH_LIBUSB_TRUE@am__append_2 = install_ccid -@WITH_LIBUSB_TRUE@bin_PROGRAMS = parse$(EXEEXT) -@WITH_TWIN_SERIAL_TRUE@am__append_3 = libccidtwin.la -@WITH_TWIN_SERIAL_TRUE@am__append_4 = install_ccidtwin +@WITH_LIBUSB_TRUE@am__append_3 = uninstall_ccid +@WITH_LIBUSB_TRUE@noinst_PROGRAMS = parse$(EXEEXT) +@WITH_TWIN_SERIAL_TRUE@am__append_4 = libccidtwin.la +@WITH_TWIN_SERIAL_TRUE@am__append_5 = install_ccidtwin +@WITH_TWIN_SERIAL_TRUE@am__append_6 = uninstall_ccidtwin subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - tokenparser.c +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + tokenparser.c $(top_srcdir)/depcomp $(top_srcdir)/ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" -libLTLIBRARIES_INSTALL = $(INSTALL) +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libccid_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ @@ -69,84 +139,144 @@ libccid_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ am__libccid_la_SOURCES_DIST = ccid.c ccid.h ccid_ifdhandler.h \ commands.c commands.h debug.h defs.h ifdhandler.c utils.c \ utils.h ccid_usb.c ccid_usb.h tokenparser.l parser.h strlcpy.c \ - misc.h strlcpycat.h debug.c towitoko/atr.c towitoko/atr.h \ - towitoko/defines.h towitoko/pps.c towitoko/pps.h \ - openct/buffer.c openct/buffer.h openct/checksum.c \ - openct/checksum.h openct/proto-t1.c openct/proto-t1.h + misc.h strlcpycat.h simclist.c simclist.h debug.c \ + towitoko/atr.c towitoko/atr.h towitoko/defines.h \ + towitoko/pps.c towitoko/pps.h openct/buffer.c openct/buffer.h \ + openct/checksum.c openct/checksum.h openct/proto-t1.c \ + openct/proto-t1.h am__objects_1 = libccid_la-ccid.lo libccid_la-commands.lo \ libccid_la-ifdhandler.lo libccid_la-utils.lo am__objects_2 = libccid_la-ccid_usb.lo -am__objects_3 = libccid_la-tokenparser.lo libccid_la-strlcpy.lo +am__objects_3 = libccid_la-tokenparser.lo libccid_la-strlcpy.lo \ + libccid_la-simclist.lo @WITHOUT_PCSC_TRUE@am__objects_4 = libccid_la-debug.lo -am__objects_5 = libccid_la-atr.lo libccid_la-pps.lo \ - libccid_la-buffer.lo libccid_la-checksum.lo \ - libccid_la-proto-t1.lo +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_5 = towitoko/libccid_la-atr.lo towitoko/libccid_la-pps.lo \ + openct/libccid_la-buffer.lo openct/libccid_la-checksum.lo \ + openct/libccid_la-proto-t1.lo am_libccid_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) libccid_la_OBJECTS = $(am_libccid_la_OBJECTS) -libccid_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libccid_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libccid_la_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + $(CFLAGS) $(libccid_la_LDFLAGS) $(LDFLAGS) -o $@ @WITH_LIBUSB_TRUE@am_libccid_la_rpath = -rpath $(libdir) libccidtwin_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libccidtwin_la_SOURCES_DIST = ccid.c ccid.h ccid_ifdhandler.h \ commands.c commands.h debug.h defs.h ifdhandler.c utils.c \ utils.h ccid_serial.c ccid_serial.h tokenparser.l parser.h \ - strlcpy.c misc.h strlcpycat.h debug.c towitoko/atr.c \ - towitoko/atr.h towitoko/defines.h towitoko/pps.c \ - towitoko/pps.h openct/buffer.c openct/buffer.h \ + strlcpy.c misc.h strlcpycat.h simclist.c simclist.h debug.c \ + towitoko/atr.c towitoko/atr.h towitoko/defines.h \ + towitoko/pps.c towitoko/pps.h openct/buffer.c openct/buffer.h \ openct/checksum.c openct/checksum.h openct/proto-t1.c \ openct/proto-t1.h am__objects_6 = libccidtwin_la-ccid.lo libccidtwin_la-commands.lo \ libccidtwin_la-ifdhandler.lo libccidtwin_la-utils.lo am__objects_7 = libccidtwin_la-ccid_serial.lo am__objects_8 = libccidtwin_la-tokenparser.lo \ - libccidtwin_la-strlcpy.lo + libccidtwin_la-strlcpy.lo libccidtwin_la-simclist.lo @WITHOUT_PCSC_TRUE@am__objects_9 = libccidtwin_la-debug.lo -am__objects_10 = libccidtwin_la-atr.lo libccidtwin_la-pps.lo \ - libccidtwin_la-buffer.lo libccidtwin_la-checksum.lo \ - libccidtwin_la-proto-t1.lo +am__objects_10 = towitoko/libccidtwin_la-atr.lo \ + towitoko/libccidtwin_la-pps.lo openct/libccidtwin_la-buffer.lo \ + openct/libccidtwin_la-checksum.lo \ + openct/libccidtwin_la-proto-t1.lo am_libccidtwin_la_OBJECTS = $(am__objects_6) $(am__objects_7) \ $(am__objects_8) $(am__objects_9) $(am__objects_10) libccidtwin_la_OBJECTS = $(am_libccidtwin_la_OBJECTS) -libccidtwin_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libccidtwin_la_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +libccidtwin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libccidtwin_la_CFLAGS) $(CFLAGS) $(libccidtwin_la_LDFLAGS) \ + $(LDFLAGS) -o $@ @WITH_TWIN_SERIAL_TRUE@am_libccidtwin_la_rpath = -rpath $(libdir) -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am_parse_OBJECTS = parse-parse.$(OBJEXT) parse-debug.$(OBJEXT) +PROGRAMS = $(noinst_PROGRAMS) +am__objects_11 = parse-tokenparser.$(OBJEXT) parse-strlcpy.$(OBJEXT) \ + parse-simclist.$(OBJEXT) +am_parse_OBJECTS = parse-parse.$(OBJEXT) parse-debug.$(OBJEXT) \ + parse-ccid_usb.$(OBJEXT) $(am__objects_11) parse_OBJECTS = $(am_parse_OBJECTS) -parse_DEPENDENCIES = libccid.la $(am__DEPENDENCIES_1) -parse_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(parse_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +parse_DEPENDENCIES = $(am__DEPENDENCIES_1) +parse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(parse_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_@AM_V@) +am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap SOURCES = $(libccid_la_SOURCES) $(libccidtwin_la_SOURCES) \ $(parse_SOURCES) DIST_SOURCES = $(am__libccid_la_SOURCES_DIST) \ $(am__libccidtwin_la_SOURCES_DIST) $(parse_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -161,6 +291,7 @@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LIB_EXT = @DYN_LIB_EXT@ @@ -185,7 +316,6 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ -LIBUSBCONFIG = @LIBUSBCONFIG@ LIBUSB_CFLAGS = @LIBUSB_CFLAGS@ LIBUSB_LIBS = @LIBUSB_LIBS@ LIPO = @LIPO@ @@ -193,6 +323,7 @@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ @@ -206,11 +337,14 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCSC_CFLAGS = @PCSC_CFLAGS@ PCSC_LIBS = @PCSC_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -226,15 +360,17 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ +bindir_exp = @bindir_exp@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ @@ -261,7 +397,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -270,9 +405,11 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ +serialconfdir = @serialconfdir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +sysconfdir_exp = @sysconfdir_exp@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ @@ -282,8 +419,9 @@ CCID_BUNDLE = $(bundle) CCID_LIB = libccid.$(DYN_LIB_EXT) CCIDTWIN_LIB = libccidtwin.$(DYN_LIB_EXT) CCID_VERSION = CCID_VERSION=`$(srcdir)/convert_version.pl $(PACKAGE_VERSION)` -lib_LTLIBRARIES = $(am__append_1) $(am__append_3) -LIBS_TO_INSTALL = $(am__append_2) $(am__append_4) +lib_LTLIBRARIES = $(am__append_1) $(am__append_4) +LIBS_TO_INSTALL = $(am__append_2) $(am__append_5) +LIBS_TO_UNINSTALL = $(am__append_3) $(am__append_6) COMMON = ccid.c \ ccid.h \ ccid_ifdhandler.h \ @@ -312,31 +450,33 @@ T1 = towitoko/atr.c \ TOKEN_PARSER = tokenparser.l parser.h \ strlcpy.c \ misc.h \ - strlcpycat.h + strlcpycat.h \ + simclist.c \ + simclist.h @WITHOUT_PCSC_TRUE@PROVIDED_BY_PCSC = debug.c libccid_la_SOURCES = $(COMMON) $(USB) $(TOKEN_PARSER) $(PROVIDED_BY_PCSC) $(T1) libccid_la_LIBADD = $(LEXLIB) $(LIBUSB_LIBS) $(PTHREAD_LIBS) libccid_la_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) $(PTHREAD_CFLAGS) \ - $(SYMBOL_VISIBILITY) -D$(CCID_VERSION) + $(SYMBOL_VISIBILITY) -D$(CCID_VERSION) -DSIMCLIST_NO_DUMPRESTORE +libccid_la_LDFLAGS = -avoid-version libccidtwin_la_SOURCES = $(COMMON) $(SERIAL) $(TOKEN_PARSER) \ $(PROVIDED_BY_PCSC) $(T1) libccidtwin_la_CFLAGS = $(PCSC_CFLAGS) $(PTHREAD_CFLAGS) $(SYMBOL_VISIBILITY) \ - -DTWIN_SERIAL -D$(CCID_VERSION) + -DTWIN_SERIAL -D$(CCID_VERSION) -DSIMCLIST_NO_DUMPRESTORE libccidtwin_la_LIBADD = $(PTHREAD_LIBS) -parse_SOURCES = parse.c debug.c -parse_LDADD = libccid.la $(LIBUSB_LIBS) -parse_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) +libccidtwin_la_LDFLAGS = -avoid-version +parse_SOURCES = parse.c debug.c ccid_usb.c $(TOKEN_PARSER) +parse_LDADD = $(LIBUSB_LIBS) +parse_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) -DSIMCLIST_NO_DUMPRESTORE EXTRA_DIST = Info.plist.src create_Info_plist.pl reader.conf.in \ towitoko/COPYING towitoko/README openct/LICENSE \ - convert_version.pl pcscd_ccid.rules + convert_version.pl 92_pcscd_ccid.rules -@UDEV_FALSE@ifdCapabilities = 0x00000000 -@UDEV_TRUE@ifdCapabilities = 0x00000001 -@UDEV_TRUE@INSTALL_UDEV_RULE_FILE = @echo -e "\n\33[01;31m***************\n" ; echo "copy the src/pcscd_ccid.rules file in udev directory (/etc/udev/rules.d/)" ; echo -e "\n***************\n\33[0m" +INSTALL_UDEV_RULE_FILE = @/bin/echo -e "\n\33[01;31m***************\n" ; echo "copy the src/92_pcscd_ccid.rules file in udev directory (/etc/udev/rules.d/)" ; /bin/echo -e "\n***************\n\33[0m" DISTCLEANFILES = tokenparser.c Info.plist all: all-am @@ -351,9 +491,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -371,387 +511,502 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + list2="$$list2 $$p"; \ else :; fi; \ - done + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libccid.la: $(libccid_la_OBJECTS) $(libccid_la_DEPENDENCIES) - $(libccid_la_LINK) $(am_libccid_la_rpath) $(libccid_la_OBJECTS) $(libccid_la_LIBADD) $(LIBS) -libccidtwin.la: $(libccidtwin_la_OBJECTS) $(libccidtwin_la_DEPENDENCIES) - $(libccidtwin_la_LINK) $(am_libccidtwin_la_rpath) $(libccidtwin_la_OBJECTS) $(libccidtwin_la_LIBADD) $(LIBS) -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -parse$(EXEEXT): $(parse_OBJECTS) $(parse_DEPENDENCIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +towitoko/$(am__dirstamp): + @$(MKDIR_P) towitoko + @: > towitoko/$(am__dirstamp) +towitoko/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) towitoko/$(DEPDIR) + @: > towitoko/$(DEPDIR)/$(am__dirstamp) +towitoko/libccid_la-atr.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +towitoko/libccid_la-pps.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +openct/$(am__dirstamp): + @$(MKDIR_P) openct + @: > openct/$(am__dirstamp) +openct/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) openct/$(DEPDIR) + @: > openct/$(DEPDIR)/$(am__dirstamp) +openct/libccid_la-buffer.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccid_la-checksum.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccid_la-proto-t1.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) + +libccid.la: $(libccid_la_OBJECTS) $(libccid_la_DEPENDENCIES) $(EXTRA_libccid_la_DEPENDENCIES) + $(AM_V_CCLD)$(libccid_la_LINK) $(am_libccid_la_rpath) $(libccid_la_OBJECTS) $(libccid_la_LIBADD) $(LIBS) +towitoko/libccidtwin_la-atr.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +towitoko/libccidtwin_la-pps.lo: towitoko/$(am__dirstamp) \ + towitoko/$(DEPDIR)/$(am__dirstamp) +openct/libccidtwin_la-buffer.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccidtwin_la-checksum.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) +openct/libccidtwin_la-proto-t1.lo: openct/$(am__dirstamp) \ + openct/$(DEPDIR)/$(am__dirstamp) + +libccidtwin.la: $(libccidtwin_la_OBJECTS) $(libccidtwin_la_DEPENDENCIES) $(EXTRA_libccidtwin_la_DEPENDENCIES) + $(AM_V_CCLD)$(libccidtwin_la_LINK) $(am_libccidtwin_la_rpath) $(libccidtwin_la_OBJECTS) $(libccidtwin_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +parse$(EXEEXT): $(parse_OBJECTS) $(parse_DEPENDENCIES) $(EXTRA_parse_DEPENDENCIES) @rm -f parse$(EXEEXT) - $(parse_LINK) $(parse_OBJECTS) $(parse_LDADD) $(LIBS) + $(AM_V_CCLD)$(parse_LINK) $(parse_OBJECTS) $(parse_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f openct/*.$(OBJEXT) + -rm -f openct/*.lo + -rm -f towitoko/*.$(OBJEXT) + -rm -f towitoko/*.lo distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-atr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-ccid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-ccid_usb.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-checksum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-commands.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-ifdhandler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-pps.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-simclist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-strlcpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-tokenparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccid_la-utils.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-atr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-ccid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-ccid_serial.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-checksum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-commands.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-ifdhandler.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-pps.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-simclist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-strlcpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-tokenparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libccidtwin_la-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-ccid_usb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-simclist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-strlcpy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-tokenparser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccid_la-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccid_la-checksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccid_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccidtwin_la-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccidtwin_la-checksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@openct/$(DEPDIR)/libccidtwin_la-proto-t1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccid_la-atr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccid_la-pps.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccidtwin_la-atr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@towitoko/$(DEPDIR)/libccidtwin_la-pps.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libccid_la-ccid.lo: ccid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid.Tpo -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-ccid.Tpo $(DEPDIR)/libccid_la-ccid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid.c' object='libccid_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid.Tpo -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-ccid.Tpo $(DEPDIR)/libccid_la-ccid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid.c' object='libccid_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c libccid_la-commands.lo: commands.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-commands.lo -MD -MP -MF $(DEPDIR)/libccid_la-commands.Tpo -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-commands.Tpo $(DEPDIR)/libccid_la-commands.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='commands.c' object='libccid_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-commands.lo -MD -MP -MF $(DEPDIR)/libccid_la-commands.Tpo -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-commands.Tpo $(DEPDIR)/libccid_la-commands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='commands.c' object='libccid_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c libccid_la-ifdhandler.lo: ifdhandler.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccid_la-ifdhandler.Tpo -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-ifdhandler.Tpo $(DEPDIR)/libccid_la-ifdhandler.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ifdhandler.c' object='libccid_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccid_la-ifdhandler.Tpo -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-ifdhandler.Tpo $(DEPDIR)/libccid_la-ifdhandler.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ifdhandler.c' object='libccid_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c libccid_la-utils.lo: utils.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-utils.lo -MD -MP -MF $(DEPDIR)/libccid_la-utils.Tpo -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-utils.Tpo $(DEPDIR)/libccid_la-utils.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils.c' object='libccid_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-utils.lo -MD -MP -MF $(DEPDIR)/libccid_la-utils.Tpo -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-utils.Tpo $(DEPDIR)/libccid_la-utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libccid_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c libccid_la-ccid_usb.lo: ccid_usb.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid_usb.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid_usb.Tpo -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-ccid_usb.Tpo $(DEPDIR)/libccid_la-ccid_usb.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid_usb.c' object='libccid_la-ccid_usb.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-ccid_usb.lo -MD -MP -MF $(DEPDIR)/libccid_la-ccid_usb.Tpo -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-ccid_usb.Tpo $(DEPDIR)/libccid_la-ccid_usb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_usb.c' object='libccid_la-ccid_usb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-ccid_usb.lo `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c libccid_la-tokenparser.lo: tokenparser.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccid_la-tokenparser.Tpo -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-tokenparser.Tpo $(DEPDIR)/libccid_la-tokenparser.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tokenparser.c' object='libccid_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccid_la-tokenparser.Tpo -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-tokenparser.Tpo $(DEPDIR)/libccid_la-tokenparser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='libccid_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c libccid_la-strlcpy.lo: strlcpy.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccid_la-strlcpy.Tpo -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-strlcpy.Tpo $(DEPDIR)/libccid_la-strlcpy.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strlcpy.c' object='libccid_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccid_la-strlcpy.Tpo -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-strlcpy.Tpo $(DEPDIR)/libccid_la-strlcpy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='libccid_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c + +libccid_la-simclist.lo: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-simclist.lo -MD -MP -MF $(DEPDIR)/libccid_la-simclist.Tpo -c -o libccid_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-simclist.Tpo $(DEPDIR)/libccid_la-simclist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='libccid_la-simclist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c libccid_la-debug.lo: debug.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-debug.lo -MD -MP -MF $(DEPDIR)/libccid_la-debug.Tpo -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-debug.Tpo $(DEPDIR)/libccid_la-debug.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='libccid_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-debug.lo -MD -MP -MF $(DEPDIR)/libccid_la-debug.Tpo -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccid_la-debug.Tpo $(DEPDIR)/libccid_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='libccid_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -libccid_la-atr.lo: towitoko/atr.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-atr.lo -MD -MP -MF $(DEPDIR)/libccid_la-atr.Tpo -c -o libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-atr.Tpo $(DEPDIR)/libccid_la-atr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/atr.c' object='libccid_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccid_la-atr.lo: towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT towitoko/libccid_la-atr.lo -MD -MP -MF towitoko/$(DEPDIR)/libccid_la-atr.Tpo -c -o towitoko/libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccid_la-atr.Tpo towitoko/$(DEPDIR)/libccid_la-atr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/atr.c' object='towitoko/libccid_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccid_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -libccid_la-pps.lo: towitoko/pps.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-pps.lo -MD -MP -MF $(DEPDIR)/libccid_la-pps.Tpo -c -o libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-pps.Tpo $(DEPDIR)/libccid_la-pps.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/pps.c' object='libccid_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccid_la-pps.lo: towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT towitoko/libccid_la-pps.lo -MD -MP -MF towitoko/$(DEPDIR)/libccid_la-pps.Tpo -c -o towitoko/libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccid_la-pps.Tpo towitoko/$(DEPDIR)/libccid_la-pps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/pps.c' object='towitoko/libccid_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccid_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -libccid_la-buffer.lo: openct/buffer.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-buffer.lo -MD -MP -MF $(DEPDIR)/libccid_la-buffer.Tpo -c -o libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-buffer.Tpo $(DEPDIR)/libccid_la-buffer.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/buffer.c' object='libccid_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccid_la-buffer.lo: openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT openct/libccid_la-buffer.lo -MD -MP -MF openct/$(DEPDIR)/libccid_la-buffer.Tpo -c -o openct/libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccid_la-buffer.Tpo openct/$(DEPDIR)/libccid_la-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/buffer.c' object='openct/libccid_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o openct/libccid_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -libccid_la-checksum.lo: openct/checksum.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-checksum.lo -MD -MP -MF $(DEPDIR)/libccid_la-checksum.Tpo -c -o libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-checksum.Tpo $(DEPDIR)/libccid_la-checksum.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/checksum.c' object='libccid_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccid_la-checksum.lo: openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT openct/libccid_la-checksum.lo -MD -MP -MF openct/$(DEPDIR)/libccid_la-checksum.Tpo -c -o openct/libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccid_la-checksum.Tpo openct/$(DEPDIR)/libccid_la-checksum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/checksum.c' object='openct/libccid_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o openct/libccid_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -libccid_la-proto-t1.lo: openct/proto-t1.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT libccid_la-proto-t1.lo -MD -MP -MF $(DEPDIR)/libccid_la-proto-t1.Tpo -c -o libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccid_la-proto-t1.Tpo $(DEPDIR)/libccid_la-proto-t1.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/proto-t1.c' object='libccid_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccid_la-proto-t1.lo: openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -MT openct/libccid_la-proto-t1.lo -MD -MP -MF openct/$(DEPDIR)/libccid_la-proto-t1.Tpo -c -o openct/libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccid_la-proto-t1.Tpo openct/$(DEPDIR)/libccid_la-proto-t1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/proto-t1.c' object='openct/libccid_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccid_la_CFLAGS) $(CFLAGS) -c -o openct/libccid_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c libccidtwin_la-ccid.lo: ccid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid.Tpo -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-ccid.Tpo $(DEPDIR)/libccidtwin_la-ccid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid.c' object='libccidtwin_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid.Tpo -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-ccid.Tpo $(DEPDIR)/libccidtwin_la-ccid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid.c' object='libccidtwin_la-ccid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid.lo `test -f 'ccid.c' || echo '$(srcdir)/'`ccid.c libccidtwin_la-commands.lo: commands.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-commands.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-commands.Tpo -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-commands.Tpo $(DEPDIR)/libccidtwin_la-commands.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='commands.c' object='libccidtwin_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-commands.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-commands.Tpo -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-commands.Tpo $(DEPDIR)/libccidtwin_la-commands.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='commands.c' object='libccidtwin_la-commands.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-commands.lo `test -f 'commands.c' || echo '$(srcdir)/'`commands.c libccidtwin_la-ifdhandler.lo: ifdhandler.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo $(DEPDIR)/libccidtwin_la-ifdhandler.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ifdhandler.c' object='libccidtwin_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ifdhandler.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-ifdhandler.Tpo $(DEPDIR)/libccidtwin_la-ifdhandler.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ifdhandler.c' object='libccidtwin_la-ifdhandler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ifdhandler.lo `test -f 'ifdhandler.c' || echo '$(srcdir)/'`ifdhandler.c libccidtwin_la-utils.lo: utils.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-utils.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-utils.Tpo -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-utils.Tpo $(DEPDIR)/libccidtwin_la-utils.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils.c' object='libccidtwin_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-utils.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-utils.Tpo -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-utils.Tpo $(DEPDIR)/libccidtwin_la-utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libccidtwin_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c libccidtwin_la-ccid_serial.lo: ccid_serial.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid_serial.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo $(DEPDIR)/libccidtwin_la-ccid_serial.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ccid_serial.c' object='libccidtwin_la-ccid_serial.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-ccid_serial.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-ccid_serial.Tpo $(DEPDIR)/libccidtwin_la-ccid_serial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_serial.c' object='libccidtwin_la-ccid_serial.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-ccid_serial.lo `test -f 'ccid_serial.c' || echo '$(srcdir)/'`ccid_serial.c libccidtwin_la-tokenparser.lo: tokenparser.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-tokenparser.Tpo -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-tokenparser.Tpo $(DEPDIR)/libccidtwin_la-tokenparser.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tokenparser.c' object='libccidtwin_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-tokenparser.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-tokenparser.Tpo -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-tokenparser.Tpo $(DEPDIR)/libccidtwin_la-tokenparser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='libccidtwin_la-tokenparser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-tokenparser.lo `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c libccidtwin_la-strlcpy.lo: strlcpy.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-strlcpy.Tpo -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-strlcpy.Tpo $(DEPDIR)/libccidtwin_la-strlcpy.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strlcpy.c' object='libccidtwin_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-strlcpy.Tpo -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-strlcpy.Tpo $(DEPDIR)/libccidtwin_la-strlcpy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='libccidtwin_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c + +libccidtwin_la-simclist.lo: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-simclist.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-simclist.Tpo -c -o libccidtwin_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-simclist.Tpo $(DEPDIR)/libccidtwin_la-simclist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='libccidtwin_la-simclist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-simclist.lo `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c libccidtwin_la-debug.lo: debug.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-debug.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-debug.Tpo -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-debug.Tpo $(DEPDIR)/libccidtwin_la-debug.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='libccidtwin_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-debug.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-debug.Tpo -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libccidtwin_la-debug.Tpo $(DEPDIR)/libccidtwin_la-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='libccidtwin_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -libccidtwin_la-atr.lo: towitoko/atr.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-atr.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-atr.Tpo -c -o libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-atr.Tpo $(DEPDIR)/libccidtwin_la-atr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/atr.c' object='libccidtwin_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccidtwin_la-atr.lo: towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT towitoko/libccidtwin_la-atr.lo -MD -MP -MF towitoko/$(DEPDIR)/libccidtwin_la-atr.Tpo -c -o towitoko/libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccidtwin_la-atr.Tpo towitoko/$(DEPDIR)/libccidtwin_la-atr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/atr.c' object='towitoko/libccidtwin_la-atr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccidtwin_la-atr.lo `test -f 'towitoko/atr.c' || echo '$(srcdir)/'`towitoko/atr.c -libccidtwin_la-pps.lo: towitoko/pps.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-pps.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-pps.Tpo -c -o libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-pps.Tpo $(DEPDIR)/libccidtwin_la-pps.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='towitoko/pps.c' object='libccidtwin_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ +towitoko/libccidtwin_la-pps.lo: towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT towitoko/libccidtwin_la-pps.lo -MD -MP -MF towitoko/$(DEPDIR)/libccidtwin_la-pps.Tpo -c -o towitoko/libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) towitoko/$(DEPDIR)/libccidtwin_la-pps.Tpo towitoko/$(DEPDIR)/libccidtwin_la-pps.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='towitoko/pps.c' object='towitoko/libccidtwin_la-pps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o towitoko/libccidtwin_la-pps.lo `test -f 'towitoko/pps.c' || echo '$(srcdir)/'`towitoko/pps.c -libccidtwin_la-buffer.lo: openct/buffer.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-buffer.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-buffer.Tpo -c -o libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-buffer.Tpo $(DEPDIR)/libccidtwin_la-buffer.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/buffer.c' object='libccidtwin_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccidtwin_la-buffer.lo: openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT openct/libccidtwin_la-buffer.lo -MD -MP -MF openct/$(DEPDIR)/libccidtwin_la-buffer.Tpo -c -o openct/libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccidtwin_la-buffer.Tpo openct/$(DEPDIR)/libccidtwin_la-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/buffer.c' object='openct/libccidtwin_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o openct/libccidtwin_la-buffer.lo `test -f 'openct/buffer.c' || echo '$(srcdir)/'`openct/buffer.c -libccidtwin_la-checksum.lo: openct/checksum.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-checksum.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-checksum.Tpo -c -o libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-checksum.Tpo $(DEPDIR)/libccidtwin_la-checksum.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/checksum.c' object='libccidtwin_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccidtwin_la-checksum.lo: openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT openct/libccidtwin_la-checksum.lo -MD -MP -MF openct/$(DEPDIR)/libccidtwin_la-checksum.Tpo -c -o openct/libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccidtwin_la-checksum.Tpo openct/$(DEPDIR)/libccidtwin_la-checksum.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/checksum.c' object='openct/libccidtwin_la-checksum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o openct/libccidtwin_la-checksum.lo `test -f 'openct/checksum.c' || echo '$(srcdir)/'`openct/checksum.c -libccidtwin_la-proto-t1.lo: openct/proto-t1.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT libccidtwin_la-proto-t1.lo -MD -MP -MF $(DEPDIR)/libccidtwin_la-proto-t1.Tpo -c -o libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libccidtwin_la-proto-t1.Tpo $(DEPDIR)/libccidtwin_la-proto-t1.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openct/proto-t1.c' object='libccidtwin_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ +openct/libccidtwin_la-proto-t1.lo: openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -MT openct/libccidtwin_la-proto-t1.lo -MD -MP -MF openct/$(DEPDIR)/libccidtwin_la-proto-t1.Tpo -c -o openct/libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) openct/$(DEPDIR)/libccidtwin_la-proto-t1.Tpo openct/$(DEPDIR)/libccidtwin_la-proto-t1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openct/proto-t1.c' object='openct/libccidtwin_la-proto-t1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libccidtwin_la_CFLAGS) $(CFLAGS) -c -o openct/libccidtwin_la-proto-t1.lo `test -f 'openct/proto-t1.c' || echo '$(srcdir)/'`openct/proto-t1.c parse-parse.o: parse.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.o -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse.c' object='parse-parse.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.o -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse.c' object='parse-parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.o `test -f 'parse.c' || echo '$(srcdir)/'`parse.c parse-parse.obj: parse.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.obj -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse.c' object='parse-parse.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-parse.obj -MD -MP -MF $(DEPDIR)/parse-parse.Tpo -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-parse.Tpo $(DEPDIR)/parse-parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse.c' object='parse-parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-parse.obj `if test -f 'parse.c'; then $(CYGPATH_W) 'parse.c'; else $(CYGPATH_W) '$(srcdir)/parse.c'; fi` parse-debug.o: debug.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.o -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='parse-debug.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.o -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='parse-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c parse-debug.obj: debug.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.obj -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='parse-debug.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-debug.obj -MD -MP -MF $(DEPDIR)/parse-debug.Tpo -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-debug.Tpo $(DEPDIR)/parse-debug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug.c' object='parse-debug.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` + +parse-ccid_usb.o: ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-ccid_usb.o -MD -MP -MF $(DEPDIR)/parse-ccid_usb.Tpo -c -o parse-ccid_usb.o `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-ccid_usb.Tpo $(DEPDIR)/parse-ccid_usb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_usb.c' object='parse-ccid_usb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-ccid_usb.o `test -f 'ccid_usb.c' || echo '$(srcdir)/'`ccid_usb.c + +parse-ccid_usb.obj: ccid_usb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-ccid_usb.obj -MD -MP -MF $(DEPDIR)/parse-ccid_usb.Tpo -c -o parse-ccid_usb.obj `if test -f 'ccid_usb.c'; then $(CYGPATH_W) 'ccid_usb.c'; else $(CYGPATH_W) '$(srcdir)/ccid_usb.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-ccid_usb.Tpo $(DEPDIR)/parse-ccid_usb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ccid_usb.c' object='parse-ccid_usb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-ccid_usb.obj `if test -f 'ccid_usb.c'; then $(CYGPATH_W) 'ccid_usb.c'; else $(CYGPATH_W) '$(srcdir)/ccid_usb.c'; fi` + +parse-tokenparser.o: tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-tokenparser.o -MD -MP -MF $(DEPDIR)/parse-tokenparser.Tpo -c -o parse-tokenparser.o `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-tokenparser.Tpo $(DEPDIR)/parse-tokenparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='parse-tokenparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-tokenparser.o `test -f 'tokenparser.c' || echo '$(srcdir)/'`tokenparser.c + +parse-tokenparser.obj: tokenparser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-tokenparser.obj -MD -MP -MF $(DEPDIR)/parse-tokenparser.Tpo -c -o parse-tokenparser.obj `if test -f 'tokenparser.c'; then $(CYGPATH_W) 'tokenparser.c'; else $(CYGPATH_W) '$(srcdir)/tokenparser.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-tokenparser.Tpo $(DEPDIR)/parse-tokenparser.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tokenparser.c' object='parse-tokenparser.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-tokenparser.obj `if test -f 'tokenparser.c'; then $(CYGPATH_W) 'tokenparser.c'; else $(CYGPATH_W) '$(srcdir)/tokenparser.c'; fi` + +parse-strlcpy.o: strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-strlcpy.o -MD -MP -MF $(DEPDIR)/parse-strlcpy.Tpo -c -o parse-strlcpy.o `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-strlcpy.Tpo $(DEPDIR)/parse-strlcpy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='parse-strlcpy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-strlcpy.o `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c + +parse-strlcpy.obj: strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-strlcpy.obj -MD -MP -MF $(DEPDIR)/parse-strlcpy.Tpo -c -o parse-strlcpy.obj `if test -f 'strlcpy.c'; then $(CYGPATH_W) 'strlcpy.c'; else $(CYGPATH_W) '$(srcdir)/strlcpy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-strlcpy.Tpo $(DEPDIR)/parse-strlcpy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='parse-strlcpy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-strlcpy.obj `if test -f 'strlcpy.c'; then $(CYGPATH_W) 'strlcpy.c'; else $(CYGPATH_W) '$(srcdir)/strlcpy.c'; fi` + +parse-simclist.o: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-simclist.o -MD -MP -MF $(DEPDIR)/parse-simclist.Tpo -c -o parse-simclist.o `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-simclist.Tpo $(DEPDIR)/parse-simclist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='parse-simclist.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-simclist.o `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c + +parse-simclist.obj: simclist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -MT parse-simclist.obj -MD -MP -MF $(DEPDIR)/parse-simclist.Tpo -c -o parse-simclist.obj `if test -f 'simclist.c'; then $(CYGPATH_W) 'simclist.c'; else $(CYGPATH_W) '$(srcdir)/simclist.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-simclist.Tpo $(DEPDIR)/parse-simclist.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simclist.c' object='parse-simclist.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_CFLAGS) $(CFLAGS) -c -o parse-simclist.obj `if test -f 'simclist.c'; then $(CYGPATH_W) 'simclist.c'; else $(CYGPATH_W) '$(srcdir)/simclist.c'; fi` .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs + -rm -rf openct/.libs openct/_libs + -rm -rf towitoko/.libs towitoko/_libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -772,23 +1027,25 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) -install-binPROGRAMS: install-libLTLIBRARIES - installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \ + for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install-exec: install-exec-am @@ -799,16 +1056,26 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f openct/$(DEPDIR)/$(am__dirstamp) + -rm -f openct/$(am__dirstamp) + -rm -f towitoko/$(DEPDIR)/$(am__dirstamp) + -rm -f towitoko/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -817,11 +1084,11 @@ maintainer-clean-generic: -rm -f tokenparser.c clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool mostlyclean-am +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) openct/$(DEPDIR) towitoko/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -832,6 +1099,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -840,22 +1109,32 @@ install-data-am: install-dvi: install-dvi-am -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -rf ./$(DEPDIR) openct/$(DEPDIR) towitoko/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -872,15 +1151,15 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES +uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool ctags \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ @@ -888,14 +1167,16 @@ uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-libLTLIBRARIES + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-libLTLIBRARIES +# We can't use install-exec-local since we want to overwrite the install +# rule. We do not want to _add_ files to install install: $(LIBS_TO_INSTALL) Info.plist: Info.plist.src $(srcdir)/../readers/supported_readers.txt - $(srcdir)/create_Info_plist.pl $(srcdir)/../readers/supported_readers.txt $(srcdir)/Info.plist.src --ifdCapabilities=$(ifdCapabilities) --target=$(CCID_LIB) --version=$(VERSION) --bundle=$(CCID_BUNDLE) $(NOCLASS) > Info.plist + $(srcdir)/create_Info_plist.pl $(srcdir)/../readers/supported_readers.txt $(srcdir)/Info.plist.src --target=$(CCID_LIB) --version=$(VERSION) $(NOCLASS) > Info.plist install_ccid: libccid.la Info.plist $(mkinstalldirs) $(DRIVER_DEST)$(usbdropdir)/$(CCID_BUNDLE)/Contents/$(BUNDLE_HOST)/ @@ -906,25 +1187,21 @@ install_ccid: libccid.la Info.plist install_ccidtwin: libccidtwin.la $(mkinstalldirs) $(DESTDIR)$(ccidtwindir) - cp .libs/$(CCIDTWIN_LIB) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB).$(VERSION) - ln -fs $(CCIDTWIN_LIB).$(VERSION) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) - if [ -e $(DESTDIR)/etc/reader.conf ] ; \ - then \ - echo "Edit existing /etc/reader.conf" ; \ - else \ - $(mkinstalldirs) $(DESTDIR)/etc ; \ - perl -ne "s|TARGET|$(ccidtwindir)/$(CCIDTWIN_LIB)| ; print" $(srcdir)/reader.conf.in > $(DESTDIR)/etc/reader.conf ; \ - fi + cp .libs/$(CCIDTWIN_LIB) $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) + $(mkinstalldirs) $(DESTDIR)/$(serialconfdir) ; \ + perl -ne "s|TARGET|$(ccidtwindir)/$(CCIDTWIN_LIB)| ; print" $(srcdir)/reader.conf.in > $(DESTDIR)/$(serialconfdir)/libccidtwin # do not uninstall the serial driver by default # use explicitely 'make uninstall_ccidtwin' -uninstall: uninstall_ccid +uninstall: $(LIBS_TO_UNINSTALL) uninstall_ccid: rm -rf $(DESTDIR)$(usbdropdir)/$(CCID_BUNDLE) uninstall_ccidtwin: - rm -f $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB).$(VERSION) + rm -f $(DESTDIR)$(ccidtwindir)/$(CCIDTWIN_LIB) + rm -f $(DESTDIR)/$(serialconfdir)/libccidtwin + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/ccid/ccid/src/ccid.c b/ccid/ccid/src/ccid.c index 28195c5..08b51c6 100644 --- a/ccid/ccid/src/ccid.c +++ b/ccid/ccid/src/ccid.c @@ -1,6 +1,6 @@ /* ccid.c: CCID common code - Copyright (C) 2003-2005 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: ccid.c 4346 2009-07-28 13:39:37Z rousseau $ + * $Id: ccid.c 6783 2013-10-24 09:36:52Z rousseau $ */ #include @@ -33,7 +33,11 @@ #include "defs.h" #include "ccid_ifdhandler.h" #include "commands.h" -#include "ccid_usb.h" +#include "utils.h" + +#ifdef __APPLE__ +#include +#endif /***************************************************************************** * @@ -43,7 +47,6 @@ int ccid_open_hack_pre(unsigned int reader_index) { _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); - int doInterruptRead = 1; switch (ccid_descriptor->readerID) { @@ -60,26 +63,35 @@ int ccid_open_hack_pre(unsigned int reader_index) case CL1356D: /* the firmware needs some time to initialize */ (void)sleep(1); - ccid_descriptor->readTimeout = 60; /* 60 seconds */ + ccid_descriptor->readTimeout = 60*1000; /* 60 seconds */ break; - case KOBIL_TRIBANK: - /* the InterruptRead does not timeout (on Mac OS X) */ - doInterruptRead = 0; + case GEMPCTWIN: + case GEMPCKEY: + case DELLSCRK: + /* Only the chipset with firmware version 2.00 is "bogus" + * The reader may send packets of 0 bytes when the reader is + * connected to a USB 3 port */ + if (0x0200 == ccid_descriptor->IFD_bcdDevice) + { + ccid_descriptor->zlp = TRUE; + DEBUG_INFO("ZLP fixup"); + } break; } /* CCID */ - if (doInterruptRead && (0 == ccid_descriptor->bInterfaceProtocol)) + if ((PROTOCOL_CCID == ccid_descriptor->bInterfaceProtocol) + && (3 == ccid_descriptor -> bNumEndpoints)) { #ifndef TWIN_SERIAL - /* just wait for 10ms in case a notification is in the pipe */ - (void)InterruptRead(reader_index, 10); + /* just wait for 100ms in case a notification is in the pipe */ + (void)InterruptRead(reader_index, 100); #endif } /* ICCD type A */ - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { unsigned char tmp[MAX_ATR_SIZE]; unsigned int n = sizeof(tmp); @@ -91,7 +103,7 @@ int ccid_open_hack_pre(unsigned int reader_index) } /* ICCD type B */ - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { unsigned char tmp[MAX_ATR_SIZE]; unsigned int n = sizeof(tmp); @@ -113,6 +125,102 @@ int ccid_open_hack_pre(unsigned int reader_index) return 0; } /* ccid_open_hack_pre */ +#ifndef NO_LOG +/***************************************************************************** + * + * dump_gemalto_firmware_features + * + ****************************************************************************/ +static void dump_gemalto_firmware_features(struct GEMALTO_FIRMWARE_FEATURES *gff) +{ + DEBUG_INFO2("Dumping Gemalto firmware features (%zd bytes):", + sizeof(struct GEMALTO_FIRMWARE_FEATURES)); + +#define YESNO(x) (x) ? "yes" : "no" + + DEBUG_INFO2(" bLogicalLCDLineNumber: %d", gff->bLogicalLCDLineNumber); + DEBUG_INFO2(" bLogicalLCDRowNumber: %d", gff->bLogicalLCDRowNumber); + DEBUG_INFO2(" bLcdInfo: 0x%02X", gff->bLcdInfo); + DEBUG_INFO2(" bEntryValidationCondition: 0x%02X", + gff->bEntryValidationCondition); + + DEBUG_INFO(" Reader supports PC/SCv2 features:"); + DEBUG_INFO2(" VerifyPinStart: %s", YESNO(gff->VerifyPinStart)); + DEBUG_INFO2(" VerifyPinFinish: %s", YESNO(gff->VerifyPinFinish)); + DEBUG_INFO2(" ModifyPinStart: %s", YESNO(gff->ModifyPinStart)); + DEBUG_INFO2(" ModifyPinFinish: %s", YESNO(gff->ModifyPinFinish)); + DEBUG_INFO2(" GetKeyPressed: %s", YESNO(gff->GetKeyPressed)); + DEBUG_INFO2(" VerifyPinDirect: %s", YESNO(gff->VerifyPinDirect)); + DEBUG_INFO2(" ModifyPinDirect: %s", YESNO(gff->ModifyPinDirect)); + DEBUG_INFO2(" Abort: %s", YESNO(gff->Abort)); + DEBUG_INFO2(" GetKey: %s", YESNO(gff->GetKey)); + DEBUG_INFO2(" WriteDisplay: %s", YESNO(gff->WriteDisplay)); + DEBUG_INFO2(" SetSpeMessage: %s", YESNO(gff->SetSpeMessage)); + DEBUG_INFO2(" bTimeOut2: %s", YESNO(gff->bTimeOut2)); + DEBUG_INFO2(" bPPDUSupportOverXferBlock: %s", + YESNO(gff->bPPDUSupportOverXferBlock)); + DEBUG_INFO2(" bPPDUSupportOverEscape: %s", + YESNO(gff->bPPDUSupportOverEscape)); + + DEBUG_INFO2(" bListSupportedLanguages: %s", + YESNO(gff->bListSupportedLanguages)); + DEBUG_INFO2(" bNumberMessageFix: %s", YESNO(gff->bNumberMessageFix)); + + DEBUG_INFO2(" VersionNumber: 0x%02X", gff->VersionNumber); + DEBUG_INFO2(" MinimumPINSize: %d", gff->MinimumPINSize); + DEBUG_INFO2(" MaximumPINSize: %d", gff->MaximumPINSize); + DEBUG_INFO2(" Firewall: %s", YESNO(gff->Firewall)); + if (gff->Firewall && gff->FirewalledCommand_SW1 + && gff->FirewalledCommand_SW2) + { + DEBUG_INFO2(" FirewalledCommand_SW1: 0x%02X", + gff->FirewalledCommand_SW1); + DEBUG_INFO2(" FirewalledCommand_SW2: 0x%02X", + gff->FirewalledCommand_SW2); + } + +} /* dump_gemalto_firmware_features */ +#endif + +/***************************************************************************** + * + * set_gemalto_firmware_features + * + ****************************************************************************/ +static void set_gemalto_firmware_features(unsigned int reader_index) +{ + _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + struct GEMALTO_FIRMWARE_FEATURES *gf_features; + + gf_features = malloc(sizeof(struct GEMALTO_FIRMWARE_FEATURES)); + if (gf_features) + { + unsigned char cmd[] = { 0x6A }; /* GET_FIRMWARE_FEATURES command id */ + unsigned int len_features = sizeof *gf_features; + RESPONSECODE ret; + + ret = CmdEscape(reader_index, cmd, sizeof cmd, + (unsigned char*)gf_features, &len_features, 0); + if ((IFD_SUCCESS == ret) && + (len_features == sizeof *gf_features)) + { + /* Command is supported if it succeeds at CCID level */ + /* and returned size matches our expectation */ + ccid_descriptor->gemalto_firmware_features = gf_features; +#ifndef NO_LOG + dump_gemalto_firmware_features(gf_features); +#endif + } + else + { + /* Command is not supported, let's free allocated memory */ + free(gf_features); + DEBUG_INFO3("GET_FIRMWARE_FEATURES failed: " DWORD_D ", len=%d", + ret, len_features); + } + } +} /* set_gemalto_firmware_features */ + /***************************************************************************** * * ccid_open_hack_post @@ -121,19 +229,20 @@ int ccid_open_hack_pre(unsigned int reader_index) int ccid_open_hack_post(unsigned int reader_index) { _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + RESPONSECODE return_value = IFD_SUCCESS; switch (ccid_descriptor->readerID) { case GEMPCKEY: case GEMPCTWIN: - /* Reader announces TPDU but can do APDU */ + /* Reader announces TPDU but can do APDU (EMV in fact) */ if (DriverOptions & DRIVER_OPTION_GEMPC_TWIN_KEY_APDU) { - unsigned char cmd[] = { 0xA0, 0x02 }; + unsigned char cmd[] = { 0x1F, 0x02 }; unsigned char res[10]; unsigned int length_res = sizeof(res); - if (CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res) == IFD_SUCCESS) + if (CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res, 0) == IFD_SUCCESS) { ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_SHORT_APDU; @@ -141,6 +250,7 @@ int ccid_open_hack_post(unsigned int reader_index) } break; + case VEGAALPHA: case GEMPCPINPAD: /* load the l10n strings in the pinpad memory */ { @@ -249,10 +359,28 @@ int ccid_open_hack_post(unsigned int reader_index) "Card Error", "PIN blocked" }; - char *lang; + const char *lang; const char **l10n; +#ifdef __APPLE__ + CFArrayRef cfa; + CFStringRef slang; + + /* Get the complete ordered list */ + cfa = CFLocaleCopyPreferredLanguages(); + + /* Use the first/preferred language + * As the driver is run as root we get the language + * selected during install */ + slang = CFArrayGetValueAtIndex(cfa, 0); + + /* CFString -> C string */ + lang = CFStringGetCStringPtr(slang, kCFStringEncodingMacRoman); +#else + /* The other Unixes just use the LANG env variable */ lang = getenv("LANG"); +#endif + DEBUG_COMM2("Using lang: %s", lang); if (NULL == lang) l10n = en; else @@ -275,6 +403,10 @@ int ccid_open_hack_post(unsigned int reader_index) l10n = en; } +#ifdef __APPLE__ + /* Release the allocated array */ + CFRelease(cfa); +#endif offset = 0; cmd[offset++] = 0xB2; /* load strings */ cmd[offset++] = 0xA0; /* address of the memory */ @@ -295,17 +427,26 @@ int ccid_open_hack_post(unsigned int reader_index) } (void)sleep(1); - if (IFD_SUCCESS == CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res)) + if (IFD_SUCCESS == CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res, 0)) { DEBUG_COMM("l10n string loaded successfully"); } else { DEBUG_COMM("Failed to load l10n strings"); + return_value = IFD_COMMUNICATION_ERROR; } } break; + case HPSMARTCARDKEYBOARD: + case HP_CCIDSMARTCARDKEYBOARD: + /* the Secure Pin Entry is bogus so disable it + * http://martinpaljak.net/2011/03/19/insecure-hp-usb-smart-card-keyboard/ + */ + ccid_descriptor->bPINSupport = 0; + break; + #if 0 /* SCM SCR331-DI contactless */ case SCR331DI: @@ -326,8 +467,8 @@ int ccid_open_hack_post(unsigned int reader_index) unsigned char res[20]; unsigned int length_res = sizeof(res); - if ((IFD_SUCCESS == CmdEscape(reader_index, cmd1, sizeof(cmd1), res, &length_res)) - && (IFD_SUCCESS == CmdEscape(reader_index, cmd2, sizeof(cmd2), res, &length_res))) + if ((IFD_SUCCESS == CmdEscape(reader_index, cmd1, sizeof(cmd1), res, &length_res, 0)) + && (IFD_SUCCESS == CmdEscape(reader_index, cmd2, sizeof(cmd2), res, &length_res, 0))) { DEBUG_COMM("SCM SCR331-DI contactless detected"); } @@ -346,7 +487,11 @@ int ccid_open_hack_post(unsigned int reader_index) #endif } - return 0; + /* Gemalto readers may report additional information */ + if (GET_VENDOR(ccid_descriptor->readerID) == VENDOR_GEMALTO) + set_gemalto_firmware_features(reader_index); + + return return_value; } /* ccid_open_hack_post */ /***************************************************************************** @@ -463,15 +608,13 @@ void ccid_error(int error, const char *file, int line, const char *function) default: if ((error >= 1) && (error <= 127)) - { (void)snprintf(var_text, sizeof(var_text), "error on byte %d", error); - text = var_text; - } else (void)snprintf(var_text, sizeof(var_text), "Unknown CCID error: 0x%02X", error); - text = var_text; + + text = var_text; break; } log_msg(PCSC_LOG_ERROR, "%s:%d:%s %s", file, line, function, text); diff --git a/ccid/ccid/src/ccid.h b/ccid/ccid/src/ccid.h index 6950334..20e37e2 100644 --- a/ccid/ccid/src/ccid.h +++ b/ccid/ccid/src/ccid.h @@ -1,6 +1,6 @@ /* ccid.h: CCID structures - Copyright (C) 2003-2009 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: ccid.h 4280 2009-06-26 14:58:23Z rousseau $ + * $Id: ccid.h 6650 2013-06-10 08:43:24Z rousseau $ */ typedef struct @@ -53,7 +53,7 @@ typedef struct * PIN support of the reader (directly from Class Descriptor) */ char bPINSupport; - + /* * Display dimensions of the reader (directly from Class Descriptor) */ @@ -86,7 +86,7 @@ typedef struct /* * Read communication port timeout - * value is seconds + * value is milliseconds * this value can evolve dynamically if card request it (time processing). */ unsigned int readTimeout; @@ -121,6 +121,31 @@ typedef struct * 4 = 1.8V */ int bVoltageSupport; + + /* + * USB serial number of the device (if any) + */ + char *sIFD_serial_number; + + /* + * USB iManufacturer string + */ + char *sIFD_iManufacturer; + + /* + * USB bcdDevice + */ + int IFD_bcdDevice; + + /* + * Gemalto extra features, if any + */ + struct GEMALTO_FIRMWARE_FEATURES *gemalto_firmware_features; + + /* + * Zero Length Packet fixup (boolean) + */ + char zlp; } _ccid_descriptor; /* Features from dwFeatures */ @@ -150,8 +175,9 @@ typedef struct #define CCID_TIME_EXTENSION 0x80 /* 10 0000 00 */ /* bInterfaceProtocol for ICCD */ -#define ICCD_A 1 /* ICCD Version A */ -#define ICCD_B 2 /* ICCD Version B */ +#define PROTOCOL_CCID 0 /* plain CCID */ +#define PROTOCOL_ICCD_A 1 /* ICCD Version A */ +#define PROTOCOL_ICCD_B 2 /* ICCD Version B */ /* Product identification for special treatments */ #define GEMPC433 0x08E64433 @@ -162,6 +188,7 @@ typedef struct #define GEMCOREPOSPRO 0x08E63479 #define GEMALTOPROXDU 0x08E65503 #define GEMALTOPROXSU 0x08E65504 +#define GEMALTO_EZIO_CBP 0x08E634C3 #define CARDMAN3121 0x076B3021 #define LTC31 0x07830003 #define SCR331DI 0x04E65111 @@ -175,11 +202,20 @@ typedef struct #define MYSMARTPAD 0x09BE0002 #define CHERRYXX44 0x046a0010 #define CL1356D 0x0B810200 -#define REINER_SCT 0x0C4B0300 +#define REINER_SCT 0x0C4B0300 #define SEG 0x08E68000 #define BLUDRIVEII_CCID 0x1B0E1078 #define DELLSCRK 0x413C2101 +#define DELLSK 0x413C2100 #define KOBIL_TRIBANK 0x0D463010 +#define KOBIL_MIDENTITY_VISUAL 0x0D460D46 +#define VEGAALPHA 0x09820008 +#define HPSMARTCARDKEYBOARD 0x03F01024 +#define HP_CCIDSMARTCARDKEYBOARD 0x03F00036 +#define KOBIL_IDTOKEN 0x0D46301D + +#define VENDOR_GEMALTO 0x08E6 +#define GET_VENDOR(readerID) ((readerID >> 16) & 0xFFFF) /* * The O2Micro OZ776S reader has a wrong USB descriptor @@ -231,3 +267,59 @@ _ccid_descriptor *get_ccid_descriptor(unsigned int reader_index); /* data rates supported by the secondary slots on the GemCore Pos Pro & SIM Pro */ #define GEMPLUS_CUSTOM_DATA_RATES 10753, 21505, 43011, 125000 +/* Structure returned by Gemalto readers for the CCID Escape command 0x6A */ +struct GEMALTO_FIRMWARE_FEATURES +{ + UCHAR bLogicalLCDLineNumber; /* Logical number of LCD lines */ + UCHAR bLogicalLCDRowNumber; /* Logical number of characters per LCD line */ + UCHAR bLcdInfo; /* b0 indicates if scrolling is available */ + UCHAR bEntryValidationCondition; /* See PIN_PROPERTIES */ + + /* Here come the PC/SC bit features to report */ + UCHAR VerifyPinStart:1; + UCHAR VerifyPinFinish:1; + UCHAR ModifyPinStart:1; + UCHAR ModifyPinFinish:1; + UCHAR GetKeyPressed:1; + UCHAR VerifyPinDirect:1; + UCHAR ModifyPinDirect:1; + UCHAR Abort:1; + + UCHAR GetKey:1; + UCHAR WriteDisplay:1; + UCHAR SetSpeMessage:1; + UCHAR RFUb1:5; + + UCHAR RFUb2[2]; + + /* Additional flags */ + UCHAR bTimeOut2:1; + UCHAR bListSupportedLanguages:1; /* Reader is able to indicate + the list of supported languages through CCID-ESC 0x6B */ + UCHAR bNumberMessageFix:1; /* Reader handles correctly shifts + made by bNumberMessage in PIN modification data structure */ + UCHAR bPPDUSupportOverXferBlock:1; /* Reader supports PPDU over + PC_to_RDR_XferBlock command */ + UCHAR bPPDUSupportOverEscape:1; /* Reader supports PPDU over + PC_to_RDR_Escape command with abData[0]=0xFF */ + UCHAR RFUb3:3; + + UCHAR RFUb4[3]; + + UCHAR VersionNumber; /* ?? */ + UCHAR MinimumPINSize; /* for Verify and Modify */ + UCHAR MaximumPINSize; + + /* Miscellaneous reader features */ + UCHAR Firewall:1; + UCHAR RFUb5:7; + + /* The following fields, FirewalledCommand_SW1 and + * FirewalledCommand_SW2 are only valid if Firewall=1 + * These fields give the SW1 SW2 value used by the reader to + * indicate a command has been firewalled */ + UCHAR FirewalledCommand_SW1; + UCHAR FirewalledCommand_SW2; + UCHAR RFUb6[3]; +}; + diff --git a/ccid/ccid/src/ccid_ifdhandler.h b/ccid/ccid/src/ccid_ifdhandler.h index d35bee9..9b175e5 100644 --- a/ccid/ccid/src/ccid_ifdhandler.h +++ b/ccid/ccid/src/ccid_ifdhandler.h @@ -1,6 +1,6 @@ /* ccid_ifdhandler.h: non-generic ifdhandler functions - Copyright (C) 2004-2009 Ludovic Rousseau + Copyright (C) 2004-2010 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: ccid_ifdhandler.h 4279 2009-06-26 14:58:03Z rousseau $ + * $Id: ccid_ifdhandler.h 4973 2010-06-01 09:43:29Z rousseau $ */ #ifndef _ccid_ifd_handler_h_ @@ -31,13 +31,12 @@ SCARD_CTL_CODE(FEATURE_VERIFY_PIN_DIRECT + CLASS2_IOCTL_MAGIC) #define IOCTL_FEATURE_MODIFY_PIN_DIRECT \ SCARD_CTL_CODE(FEATURE_MODIFY_PIN_DIRECT + CLASS2_IOCTL_MAGIC) -#define IOCTL_FEATURE_MCT_READERDIRECT \ - SCARD_CTL_CODE(FEATURE_MCT_READERDIRECT + CLASS2_IOCTL_MAGIC) - -#ifdef FEATURE_IFD_PIN_PROPERTIES +#define IOCTL_FEATURE_MCT_READER_DIRECT \ + SCARD_CTL_CODE(FEATURE_MCT_READER_DIRECT + CLASS2_IOCTL_MAGIC) #define IOCTL_FEATURE_IFD_PIN_PROPERTIES \ SCARD_CTL_CODE(FEATURE_IFD_PIN_PROPERTIES + CLASS2_IOCTL_MAGIC) -#endif +#define IOCTL_FEATURE_GET_TLV_PROPERTIES \ + SCARD_CTL_CODE(FEATURE_GET_TLV_PROPERTIES + CLASS2_IOCTL_MAGIC) #define DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED 1 #define DRIVER_OPTION_GEMPC_TWIN_KEY_APDU 2 diff --git a/ccid/ccid/src/ccid_serial.c b/ccid/ccid/src/ccid_serial.c index 65cd8d6..83f008d 100644 --- a/ccid/ccid/src/ccid_serial.c +++ b/ccid/ccid/src/ccid_serial.c @@ -1,6 +1,6 @@ /* * ccid_serial.c: communicate with a GemPC Twin smart card reader - * Copyright (C) 2001-2004 Ludovic Rousseau + * Copyright (C) 2001-2010 Ludovic Rousseau * * Thanks to Niki W. Waibel for a prototype version * @@ -20,7 +20,7 @@ */ /* - * $Id: ccid_serial.c 3488 2009-05-07 08:04:20Z rousseau $ + * $Id: ccid_serial.c 6783 2013-10-24 09:36:52Z rousseau $ */ #include @@ -35,14 +35,15 @@ #include #include +#include "config.h" #include "defs.h" #include "ccid_ifdhandler.h" -#include "config.h" #include "debug.h" #include "ccid.h" #include "utils.h" #include "commands.h" #include "parser.h" +#include "strlcpycat.h" #define SYNC 0x03 #define CTRL_ACK 0x06 @@ -310,6 +311,12 @@ status_t ReadSerial(unsigned int reader_index, /* total frame size */ to_read = 10+dw2i(buffer, 1); + if ((to_read < 10) || (to_read > (int)*length)) + { + DEBUG_CRITICAL2("Wrong value for frame size: %d", to_read); + return STATUS_COMM_ERROR; + } + DEBUG_COMM2("frame size: %d", to_read); if ((rv = get_bytes(reader_index, buffer+5, to_read-5)) != STATUS_SUCCESS) return rv; @@ -421,8 +428,8 @@ static int ReadChunk(unsigned int reader_index, unsigned char *buffer, /* use select() to, eventually, timeout */ FD_ZERO(&fdset); FD_SET(fd, &fdset); - t.tv_sec = serialDevice[reader_index].ccid.readTimeout; - t.tv_usec = 0; + t.tv_sec = serialDevice[reader_index].ccid.readTimeout / 1000; + t.tv_usec = (serialDevice[reader_index].ccid.readTimeout - t.tv_sec*1000)*1000; i = select(fd+1, &fdset, NULL, NULL, &t); if (i == -1) @@ -433,7 +440,7 @@ static int ReadChunk(unsigned int reader_index, unsigned char *buffer, else if (i == 0) { - DEBUG_COMM2("Timeout! (%d sec)", serialDevice[reader_index].ccid.readTimeout); + DEBUG_COMM2("Timeout! (%d ms)", serialDevice[reader_index].ccid.readTimeout); return -1; } @@ -483,11 +490,11 @@ status_t OpenSerial(unsigned int reader_index, int channel) if (channel < 0) { - DEBUG_CRITICAL2("wrong port number: %d", (int) channel); + DEBUG_CRITICAL2("wrong port number: %d", channel); return STATUS_UNSUCCESSFUL; } - (void)snprintf(dev_name, sizeof(dev_name), "/dev/pcsc/%d", (int) channel); + (void)snprintf(dev_name, sizeof(dev_name), "/dev/pcsc/%d", channel); return OpenSerialByName(reader_index, dev_name); } /* OpenSerial */ @@ -544,6 +551,7 @@ static status_t set_ccid_descriptor(unsigned int reader_index, *serialDevice[reader_index].nb_opened_slots += 1; serialDevice[reader_index].ccid.bCurrentSlotIndex++; + serialDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT; DEBUG_INFO2("Opening slot: %d", serialDevice[reader_index].ccid.bCurrentSlotIndex); switch (readerID) @@ -592,6 +600,8 @@ static status_t set_ccid_descriptor(unsigned int reader_index, serialDevice[reader_index].ccid.arrayOfSupportedDataRates = SerialTwinDataRates; serialDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT; serialDevice[reader_index].ccid.bVoltageSupport = 0x07; /* 1.8V, 3V and 5V */ + serialDevice[reader_index].ccid.gemalto_firmware_features = NULL; + serialDevice[reader_index].ccid.zlp = FALSE; serialDevice[reader_index].echo = TRUE; /* change some values depending on the reader */ @@ -640,7 +650,8 @@ status_t OpenSerialByName(unsigned int reader_index, char *dev_name) { struct termios current_termios; unsigned int reader = reader_index; - char reader_name[TOKEN_MAX_VALUE_SIZE] = "GemPCTwin"; + /* 255 is MAX_DEVICENAME in pcscd.h */ + char reader_name[255] = "GemPCTwin"; char *p; status_t ret; @@ -651,7 +662,7 @@ status_t OpenSerialByName(unsigned int reader_index, char *dev_name) if (p) { /* copy the second part of the string */ - strncpy(reader_name, p+1, sizeof(reader_name)); + strlcpy(reader_name, p+1, sizeof(reader_name)); /* replace ':' by '\0' so that dev_name only contains the device name */ *p = '\0'; @@ -741,7 +752,7 @@ status_t OpenSerialByName(unsigned int reader_index, char *dev_name) return STATUS_UNSUCCESSFUL; } - /* perform a command to be sure a Gemplus reader is connected + /* perform a command to be sure a Gemalto reader is connected * get the reader firmware */ { unsigned char tx_buffer[] = { 0x02 }; @@ -749,19 +760,14 @@ status_t OpenSerialByName(unsigned int reader_index, char *dev_name) unsigned int rx_length = sizeof(rx_buffer); /* 2 seconds timeout to not wait too long if no reader is connected */ - serialDevice[reader].ccid.readTimeout = 2; - if (IFD_SUCCESS != CmdEscape(reader_index, tx_buffer, sizeof(tx_buffer), - rx_buffer, &rx_length)) + rx_buffer, &rx_length, 2*1000)) { DEBUG_CRITICAL("Get firmware failed. Maybe the reader is not connected"); (void)CloseSerial(reader_index); return STATUS_UNSUCCESSFUL; } - /* normal timeout: 2 seconds */ - serialDevice[reader].ccid.readTimeout = DEFAULT_COM_READ_TIMEOUT ; - rx_buffer[rx_length] = '\0'; DEBUG_INFO2("Firmware: %s", rx_buffer); } @@ -775,7 +781,7 @@ status_t OpenSerialByName(unsigned int reader_index, char *dev_name) unsigned int rx_length = sizeof(rx_buffer); if (IFD_SUCCESS != CmdEscape(reader_index, tx_buffer, sizeof(tx_buffer), - rx_buffer, &rx_length)) + rx_buffer, &rx_length, 0)) { DEBUG_CRITICAL("Change card movement notification failed."); (void)CloseSerial(reader_index); @@ -783,6 +789,10 @@ status_t OpenSerialByName(unsigned int reader_index, char *dev_name) } } + serialDevice[reader_index].ccid.sIFD_serial_number = NULL; + serialDevice[reader_index].ccid.sIFD_iManufacturer = NULL; + serialDevice[reader_index].ccid.IFD_bcdDevice = 0; + return STATUS_SUCCESS; } /* OpenSerialByName */ diff --git a/ccid/ccid/src/ccid_serial.h b/ccid/ccid/src/ccid_serial.h index 6da754e..d1d28b6 100644 --- a/ccid/ccid/src/ccid_serial.h +++ b/ccid/ccid/src/ccid_serial.h @@ -1,6 +1,6 @@ /* ccid_serial.h: Serial access routines - Copyright (C) 2003 Ludovic Rousseau + Copyright (C) 2003-2008 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: ccid_serial.h 2974 2008-05-28 18:32:52Z rousseau $ + * $Id: ccid_serial.h 4973 2010-06-01 09:43:29Z rousseau $ */ #ifndef __CCID_SERAL_H__ diff --git a/ccid/ccid/src/ccid_usb.c b/ccid/ccid/src/ccid_usb.c index 684eda4..29bda8f 100644 --- a/ccid/ccid/src/ccid_usb.c +++ b/ccid/ccid/src/ccid_usb.c @@ -1,16 +1,16 @@ /* - ccid_usb.c: USB access routines using the libusb library - Copyright (C) 2003-2009 Ludovic Rousseau + ccid_usb.c: USB access routines using the libusb library + Copyright (C) 2003-2010 Ludovic Rousseau - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, @@ -18,7 +18,7 @@ */ /* - * $Id: ccid_usb.c 4346 2009-07-28 13:39:37Z rousseau $ + * $Id: ccid_usb.c 6793 2013-11-25 13:09:41Z rousseau $ */ #define __CCID_USB__ @@ -29,12 +29,15 @@ # ifdef S_SPLINT_S # include # endif -#include +#include +#include +#include +#include #include +#include "config.h" #include "misc.h" #include "ccid.h" -#include "config.h" #include "debug.h" #include "defs.h" #include "utils.h" @@ -44,23 +47,44 @@ /* write timeout * we don't have to wait a long time since the card was doing nothing */ -#define USB_WRITE_TIMEOUT (5 * 1000) /* 5 seconds timeout */ +#define USB_WRITE_TIMEOUT (5 * 1000) /* 5 seconds timeout */ /* * Proprietary USB Class (0xFF) are (or are not) accepted * A proprietary class is used for devices released before the final CCID * specifications were ready. - * We should not have problems with non CCID devices becasue the + * We should not have problems with non CCID devices because the * Manufacturer and Product ID are also used to identify the device */ #define ALLOW_PROPRIETARY_CLASS #define BUS_DEVICE_STRSIZE 32 +/* Using the default libusb context */ +/* does not work for libusb <= 1.0.8 */ +/* #define ctx NULL */ +libusb_context *ctx = NULL; + +#define CCID_INTERRUPT_SIZE 8 + +struct usbDevice_MultiSlot_Extension +{ + int reader_index; + + /* The multi-threaded polling part */ + int terminated; + int status; + unsigned char buffer[CCID_INTERRUPT_SIZE]; + pthread_t thread_proc; + pthread_mutex_t mutex; + pthread_cond_t condition; + struct libusb_transfer *transfer; +}; + typedef struct { - usb_dev_handle *handle; - char *dirname; - char *filename; + libusb_device_handle *dev_handle; + uint8_t bus_number; + uint8_t device_address; int interface; /* @@ -79,22 +103,36 @@ typedef struct */ _ccid_descriptor ccid; + /* libusb transfer for the polling (or NULL) */ + struct libusb_transfer *polling_transfer; + + /* pointer to the multislot extension (if any) */ + struct usbDevice_MultiSlot_Extension *multislot_extension; + } _usbDevice; /* The _usbDevice structure must be defined before including ccid_usb.h */ #include "ccid_usb.h" -static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, int num); -int ccid_check_firmware(struct usb_device *dev); +/* Specific hooks for multislot readers */ +static int Multi_InterruptRead(int reader_index, int timeout /* in ms */); +static void Multi_InterruptStop(int reader_index); +static struct usbDevice_MultiSlot_Extension *Multi_CreateFirstSlot(int reader_index); +static struct usbDevice_MultiSlot_Extension *Multi_CreateNextSlot(int physical_reader_index); +static void Multi_PollingTerminate(struct usbDevice_MultiSlot_Extension *msExt); + +static int get_end_points(struct libusb_config_descriptor *desc, + _usbDevice *usbdevice, int num); +int ccid_check_firmware(struct libusb_device_descriptor *desc); static unsigned int *get_data_rates(unsigned int reader_index, - struct usb_device *dev, int num); + struct libusb_config_descriptor *desc, int num); /* ne need to initialize to 0 since it is static */ static _usbDevice usbDevice[CCID_DRIVER_MAX_READERS]; -#define PCSCLITE_MANUKEY_NAME "ifdVendorID" -#define PCSCLITE_PRODKEY_NAME "ifdProductID" -#define PCSCLITE_NAMEKEY_NAME "ifdFriendlyName" +#define PCSCLITE_MANUKEY_NAME "ifdVendorID" +#define PCSCLITE_PRODKEY_NAME "ifdProductID" +#define PCSCLITE_NAMEKEY_NAME "ifdFriendlyName" struct _bogus_firmware { @@ -106,7 +144,6 @@ struct _bogus_firmware static struct _bogus_firmware Bogus_firmwares[] = { { 0x04e6, 0xe001, 0x0516 }, /* SCR 331 */ { 0x04e6, 0x5111, 0x0620 }, /* SCR 331-DI */ - { 0x04e6, 0x5115, 0x0514 }, /* SCR 335 */ { 0x04e6, 0xe003, 0x0510 }, /* SPR 532 */ { 0x0D46, 0x3001, 0x0037 }, /* KAAN Base */ { 0x0D46, 0x3002, 0x0037 }, /* KAAN Advanced */ @@ -115,6 +152,13 @@ static struct _bogus_firmware Bogus_firmwares[] = { { 0x0DC3, 0x1102, 0x0607 }, /* ASE IIIe KB USB */ { 0x058F, 0x9520, 0x0102 }, /* Alcor AU9520-G */ { 0x072F, 0x2200, 0x0206 }, /* ACS ACR122U-WB-R */ + { 0x08C3, 0x0402, 0x5000 }, /* Precise Biometrics Precise 200 MC */ + { 0x08C3, 0x0401, 0x5000 }, /* Precise Biometrics Precise 250 MC */ + { 0x0B0C, 0x0050, 0x0101 }, /* Todos Argos Mini II */ + { 0x0DC3, 0x0900, 0x0200 }, /* Athena IDProtect Key v2 */ + { 0x03F0, 0x0036, 0x0124 }, /* HP USB CCID Smartcard Keyboard */ + { 0x062D, 0x0001, 0x0102 }, /* THRC Smart Card Reader */ + { 0x04E6, 0x5291, 0x0112 }, /* SCM SCL010 Contactless Reader */ /* the firmware version is not correct since I do not have received a * working reader yet */ @@ -126,6 +170,29 @@ static struct _bogus_firmware Bogus_firmwares[] = { /* data rates supported by the secondary slots on the GemCore Pos Pro & SIM Pro */ unsigned int SerialCustomDataRates[] = { GEMPLUS_CUSTOM_DATA_RATES, 0 }; +/***************************************************************************** + * + * close_libusb_if_needed + * + ****************************************************************************/ +static void close_libusb_if_needed(void) +{ + int i, to_exit = TRUE; + + /* if at least 1 reader is still in use we do not exit libusb */ + for (i=0; inext) + /* for every device */ + i = 0; + while ((dev = devs[i++]) != NULL) { - struct usb_device *dev; + struct libusb_device_descriptor desc; + struct libusb_config_descriptor *config_desc; + uint8_t bus_number = libusb_get_bus_number(dev); + uint8_t device_address = libusb_get_device_address(dev); - /* any device on this bus */ - for (dev = bus->devices; dev; dev = dev->next) + int r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) { - /* device defined by name? */ - if (dirname && (strcmp(dirname, bus->dirname) - || strcmp(filename, dev->filename))) - continue; + DEBUG_INFO3("failed to get device descriptor for %d/%d", + bus_number, device_address); + continue; + } - if (dev->descriptor.idVendor == vendorID - && dev->descriptor.idProduct == productID) - { - int r, already_used; - struct usb_interface *usb_interface = NULL; - int interface; - int num = 0; + if (desc.idVendor == vendorID && desc.idProduct == productID) + { + int already_used; + const struct libusb_interface *usb_interface = NULL; + int interface; + int num = 0; + const unsigned char *device_descriptor; + int readerID = (vendorID << 16) + productID; #ifdef USE_COMPOSITE_AS_MULTISLOT - static int static_interface = 1; - - { - /* simulate a composite device as when libhal is - * used */ - int readerID = (vendorID << 16) + productID; + static int static_interface = 1; - if ((GEMALTOPROXDU == readerID) - || (GEMALTOPROXSU == readerID)) - { - if(interface_number >= 0) - { - DEBUG_CRITICAL("USE_COMPOSITE_AS_MULTISLOT can't be used with libhal"); - continue; - } - - /* the CCID interfaces are 1 and 2 */ - interface_number = static_interface; - } - } + /* simulate a composite device as when libudev is used */ + if ((GEMALTOPROXDU == readerID) + || (GEMALTOPROXSU == readerID)) + { + /* + * We can't talk to the two CCID interfaces + * at the same time (the reader enters a + * dead lock). So we simulate a multi slot + * reader. By default multi slot readers + * can't use the slots at the same time. See + * TAG_IFD_SLOT_THREAD_SAFE + * + * One side effect is that the two readers + * are seen by pcscd as one reader so the + * interface name is the same for the two. + * + * So we have: + * 0: Gemalto Prox-DU [Prox-DU Contact_09A00795] (09A00795) 00 00 + * 1: Gemalto Prox-DU [Prox-DU Contact_09A00795] (09A00795) 00 01 + * instead of + * 0: Gemalto Prox-DU [Prox-DU Contact_09A00795] (09A00795) 00 00 + * 1: Gemalto Prox-DU [Prox-DU Contactless_09A00795] (09A00795) 01 00 + */ + + /* the CCID interfaces are 1 and 2 */ + interface_number = static_interface; + } #endif - /* is it already opened? */ - already_used = FALSE; + /* is it already opened? */ + already_used = FALSE; - DEBUG_COMM3("Checking device: %s/%s", - bus->dirname, dev->filename); - for (r=0; rdirname) == 0 && strcmp(usbDevice[r].filename, dev->filename) == 0) - already_used = TRUE; - } + /* same bus, same address */ + if (usbDevice[r].bus_number == bus_number + && usbDevice[r].device_address == device_address) + already_used = TRUE; } + } - /* this reader is already managed by us */ - if (already_used) + /* this reader is already managed by us */ + if (already_used) + { + if ((previous_reader_index != -1) + && usbDevice[previous_reader_index].dev_handle + && (usbDevice[previous_reader_index].bus_number == bus_number) + && (usbDevice[previous_reader_index].device_address == device_address) + && usbDevice[previous_reader_index].ccid.bCurrentSlotIndex < usbDevice[previous_reader_index].ccid.bMaxSlotIndex) { - if ((previous_reader_index != -1) - && usbDevice[previous_reader_index].handle - && (strcmp(usbDevice[previous_reader_index].dirname, bus->dirname) == 0) - && (strcmp(usbDevice[previous_reader_index].filename, dev->filename) == 0) - && usbDevice[previous_reader_index].ccid.bCurrentSlotIndex < usbDevice[previous_reader_index].ccid.bMaxSlotIndex) + /* we reuse the same device + * and the reader is multi-slot */ + usbDevice[reader_index] = usbDevice[previous_reader_index]; + /* The other slots of GemCore SIM Pro firmware + * 1.0 do not have the same data rates. + * Firmware 2.0 do not have this limitation */ + if ((GEMCOREPOSPRO == readerID) + || ((GEMCORESIMPRO == readerID) + && (usbDevice[reader_index].ccid.IFD_bcdDevice < 0x0200))) { - /* we reuse the same device - * and the reader is multi-slot */ - usbDevice[reader_index] = usbDevice[previous_reader_index]; - /* the other slots do not have the same data rates */ - if ((GEMCOREPOSPRO == usbDevice[reader_index].ccid.readerID) - || (GEMCORESIMPRO == usbDevice[reader_index].ccid.readerID)) - { - usbDevice[reader_index].ccid.arrayOfSupportedDataRates = SerialCustomDataRates; - usbDevice[reader_index].ccid.dwMaxDataRate = 125000; - } - - *usbDevice[reader_index].nb_opened_slots += 1; - usbDevice[reader_index].ccid.bCurrentSlotIndex++; - usbDevice[reader_index].ccid.dwSlotStatus = - IFD_ICC_PRESENT; - DEBUG_INFO2("Opening slot: %d", - usbDevice[reader_index].ccid.bCurrentSlotIndex); - goto end; + usbDevice[reader_index].ccid.arrayOfSupportedDataRates = SerialCustomDataRates; + usbDevice[reader_index].ccid.dwMaxDataRate = 125000; } - else + + *usbDevice[reader_index].nb_opened_slots += 1; + usbDevice[reader_index].ccid.bCurrentSlotIndex++; + usbDevice[reader_index].ccid.dwSlotStatus = + IFD_ICC_PRESENT; + DEBUG_INFO2("Opening slot: %d", + usbDevice[reader_index].ccid.bCurrentSlotIndex); + + /* This is a multislot reader + * Init the multislot stuff for this next slot */ + usbDevice[reader_index].multislot_extension = Multi_CreateNextSlot(previous_reader_index); + goto end; + } + else + { + /* if an interface number is given by HAL we + * continue with this device. */ + if (-1 == interface_number) { - /* if an interface number is given by HAL we - * continue with this device. */ - if (-1 == interface_number) - { - DEBUG_INFO3("USB device %s/%s already in use." - " Checking next one.", - bus->dirname, dev->filename); - continue; - } + DEBUG_INFO3("USB device %d/%d already in use." + " Checking next one.", + bus_number, device_address); + continue; } } + } - DEBUG_COMM3("Trying to open USB bus/device: %s/%s", - bus->dirname, dev->filename); + DEBUG_COMM3("Trying to open USB bus/device: %d/%d", + bus_number, device_address); - dev_handle = usb_open(dev); - if (dev_handle == NULL) - { - DEBUG_CRITICAL4("Can't usb_open(%s/%s): %s", - bus->dirname, dev->filename, strerror(errno)); + r = libusb_open(dev, &dev_handle); + if (r < 0) + { + DEBUG_CRITICAL4("Can't libusb_open(%d/%d): %d", + bus_number, device_address, r); - continue; - } + continue; + } - /* now we found a free reader and we try to use it */ - if (dev->config == NULL) +again: + r = libusb_get_active_config_descriptor(dev, &config_desc); + if (r < 0) + { +#ifdef __APPLE__ + /* Some early Gemalto Ezio CB+ readers have + * bDeviceClass, bDeviceSubClass and bDeviceProtocol set + * to 0xFF (proprietary) instead of 0x00. + * + * So on Mac OS X the reader configuration is not done + * by the OS/kernel and we do it ourself. + */ + if ((0xFF == desc.bDeviceClass) + && (0xFF == desc.bDeviceSubClass) + && (0xFF == desc.bDeviceProtocol)) { - (void)usb_close(dev_handle); - DEBUG_CRITICAL3("No dev->config found for %s/%s", - bus->dirname, dev->filename); - return STATUS_UNSUCCESSFUL; + r = libusb_set_configuration(dev_handle, 1); + if (r < 0) + { + (void)libusb_close(dev_handle); + DEBUG_CRITICAL4("Can't set configuration on %d/%d: %d", + bus_number, device_address, r); + continue; + } } -again: - usb_interface = get_ccid_usb_interface(dev, &num); - if (usb_interface == NULL) + /* recall */ + r = libusb_get_active_config_descriptor(dev, &config_desc); + if (r < 0) { - (void)usb_close(dev_handle); - if (0 == num) - DEBUG_CRITICAL3("Can't find a CCID interface on %s/%s", - bus->dirname, dev->filename); - interface_number = -1; +#endif + (void)libusb_close(dev_handle); + DEBUG_CRITICAL4("Can't get config descriptor on %d/%d: %d", + bus_number, device_address, r); continue; } +#ifdef __APPLE__ + } +#endif - if (usb_interface->altsetting->extralen != 54) - { - (void)usb_close(dev_handle); - DEBUG_CRITICAL4("Extra field for %s/%s has a wrong length: %d", bus->dirname, dev->filename, usb_interface->altsetting->extralen); - return STATUS_UNSUCCESSFUL; - } - interface = usb_interface->altsetting->bInterfaceNumber; - if (interface_number >= 0 && interface != interface_number) - { - /* an interface was specified and it is not the - * current one */ - DEBUG_INFO3("Wrong interface for USB device %s/%s." - " Checking next one.", bus->dirname, dev->filename); + usb_interface = get_ccid_usb_interface(config_desc, &num); + if (usb_interface == NULL) + { + (void)libusb_close(dev_handle); + if (0 == num) + DEBUG_CRITICAL3("Can't find a CCID interface on %d/%d", + bus_number, device_address); + interface_number = -1; + continue; + } + + device_descriptor = get_ccid_device_descriptor(usb_interface); + if (NULL == device_descriptor) + { + (void)libusb_close(dev_handle); + DEBUG_CRITICAL3("Unable to find the device descriptor for %d/%d", + bus_number, device_address); + return_value = STATUS_UNSUCCESSFUL; + goto end2; + } - /* check for another CCID interface on the same device */ - num++; + interface = usb_interface->altsetting->bInterfaceNumber; + if (interface_number >= 0 && interface != interface_number) + { + /* an interface was specified and it is not the + * current one */ + DEBUG_INFO3("Found interface %d but expecting %d", + interface_number, interface); + DEBUG_INFO3("Wrong interface for USB device %d/%d." + " Checking next one.", bus_number, device_address); - goto again; - } + /* check for another CCID interface on the same device */ + num++; - if (usb_claim_interface(dev_handle, interface) < 0) - { - (void)usb_close(dev_handle); - DEBUG_CRITICAL4("Can't claim interface %s/%s: %s", - bus->dirname, dev->filename, strerror(errno)); - interface_number = -1; - continue; - } + goto again; + } - DEBUG_INFO4("Found Vendor/Product: %04X/%04X (%s)", - dev->descriptor.idVendor, - dev->descriptor.idProduct, keyValue); - DEBUG_INFO3("Using USB bus/device: %s/%s", - bus->dirname, dev->filename); + r = libusb_claim_interface(dev_handle, interface); + if (r < 0) + { + (void)libusb_close(dev_handle); + DEBUG_CRITICAL4("Can't claim interface %d/%d: %d", + bus_number, device_address, r); + claim_failed = TRUE; + interface_number = -1; + continue; + } - /* check for firmware bugs */ - if (ccid_check_firmware(dev)) - { - (void)usb_close(dev_handle); - return STATUS_UNSUCCESSFUL; - } + DEBUG_INFO4("Found Vendor/Product: %04X/%04X (%s)", + desc.idVendor, desc.idProduct, friendlyName); + DEBUG_INFO3("Using USB bus/device: %d/%d", + bus_number, device_address); + + /* check for firmware bugs */ + if (ccid_check_firmware(&desc)) + { + (void)libusb_close(dev_handle); + return_value = STATUS_UNSUCCESSFUL; + goto end2; + } #ifdef USE_COMPOSITE_AS_MULTISLOT - /* use the next interface for the next "slot" */ - static_interface++; + /* use the next interface for the next "slot" */ + static_interface++; - /* reset for a next reader */ - if (static_interface > 2) - static_interface = 1; + /* reset for a next reader */ + if (static_interface > 2) + static_interface = 1; #endif - /* Get Endpoints values*/ - (void)get_end_points(dev, &usbDevice[reader_index], num); - - /* store device information */ - usbDevice[reader_index].handle = dev_handle; - usbDevice[reader_index].dirname = strdup(bus->dirname); - usbDevice[reader_index].filename = strdup(dev->filename); - usbDevice[reader_index].interface = interface; - usbDevice[reader_index].real_nb_opened_slots = 1; - usbDevice[reader_index].nb_opened_slots = &usbDevice[reader_index].real_nb_opened_slots; - - /* CCID common informations */ - usbDevice[reader_index].ccid.real_bSeq = 0; - usbDevice[reader_index].ccid.pbSeq = &usbDevice[reader_index].ccid.real_bSeq; - usbDevice[reader_index].ccid.readerID = - (dev->descriptor.idVendor << 16) + - dev->descriptor.idProduct; - usbDevice[reader_index].ccid.dwFeatures = dw2i(usb_interface->altsetting->extra, 40); - usbDevice[reader_index].ccid.wLcdLayout = - (usb_interface->altsetting->extra[51] << 8) + - usb_interface->altsetting->extra[50]; - usbDevice[reader_index].ccid.bPINSupport = usb_interface->altsetting->extra[52]; - usbDevice[reader_index].ccid.dwMaxCCIDMessageLength = dw2i(usb_interface->altsetting->extra, 44); - usbDevice[reader_index].ccid.dwMaxIFSD = dw2i(usb_interface->altsetting->extra, 28); - usbDevice[reader_index].ccid.dwDefaultClock = dw2i(usb_interface->altsetting->extra, 10); - usbDevice[reader_index].ccid.dwMaxDataRate = dw2i(usb_interface->altsetting->extra, 23); - usbDevice[reader_index].ccid.bMaxSlotIndex = usb_interface->altsetting->extra[4]; - usbDevice[reader_index].ccid.bCurrentSlotIndex = 0; - usbDevice[reader_index].ccid.readTimeout = DEFAULT_COM_READ_TIMEOUT; - usbDevice[reader_index].ccid.arrayOfSupportedDataRates = get_data_rates(reader_index, dev, num); - usbDevice[reader_index].ccid.bInterfaceProtocol = usb_interface->altsetting->bInterfaceProtocol; - usbDevice[reader_index].ccid.bNumEndpoints = usb_interface->altsetting->bNumEndpoints; - usbDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT; - usbDevice[reader_index].ccid.bVoltageSupport = usb_interface->altsetting->extra[5]; - goto end; + /* Get Endpoints values*/ + (void)get_end_points(config_desc, &usbDevice[reader_index], num); + + /* store device information */ + usbDevice[reader_index].dev_handle = dev_handle; + usbDevice[reader_index].bus_number = bus_number; + usbDevice[reader_index].device_address = device_address; + usbDevice[reader_index].interface = interface; + usbDevice[reader_index].real_nb_opened_slots = 1; + usbDevice[reader_index].nb_opened_slots = &usbDevice[reader_index].real_nb_opened_slots; + usbDevice[reader_index].polling_transfer = NULL; + + /* CCID common informations */ + usbDevice[reader_index].ccid.real_bSeq = 0; + usbDevice[reader_index].ccid.pbSeq = &usbDevice[reader_index].ccid.real_bSeq; + usbDevice[reader_index].ccid.readerID = + (desc.idVendor << 16) + desc.idProduct; + usbDevice[reader_index].ccid.dwFeatures = dw2i(device_descriptor, 40); + usbDevice[reader_index].ccid.wLcdLayout = + (device_descriptor[51] << 8) + device_descriptor[50]; + usbDevice[reader_index].ccid.bPINSupport = device_descriptor[52]; + usbDevice[reader_index].ccid.dwMaxCCIDMessageLength = dw2i(device_descriptor, 44); + usbDevice[reader_index].ccid.dwMaxIFSD = dw2i(device_descriptor, 28); + usbDevice[reader_index].ccid.dwDefaultClock = dw2i(device_descriptor, 10); + usbDevice[reader_index].ccid.dwMaxDataRate = dw2i(device_descriptor, 23); + usbDevice[reader_index].ccid.bMaxSlotIndex = device_descriptor[4]; + usbDevice[reader_index].ccid.bCurrentSlotIndex = 0; + usbDevice[reader_index].ccid.readTimeout = DEFAULT_COM_READ_TIMEOUT; + usbDevice[reader_index].ccid.arrayOfSupportedDataRates = get_data_rates(reader_index, config_desc, num); + usbDevice[reader_index].ccid.bInterfaceProtocol = usb_interface->altsetting->bInterfaceProtocol; + usbDevice[reader_index].ccid.bNumEndpoints = usb_interface->altsetting->bNumEndpoints; + usbDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT; + usbDevice[reader_index].ccid.bVoltageSupport = device_descriptor[5]; + usbDevice[reader_index].ccid.sIFD_serial_number = NULL; + usbDevice[reader_index].ccid.gemalto_firmware_features = NULL; + usbDevice[reader_index].ccid.zlp = FALSE; + if (desc.iSerialNumber) + { + unsigned char serial[128]; + int ret; + + ret = libusb_get_string_descriptor_ascii(dev_handle, + desc.iSerialNumber, serial, + sizeof(serial)); + if (ret > 0) + usbDevice[reader_index].ccid.sIFD_serial_number + = strdup((char *)serial); + } + + usbDevice[reader_index].ccid.sIFD_iManufacturer = NULL; + if (desc.iManufacturer) + { + unsigned char iManufacturer[128]; + int ret; + + ret = libusb_get_string_descriptor_ascii(dev_handle, + desc.iManufacturer, iManufacturer, + sizeof(iManufacturer)); + if (ret > 0) + usbDevice[reader_index].ccid.sIFD_iManufacturer + = strdup((char *)iManufacturer); } + + usbDevice[reader_index].ccid.IFD_bcdDevice = desc.bcdDevice; + + /* If this is a multislot reader, init the multislot stuff */ + if (usbDevice[reader_index].ccid.bMaxSlotIndex) + usbDevice[reader_index].multislot_extension = Multi_CreateFirstSlot(reader_index); + else + usbDevice[reader_index].multislot_extension = NULL; + + goto end; } } } end: - if (usbDevice[reader_index].handle == NULL) + if (usbDevice[reader_index].dev_handle == NULL) + { + close_libusb_if_needed(); + if (claim_failed) + return STATUS_COMM_ERROR; return STATUS_NO_SUCH_DEVICE; + } /* memorise the current reader_index so we can detect * a new OpenUSBByName on a multi slot reader */ previous_reader_index = reader_index; - return STATUS_SUCCESS; +end2: + /* free the libusb allocated list & devices */ + libusb_free_device_list(devs, 1); + +end1: + /* free bundle list */ + bundleRelease(&plist); + + return return_value; } /* OpenUSBByName */ @@ -578,24 +716,35 @@ status_t WriteUSB(unsigned int reader_index, unsigned int length, unsigned char *buffer) { int rv; + int actual_length; char debug_header[] = "-> 121234 "; (void)snprintf(debug_header, sizeof(debug_header), "-> %06X ", (int)reader_index); + if (usbDevice[reader_index].ccid.zlp) + { /* Zero Length Packet */ + int dummy_length; + + /* try to read a ZLP so transfer length = 0 + * timeout of 1 ms */ + (void)libusb_bulk_transfer(usbDevice[reader_index].dev_handle, + usbDevice[reader_index].bulk_in, NULL, 0, &dummy_length, 1); + } + DEBUG_XXD(debug_header, buffer, length); - rv = usb_bulk_write(usbDevice[reader_index].handle, - usbDevice[reader_index].bulk_out, (char *)buffer, length, - USB_WRITE_TIMEOUT); + rv = libusb_bulk_transfer(usbDevice[reader_index].dev_handle, + usbDevice[reader_index].bulk_out, buffer, length, + &actual_length, USB_WRITE_TIMEOUT); if (rv < 0) { - DEBUG_CRITICAL4("usb_bulk_write(%s/%s): %s", - usbDevice[reader_index].dirname, usbDevice[reader_index].filename, - strerror(errno)); + DEBUG_CRITICAL5("write failed (%d/%d): %d %s", + usbDevice[reader_index].bus_number, + usbDevice[reader_index].device_address, rv, strerror(errno)); - if (ENODEV == errno) + if ((ENODEV == errno) || (LIBUSB_ERROR_NO_DEVICE == rv)) return STATUS_NO_SUCH_DEVICE; return STATUS_UNSUCCESSFUL; @@ -614,6 +763,7 @@ status_t ReadUSB(unsigned int reader_index, unsigned int * length, unsigned char *buffer) { int rv; + int actual_length; char debug_header[] = "<- 121234 "; _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); int duplicate_frame = 0; @@ -622,24 +772,24 @@ status_t ReadUSB(unsigned int reader_index, unsigned int * length, (void)snprintf(debug_header, sizeof(debug_header), "<- %06X ", (int)reader_index); - rv = usb_bulk_read(usbDevice[reader_index].handle, - usbDevice[reader_index].bulk_in, (char *)buffer, *length, - usbDevice[reader_index].ccid.readTimeout * 1000); + rv = libusb_bulk_transfer(usbDevice[reader_index].dev_handle, + usbDevice[reader_index].bulk_in, buffer, *length, + &actual_length, usbDevice[reader_index].ccid.readTimeout); if (rv < 0) { *length = 0; - DEBUG_CRITICAL4("usb_bulk_read(%s/%s): %s", - usbDevice[reader_index].dirname, usbDevice[reader_index].filename, - strerror(errno)); + DEBUG_CRITICAL5("read failed (%d/%d): %d %s", + usbDevice[reader_index].bus_number, + usbDevice[reader_index].device_address, rv, strerror(errno)); - if (ENODEV == errno) + if ((ENODEV == errno) || (LIBUSB_ERROR_NO_DEVICE == rv)) return STATUS_NO_SUCH_DEVICE; return STATUS_UNSUCCESSFUL; } - *length = rv; + *length = actual_length; DEBUG_XXD(debug_header, buffer, *length); @@ -669,19 +819,12 @@ status_t ReadUSB(unsigned int reader_index, unsigned int * length, status_t CloseUSB(unsigned int reader_index) { /* device not opened */ - if (usbDevice[reader_index].handle == NULL) + if (usbDevice[reader_index].dev_handle == NULL) return STATUS_UNSUCCESSFUL; - DEBUG_COMM3("Closing USB device: %s/%s", - usbDevice[reader_index].dirname, - usbDevice[reader_index].filename); - - if (usbDevice[reader_index].ccid.arrayOfSupportedDataRates - && (usbDevice[reader_index].ccid.bCurrentSlotIndex == 0)) - { - free(usbDevice[reader_index].ccid.arrayOfSupportedDataRates); - usbDevice[reader_index].ccid.arrayOfSupportedDataRates = NULL; - } + DEBUG_COMM3("Closing USB device: %d/%d", + usbDevice[reader_index].bus_number, + usbDevice[reader_index].device_address); /* one slot closed */ (*usbDevice[reader_index].nb_opened_slots)--; @@ -689,26 +832,58 @@ status_t CloseUSB(unsigned int reader_index) /* release the allocated ressources for the last slot only */ if (0 == *usbDevice[reader_index].nb_opened_slots) { + struct usbDevice_MultiSlot_Extension *msExt; + DEBUG_COMM("Last slot closed. Release resources"); + msExt = usbDevice[reader_index].multislot_extension; + /* If this is a multislot reader, close using the multislot stuff */ + if (msExt) + { + /* terminate the interrupt waiter thread */ + Multi_PollingTerminate(msExt); + + /* wait for the thread to actually terminate */ + pthread_join(msExt->thread_proc, NULL); + + /* release the shared objects */ + pthread_cond_destroy(&msExt->condition); + pthread_mutex_destroy(&msExt->mutex); + + /* Deallocate the extension itself */ + free(msExt); + + /* Stop the slot */ + usbDevice[reader_index].multislot_extension = NULL; + } + + if (usbDevice[reader_index].ccid.gemalto_firmware_features) + free(usbDevice[reader_index].ccid.gemalto_firmware_features); + + if (usbDevice[reader_index].ccid.sIFD_serial_number) + free(usbDevice[reader_index].ccid.sIFD_serial_number); + + if (usbDevice[reader_index].ccid.sIFD_iManufacturer) + free(usbDevice[reader_index].ccid.sIFD_iManufacturer); + /* reset so that bSeq starts at 0 again */ if (DriverOptions & DRIVER_OPTION_RESET_ON_CLOSE) - (void)usb_reset(usbDevice[reader_index].handle); + (void)libusb_reset_device(usbDevice[reader_index].dev_handle); - (void)usb_release_interface(usbDevice[reader_index].handle, - usbDevice[reader_index].interface); - (void)usb_close(usbDevice[reader_index].handle); + if (usbDevice[reader_index].ccid.arrayOfSupportedDataRates) + free(usbDevice[reader_index].ccid.arrayOfSupportedDataRates); - free(usbDevice[reader_index].dirname); - free(usbDevice[reader_index].filename); + (void)libusb_release_interface(usbDevice[reader_index].dev_handle, + usbDevice[reader_index].interface); + (void)libusb_close(usbDevice[reader_index].dev_handle); } /* mark the resource unused */ - usbDevice[reader_index].handle = NULL; - usbDevice[reader_index].dirname = NULL; - usbDevice[reader_index].filename = NULL; + usbDevice[reader_index].dev_handle = NULL; usbDevice[reader_index].interface = 0; + close_libusb_if_needed(); + return STATUS_SUCCESS; } /* CloseUSB */ @@ -724,17 +899,61 @@ _ccid_descriptor *get_ccid_descriptor(unsigned int reader_index) } /* get_ccid_descriptor */ +/***************************************************************************** + * + * get_ccid_device_descriptor + * + ****************************************************************************/ +const unsigned char *get_ccid_device_descriptor(const struct libusb_interface *usb_interface) +{ +#ifdef O2MICRO_OZ776_PATCH + uint8_t last_endpoint; +#endif + + if (54 == usb_interface->altsetting->extra_length) + return usb_interface->altsetting->extra; + + if (0 != usb_interface->altsetting->extra_length) + { + /* If extra_length is zero, the descriptor might be at + * the end, but if it's not zero, we have a + * problem. */ + DEBUG_CRITICAL2("Extra field has a wrong length: %d", + usb_interface->altsetting->extra_length); + return NULL; + } + +#ifdef O2MICRO_OZ776_PATCH + /* Some devices, such as the Oz776, Reiner SCT and bludrive II + * report the device descriptor at the end of the endpoint + * descriptors; to support those, look for it at the end as well. + */ + last_endpoint = usb_interface->altsetting->bNumEndpoints-1; + if (usb_interface->altsetting->endpoint + && usb_interface->altsetting->endpoint[last_endpoint].extra_length == 54) + return usb_interface->altsetting->endpoint[last_endpoint].extra; +#else + DEBUG_CRITICAL2("Extra field has a wrong length: %d", + usb_interface->altsetting->extra_length); +#endif + + return NULL; +} /* get_ccid_device_descriptor */ + + /***************************************************************************** * * get_end_points * ****************************************************************************/ -static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, - int num) +static int get_end_points(struct libusb_config_descriptor *desc, + _usbDevice *usbdevice, int num) { int i; int bEndpointAddress; - struct usb_interface *usb_interface = get_ccid_usb_interface(dev, &num); + const struct libusb_interface *usb_interface; + + usb_interface = get_ccid_usb_interface(desc, &num); /* * 3 Endpoints maximum: Interrupt In, Bulk In, Bulk Out @@ -742,21 +961,27 @@ static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, for (i=0; ialtsetting->bNumEndpoints; i++) { /* interrupt end point (if available) */ - if (usb_interface->altsetting->endpoint[i].bmAttributes == USB_ENDPOINT_TYPE_INTERRUPT) + if (usb_interface->altsetting->endpoint[i].bmAttributes + == LIBUSB_TRANSFER_TYPE_INTERRUPT) { - usbdevice->interrupt = usb_interface->altsetting->endpoint[i].bEndpointAddress; + usbdevice->interrupt = + usb_interface->altsetting->endpoint[i].bEndpointAddress; continue; } - if (usb_interface->altsetting->endpoint[i].bmAttributes != USB_ENDPOINT_TYPE_BULK) + if (usb_interface->altsetting->endpoint[i].bmAttributes + != LIBUSB_TRANSFER_TYPE_BULK) continue; - bEndpointAddress = usb_interface->altsetting->endpoint[i].bEndpointAddress; + bEndpointAddress = + usb_interface->altsetting->endpoint[i].bEndpointAddress; - if ((bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_IN) + if ((bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) + == LIBUSB_ENDPOINT_IN) usbdevice->bulk_in = bEndpointAddress; - if ((bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_OUT) + if ((bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) + == LIBUSB_ENDPOINT_OUT) usbdevice->bulk_out = bEndpointAddress; } @@ -769,58 +994,29 @@ static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, * get_ccid_usb_interface * ****************************************************************************/ -/*@null@*/ EXTERNAL struct usb_interface * get_ccid_usb_interface( - struct usb_device *dev, int *num) +/*@null@*/ EXTERNAL const struct libusb_interface * get_ccid_usb_interface( + struct libusb_config_descriptor *desc, int *num) { - struct usb_interface *usb_interface = NULL; + const struct libusb_interface *usb_interface = NULL; int i; -#ifdef O2MICRO_OZ776_PATCH - int readerID; -#endif /* if multiple interfaces use the first one with CCID class type */ - for (i = *num; dev->config && iconfig->bNumInterfaces; i++) + for (i = *num; i < desc->bNumInterfaces; i++) { /* CCID Class? */ - if (dev->config->interface[i].altsetting->bInterfaceClass == 0xb + if (desc->interface[i].altsetting->bInterfaceClass == 0xb #ifdef ALLOW_PROPRIETARY_CLASS - || dev->config->interface[i].altsetting->bInterfaceClass == 0xff + || desc->interface[i].altsetting->bInterfaceClass == 0xff #endif ) { - usb_interface = &dev->config->interface[i]; + usb_interface = &desc->interface[i]; /* store the interface number for further reference */ *num = i; break; } } -#ifdef O2MICRO_OZ776_PATCH - readerID = (dev->descriptor.idVendor << 16) + dev->descriptor.idProduct; - if (usb_interface != NULL - && ((OZ776 == readerID) || (OZ776_7772 == readerID) - || (REINER_SCT == readerID) || (BLUDRIVEII_CCID == readerID)) - && (0 == usb_interface->altsetting->extralen)) /* this is the bug */ - { - int j; - for (j=0; jaltsetting->bNumEndpoints; j++) - { - /* find the extra[] array */ - if (54 == usb_interface->altsetting->endpoint[j].extralen) - { - /* get the extra[] from the endpoint */ - usb_interface->altsetting->extralen = 54; - usb_interface->altsetting->extra = - usb_interface->altsetting->endpoint[j].extra; - /* avoid double free on close */ - usb_interface->altsetting->endpoint[j].extra = NULL; - usb_interface->altsetting->endpoint[j].extralen = 0; - break; - } - } - } -#endif - return usb_interface; } /* get_ccid_usb_interface */ @@ -830,33 +1026,31 @@ static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, * ccid_check_firmware * ****************************************************************************/ -int ccid_check_firmware(struct usb_device *dev) +int ccid_check_firmware(struct libusb_device_descriptor *desc) { unsigned int i; - for (i=0; idescriptor.idVendor != Bogus_firmwares[i].vendor) + if (desc->idVendor != Bogus_firmwares[i].vendor) continue; - if (dev->descriptor.idProduct != Bogus_firmwares[i].product) + if (desc->idProduct != Bogus_firmwares[i].product) continue; /* firmware too old and buggy */ - if (dev->descriptor.bcdDevice < Bogus_firmwares[i].firmware) + if (desc->bcdDevice < Bogus_firmwares[i].firmware) { if (DriverOptions & DRIVER_OPTION_USE_BOGUS_FIRMWARE) { DEBUG_INFO3("Firmware (%X.%02X) is bogus! but you choosed to use it", - dev->descriptor.bcdDevice >> 8, - dev->descriptor.bcdDevice & 0xFF); + desc->bcdDevice >> 8, desc->bcdDevice & 0xFF); return FALSE; } else { DEBUG_CRITICAL3("Firmware (%X.%02X) is bogus! Upgrade the reader firmware or get a new reader.", - dev->descriptor.bcdDevice >> 8, - dev->descriptor.bcdDevice & 0xFF); + desc->bcdDevice >> 8, desc->bcdDevice & 0xFF); return TRUE; } } @@ -869,15 +1063,15 @@ int ccid_check_firmware(struct usb_device *dev) /***************************************************************************** * - * get_data_rates + * get_data_rates * ****************************************************************************/ static unsigned int *get_data_rates(unsigned int reader_index, - struct usb_device *dev, int num) + struct libusb_config_descriptor *desc, int num) { int n, i, len; unsigned char buffer[256*sizeof(int)]; /* maximum is 256 records */ - unsigned int *int_array; + unsigned int *uint_array; /* See CCID 3.7.3 page 25 */ n = ControlUSB(reader_index, @@ -889,8 +1083,7 @@ static unsigned int *get_data_rates(unsigned int reader_index, /* we got an error? */ if (n <= 0) { - DEBUG_INFO2("IFD does not support GET_DATA_RATES request: %s", - strerror(errno)); + DEBUG_INFO2("IFD does not support GET_DATA_RATES request: %d", n); return NULL; } @@ -905,7 +1098,7 @@ static unsigned int *get_data_rates(unsigned int reader_index, n /= sizeof(int); /* we do not get the expected number of data rates */ - len = get_ccid_usb_interface(dev, &num)->altsetting->extra[27]; /* bNumDataRatesSupported */ + len = get_ccid_device_descriptor(get_ccid_usb_interface(desc, &num))[27]; /* bNumDataRatesSupported */ if ((n != len) && len) { DEBUG_INFO3("Got %d data rates but was expecting %d", n, len); @@ -915,8 +1108,8 @@ static unsigned int *get_data_rates(unsigned int reader_index, n = len; } - int_array = calloc(n+1, sizeof(int)); - if (NULL == int_array) + uint_array = calloc(n+1, sizeof(uint_array[0])); + if (NULL == uint_array) { DEBUG_CRITICAL("Memory allocation failed"); return NULL; @@ -925,20 +1118,20 @@ static unsigned int *get_data_rates(unsigned int reader_index, /* convert in correct endianess */ for (i=0; iuser_data; + *completed = 1; + /* caller interprets results and frees transfer */ +} + /***************************************************************************** * * InterruptRead @@ -968,25 +1182,470 @@ int ControlUSB(int reader_index, int requesttype, int request, int value, ****************************************************************************/ int InterruptRead(int reader_index, int timeout /* in ms */) { - int ret; - char buffer[8]; + int ret, actual_length; + int return_value = IFD_SUCCESS; + unsigned char buffer[8]; + struct libusb_transfer *transfer; + int completed = 0; + + /* Multislot reader: redirect to Multi_InterrupRead */ + if (usbDevice[reader_index].multislot_extension != NULL) + return Multi_InterruptRead(reader_index, timeout); DEBUG_PERIODIC2("before (%d)", reader_index); - ret = usb_interrupt_read(usbDevice[reader_index].handle, - usbDevice[reader_index].interrupt, buffer, sizeof(buffer), timeout); - DEBUG_PERIODIC3("after (%d) (%s)", reader_index, usb_strerror()); - if (ret < 0) + transfer = libusb_alloc_transfer(0); + if (NULL == transfer) + return LIBUSB_ERROR_NO_MEM; + + libusb_fill_bulk_transfer(transfer, + usbDevice[reader_index].dev_handle, + usbDevice[reader_index].interrupt, buffer, sizeof(buffer), + bulk_transfer_cb, &completed, timeout); + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + + ret = libusb_submit_transfer(transfer); + if (ret < 0) { + libusb_free_transfer(transfer); + return ret; + } + + usbDevice[reader_index].polling_transfer = transfer; + + while (!completed) { - /* if usb_interrupt_read() times out we get EILSEQ or EAGAIN */ - if ((errno != EILSEQ) && (errno != EAGAIN) && (errno != ENODEV) && (errno != 0)) - DEBUG_COMM4("usb_interrupt_read(%s/%s): %s", - usbDevice[reader_index].dirname, - usbDevice[reader_index].filename, strerror(errno)); + ret = libusb_handle_events(ctx); + if (ret < 0) + { + if (ret == LIBUSB_ERROR_INTERRUPTED) + continue; + libusb_cancel_transfer(transfer); + while (!completed) + if (libusb_handle_events(ctx) < 0) + break; + libusb_free_transfer(transfer); + return ret; + } } - else - DEBUG_XXD("NotifySlotChange: ", buffer, ret); - return ret; + actual_length = transfer->actual_length; + ret = transfer->status; + + usbDevice[reader_index].polling_transfer = NULL; + libusb_free_transfer(transfer); + + DEBUG_PERIODIC3("after (%d) (%d)", reader_index, ret); + + switch (ret) + { + case LIBUSB_TRANSFER_COMPLETED: + DEBUG_XXD("NotifySlotChange: ", buffer, actual_length); + break; + + case LIBUSB_TRANSFER_TIMED_OUT: + break; + + default: + /* if libusb_interrupt_transfer() times out we get EILSEQ or EAGAIN */ + DEBUG_COMM4("InterruptRead (%d/%d): %s", + usbDevice[reader_index].bus_number, + usbDevice[reader_index].device_address, strerror(errno)); + return_value = IFD_COMMUNICATION_ERROR; + } + + return return_value; } /* InterruptRead */ + +/***************************************************************************** + * + * Stop the async loop + * + ****************************************************************************/ +void InterruptStop(int reader_index) +{ + struct libusb_transfer *transfer; + + /* Multislot reader: redirect to Multi_InterrupStop */ + if (usbDevice[reader_index].multislot_extension != NULL) + { + Multi_InterruptStop(reader_index); + return; + } + + transfer = usbDevice[reader_index].polling_transfer; + usbDevice[reader_index].polling_transfer = NULL; + if (transfer) + { + int ret; + + ret = libusb_cancel_transfer(transfer); + if (ret < 0) + DEBUG_CRITICAL2("libusb_cancel_transfer failed: %d", ret); + } +} /* InterruptStop */ + + +/***************************************************************************** + * + * Multi_PollingProc + * + ****************************************************************************/ +static void *Multi_PollingProc(void *p_ext) +{ + struct usbDevice_MultiSlot_Extension *msExt = p_ext; + int rv, status, actual_length; + unsigned char buffer[CCID_INTERRUPT_SIZE]; + struct libusb_transfer *transfer; + int completed; + + DEBUG_COMM3("Multi_PollingProc (%d/%d): thread starting", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address); + + rv = 0; + while (!msExt->terminated) + { + DEBUG_COMM3("Multi_PollingProc (%d/%d): waiting", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address); + + transfer = libusb_alloc_transfer(0); + if (NULL == transfer) + { + rv = LIBUSB_ERROR_NO_MEM; + DEBUG_COMM2("libusb_alloc_transfer err %d", rv); + break; + } + + libusb_fill_bulk_transfer(transfer, + usbDevice[msExt->reader_index].dev_handle, + usbDevice[msExt->reader_index].interrupt, + buffer, CCID_INTERRUPT_SIZE, + bulk_transfer_cb, &completed, 0); /* No timeout ! */ + + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + + rv = libusb_submit_transfer(transfer); + if (rv) + { + DEBUG_COMM2("libusb_submit_transfer err %d", rv); + break; + } + + usbDevice[msExt->reader_index].polling_transfer = transfer; + + completed = 0; + while (!completed && !msExt->terminated) + { + rv = libusb_handle_events(ctx); + if (rv < 0) + { + DEBUG_COMM2("libusb_handle_events err %d", rv); + + if (rv == LIBUSB_ERROR_INTERRUPTED) + continue; + + libusb_cancel_transfer(transfer); + + while (!completed && !msExt->terminated) + { + if (libusb_handle_events(ctx) < 0) + break; + } + + break; + } + } + + usbDevice[msExt->reader_index].polling_transfer = NULL; + + if (rv < 0) + libusb_free_transfer(transfer); + else + { + int b, slot; + + actual_length = transfer->actual_length; + status = transfer->status; + + libusb_free_transfer(transfer); + + switch (status) + { + case LIBUSB_TRANSFER_COMPLETED: + DEBUG_COMM3("Multi_PollingProc (%d/%d): OK", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address); + DEBUG_XXD("NotifySlotChange: ", buffer, actual_length); + + /* log the RDR_to_PC_NotifySlotChange data */ + slot = 0; + for (b=0; b> (s*2)) & 3); + const char *present, *change; + + present = (slot_status & 1) ? "present" : "absent"; + change = (slot_status & 2) ? "status changed" : "no change"; + + DEBUG_COMM3("slot %d status: %d", + s + b*4, slot_status); + DEBUG_COMM3("ICC %s, %s", present, change); + } + slot += 4; + } + break; + + case LIBUSB_TRANSFER_TIMED_OUT: + DEBUG_COMM3("Multi_PollingProc (%d/%d): Timeout", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address); + break; + + default: + /* if libusb_interrupt_transfer() times out + * we get EILSEQ or EAGAIN */ + DEBUG_COMM4("Multi_PollingProc (%d/%d): %d", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address, + status); + } + + /* Tell other slots that there's a new interrupt buffer */ + DEBUG_COMM3("Multi_PollingProc (%d/%d): Broadcast to slot(s)", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address); + + /* Lock the mutex */ + pthread_mutex_lock(&msExt->mutex); + + /* Set the status and the interrupt buffer */ + msExt->status = status; + memset(msExt->buffer, 0, sizeof msExt->buffer); + memcpy(msExt->buffer, buffer, actual_length); + + /* Broadcast the condition and unlock */ + pthread_cond_broadcast(&msExt->condition); + pthread_mutex_unlock(&msExt->mutex); + } + } + + msExt->terminated = TRUE; + + if (rv < 0) + { + DEBUG_CRITICAL4("Multi_PollingProc (%d/%d): error %d", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address, rv); + } + + /* Wake up the slot threads so they will exit as well */ + + /* Lock the mutex */ + pthread_mutex_lock(&msExt->mutex); + + /* Set the status and fill-in the interrupt buffer */ + msExt->status = 0; + memset(msExt->buffer, 0xFF, sizeof msExt->buffer); + + /* Broadcast the condition */ + pthread_cond_broadcast(&msExt->condition); + + /* Unlock */ + pthread_mutex_unlock(&msExt->mutex); + + /* Now exit */ + DEBUG_COMM3("Multi_PollingProc (%d/%d): Thread terminated", + usbDevice[msExt->reader_index].bus_number, + usbDevice[msExt->reader_index].device_address); + + pthread_exit(NULL); + return NULL; +} /* Multi_PollingProc */ + + +/***************************************************************************** + * + * Multi_PollingTerminate + * + ****************************************************************************/ +static void Multi_PollingTerminate(struct usbDevice_MultiSlot_Extension *msExt) +{ + struct libusb_transfer *transfer; + + if (msExt && !msExt->terminated) + { + msExt->terminated = TRUE; + + transfer = usbDevice[msExt->reader_index].polling_transfer; + + if (transfer) + { + int ret; + + ret = libusb_cancel_transfer(transfer); + if (ret < 0) + DEBUG_CRITICAL2("libusb_cancel_transfer failed: %d", ret); + } + } +} /* Multi_PollingTerminate */ + + +/***************************************************************************** + * + * Multi_InterruptRead + * + ****************************************************************************/ +static int Multi_InterruptRead(int reader_index, int timeout /* in ms */) +{ + struct usbDevice_MultiSlot_Extension *msExt; + unsigned char buffer[CCID_INTERRUPT_SIZE]; + struct timespec cond_wait_until; + struct timeval local_time; + int rv, status, interrupt_byte, interrupt_mask; + + msExt = usbDevice[reader_index].multislot_extension; + + /* When stopped, return 0 so IFDHPolling will return IFD_NO_SUCH_DEVICE */ + if ((msExt == NULL) || msExt->terminated) + return 0; + + DEBUG_PERIODIC3("Multi_InterruptRead (%d), timeout: %d ms", + reader_index, timeout); + + /* Select the relevant bit in the interrupt buffer */ + interrupt_byte = (usbDevice[reader_index].ccid.bCurrentSlotIndex / 4) + 1; + interrupt_mask = 0x02 << (2 * (usbDevice[reader_index].ccid.bCurrentSlotIndex % 4)); + + /* Wait until the condition is signaled or a timeout occurs */ + pthread_mutex_lock(&msExt->mutex); + gettimeofday(&local_time, NULL); + cond_wait_until.tv_sec = local_time.tv_sec; + cond_wait_until.tv_nsec = local_time.tv_usec * 1000; + + cond_wait_until.tv_sec += timeout / 1000; + cond_wait_until.tv_nsec += 1000000 * (timeout % 1000); + +again: + rv = pthread_cond_timedwait(&msExt->condition, &msExt->mutex, + &cond_wait_until); + + if (0 == rv) + { + /* Retrieve interrupt buffer and request result */ + memcpy(buffer, msExt->buffer, sizeof buffer); + status = msExt->status; + } + else + if (rv == ETIMEDOUT) + status = LIBUSB_TRANSFER_TIMED_OUT; + else + status = -1; + + /* Don't forget to unlock the mutex */ + pthread_mutex_unlock(&msExt->mutex); + + /* When stopped, return 0 so IFDHPolling will return IFD_NO_SUCH_DEVICE */ + if (msExt->terminated) + return 0; + + /* Not stopped */ + if (status == LIBUSB_TRANSFER_COMPLETED) + { + if (0 == (buffer[interrupt_byte] & interrupt_mask)) + { + DEBUG_PERIODIC2("Multi_InterruptRead (%d) -- skipped", reader_index); + goto again; + } + DEBUG_PERIODIC2("Multi_InterruptRead (%d), got an interrupt", reader_index); + } + else + { + DEBUG_PERIODIC3("Multi_InterruptRead (%d), status=%d", reader_index, status); + } + + return status; +} /* Multi_InterruptRead */ + + +/***************************************************************************** + * + * Multi_InterruptStop + * + ****************************************************************************/ +static void Multi_InterruptStop(int reader_index) +{ + struct usbDevice_MultiSlot_Extension *msExt; + int interrupt_byte, interrupt_mask; + + msExt = usbDevice[reader_index].multislot_extension; + + /* Already stopped ? */ + if ((NULL == msExt) || msExt->terminated) + return; + + DEBUG_PERIODIC2("Stop (%d)", reader_index); + + interrupt_byte = (usbDevice[reader_index].ccid.bCurrentSlotIndex / 4) + 1; + interrupt_mask = 0x02 << (2 * (usbDevice[reader_index].ccid.bCurrentSlotIndex % 4)); + + pthread_mutex_lock(&msExt->mutex); + + /* Broacast an interrupt to wake-up the slot's thread */ + msExt->buffer[interrupt_byte] |= interrupt_mask; + pthread_cond_broadcast(&msExt->condition); + + pthread_mutex_unlock(&msExt->mutex); +} /* Multi_InterruptStop */ + + +/***************************************************************************** + * + * Multi_CreateFirstSlot + * + ****************************************************************************/ +static struct usbDevice_MultiSlot_Extension *Multi_CreateFirstSlot(int reader_index) +{ + struct usbDevice_MultiSlot_Extension *msExt; + + /* Allocate a new extension buffer */ + msExt = malloc(sizeof(struct usbDevice_MultiSlot_Extension)); + if (NULL == msExt) + return NULL; + + /* Remember the index */ + msExt->reader_index = reader_index; + + msExt->terminated = FALSE; + msExt->status = 0; + msExt->transfer = NULL; + + /* Create mutex and condition object for the interrupt polling */ + pthread_mutex_init(&msExt->mutex, NULL); + pthread_cond_init(&msExt->condition, NULL); + + /* create the thread in charge of the interrupt polling */ + pthread_create(&msExt->thread_proc, NULL, Multi_PollingProc, msExt); + + return msExt; +} /* Multi_CreateFirstSlot */ + + +/***************************************************************************** + * + * Multi_CreateNextSlot + * + ****************************************************************************/ +static struct usbDevice_MultiSlot_Extension *Multi_CreateNextSlot(int physical_reader_index) +{ + /* Take the extension buffer from the main slot */ + return usbDevice[physical_reader_index].multislot_extension; +} /* Multi_CreateNextSlot */ + diff --git a/ccid/ccid/src/ccid_usb.h b/ccid/ccid/src/ccid_usb.h index 57b047d..fefbf26 100644 --- a/ccid/ccid/src/ccid_usb.h +++ b/ccid/ccid/src/ccid_usb.h @@ -1,6 +1,6 @@ /* ccid_usb.h: USB access routines using the libusb library - Copyright (C) 2003-2004 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: ccid_usb.h 4346 2009-07-28 13:39:37Z rousseau $ + * $Id: ccid_usb.h 5473 2011-01-04 09:52:26Z rousseau $ */ #ifndef __CCID_USB_H__ @@ -35,13 +35,15 @@ status_t ReadUSB(unsigned int reader_index, unsigned int *length, status_t CloseUSB(unsigned int reader_index); -#if defined (__USB_H__) || defined (_SYS_USB_LIBUSB_USB_H) -/*@null@*/ struct usb_interface *get_ccid_usb_interface( - struct usb_device *dev, int *num); -#endif +#include +/*@null@*/ const struct libusb_interface *get_ccid_usb_interface( + struct libusb_config_descriptor *desc, int *num); + +const unsigned char *get_ccid_device_descriptor(const struct libusb_interface *usb_interface); int ControlUSB(int reader_index, int requesttype, int request, int value, unsigned char *bytes, unsigned int size); int InterruptRead(int reader_index, int timeout); +void InterruptStop(int reader_index); #endif diff --git a/ccid/ccid/src/commands.c b/ccid/ccid/src/commands.c index 932bd77..2fb30f7 100644 --- a/ccid/ccid/src/commands.c +++ b/ccid/ccid/src/commands.c @@ -1,6 +1,7 @@ /* commands.c: Commands sent to the card - Copyright (C) 2003-2004 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau + Copyright (C) 2005 Martin Paljak This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +19,7 @@ */ /* - * $Id: commands.c 4235 2009-05-29 11:42:46Z rousseau $ + * $Id: commands.c 6783 2013-10-24 09:36:52Z rousseau $ */ #include @@ -28,15 +29,14 @@ #include #include +#include "config.h" #include "misc.h" #include "commands.h" #include "openct/proto-t1.h" #include "ccid.h" #include "defs.h" #include "ccid_ifdhandler.h" -#include "config.h" #include "debug.h" -#include "ccid_usb.h" /* All the pinpad readers I used are more or less bogus * I use code to change the user command and make the firmware happy */ @@ -48,8 +48,21 @@ #define BOGUS_SCM_FIRMWARE_FOR_dwMaxCCIDMessageLength #define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#define IFD_ERROR_INSUFFICIENT_BUFFER 700 +#endif + +#ifndef BSWAP_16 +#define BSWAP_8(x) ((x) & 0xff) +#define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8)) +#define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16)) +#endif + +#define CHECK_STATUS(res) \ + if (STATUS_NO_SUCH_DEVICE == res) \ + return IFD_NO_SUCH_DEVICE; \ + if (STATUS_SUCCESS != res) \ + return IFD_COMMUNICATION_ERROR; /* internal functions */ static RESPONSECODE CmdXfrBlockAPDU_extended(unsigned int reader_index, @@ -69,6 +82,7 @@ static RESPONSECODE CmdXfrBlockTPDU_T1(unsigned int reader_index, unsigned char rx_buffer[]); static void i2dw(int value, unsigned char *buffer); +static unsigned int bei2i(unsigned char *buffer); /***************************************************************************** @@ -87,7 +101,7 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength, _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); #ifndef TWIN_SERIAL - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { int r; unsigned char pcbuffer[SIZE_GET_SLOT_STATUS]; @@ -117,7 +131,7 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength, return IFD_SUCCESS; } - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { int r; unsigned char tmp[MAX_ATR_SIZE+1]; @@ -158,7 +172,7 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength, } DEBUG_INFO_XXD("Data Block: ", tmp, r); - if (*nlength > r-1) + if ((int)*nlength > r-1) *nlength = r-1; memcpy(buffer, tmp+1, *nlength); @@ -203,16 +217,14 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength, cmd[8] = cmd[9] = 0; /* RFU */ res = WritePort(reader_index, sizeof(cmd), cmd); - if (res != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + CHECK_STATUS(res) /* reset available buffer size */ /* needed if we go back after a switch to ISO mode */ *nlength = length; res = ReadPort(reader_index, nlength, buffer); - if (res != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + CHECK_STATUS(res) if (*nlength < STATUS_OFFSET+1) { @@ -233,7 +245,7 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength, unsigned int res_length = sizeof(res_tmp); if ((return_value = CmdEscape(reader_index, cmd_tmp, - sizeof(cmd_tmp), res_tmp, &res_length)) != IFD_SUCCESS) + sizeof(cmd_tmp), res_tmp, &res_length, 0)) != IFD_SUCCESS) return return_value; /* avoid looping if we can't switch mode */ @@ -279,12 +291,15 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, unsigned char TxBuffer[], unsigned int TxLength, unsigned char RxBuffer[], unsigned int *RxLength) { - unsigned char cmd[11+14+CMD_BUF_SIZE]; + unsigned char cmd[11+14+TxLength]; unsigned int a, b; + PIN_VERIFY_STRUCTURE *pvs; _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); int old_read_timeout; RESPONSECODE ret; + status_t res; + pvs = (PIN_VERIFY_STRUCTURE *)TxBuffer; cmd[0] = 0x69; /* Secure */ cmd[5] = ccid_descriptor->bCurrentSlotIndex; /* slot number */ cmd[6] = (*ccid_descriptor->pbSeq)++; @@ -293,19 +308,25 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, cmd[9] = 0; cmd[10] = 0; /* bPINOperation: PIN Verification */ - /* 19 is the size of the PCSCv2 PIN verify structure - * The equivalent CCID structure is only 14-bytes long */ - if (TxLength > 19+CMD_BUF_SIZE) /* command too large? */ + if (TxLength < 19+4 /* 4 = APDU size */) /* command too short? */ { - DEBUG_INFO3("Command too long: %d > %d", TxLength, 19+CMD_BUF_SIZE); + DEBUG_INFO3("Command too short: %d < %d", TxLength, 19+4); return IFD_NOT_SUPPORTED; } - if (TxLength < 19+4 /* 4 = APDU size */) /* command too short? */ + /* On little endian machines we are all set. */ + /* If on big endian machine and caller is using host byte order */ + if ((pvs->ulDataLength + 19 == TxLength) && + (bei2i((unsigned char*)(&pvs->ulDataLength)) == pvs->ulDataLength)) { - DEBUG_INFO3("Command too short: %d < %d", TxLength, 19+4); - return IFD_NOT_SUPPORTED; + DEBUG_INFO("Reversing order from big to little endian"); + /* If ulDataLength is big endian, assume others are too */ + /* reverse the byte order for 3 fields */ + pvs->wPINMaxExtraDigit = BSWAP_16(pvs->wPINMaxExtraDigit); + pvs->wLangId = BSWAP_16(pvs->wLangId); + pvs->ulDataLength = BSWAP_32(pvs->ulDataLength); } + /* At this point we now have the above 3 variables in little endian */ if (dw2i(TxBuffer, 15) + 19 != TxLength) /* ulDataLength field coherency */ { @@ -324,7 +345,8 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, #ifdef BOGUS_PINPAD_FIRMWARE /* bug circumvention for the GemPC Pinpad */ - if (GEMPCPINPAD == ccid_descriptor->readerID) + if ((GEMPCPINPAD == ccid_descriptor->readerID) + || (VEGAALPHA == ccid_descriptor->readerID)) { /* the firmware reject the cases: 00h No string and FFh default * CCID message. The only value supported is 01h (display 1 message) */ @@ -346,7 +368,8 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, } - if (DELLSCRK == ccid_descriptor->readerID) + if ((DELLSCRK == ccid_descriptor->readerID) + || (DELLSK == ccid_descriptor->readerID)) { /* the firmware rejects the cases: 01h-FEh and FFh default * CCID message. The only value supported is 00h (no message) */ @@ -356,6 +379,21 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, TxBuffer[8]); TxBuffer[8] = 0x00; } + + /* avoid the command rejection because the Enter key is still + * pressed. Wait a bit for the key to be released */ + (void)usleep(250*1000); + } + + if (DELLSK == ccid_descriptor->readerID) + { + /* the 2 bytes of wPINMaxExtraDigit are reversed */ + int tmp; + + tmp = TxBuffer[6]; + TxBuffer[6] = TxBuffer[5]; + TxBuffer[5] = tmp; + DEBUG_INFO("Correcting wPINMaxExtraDigit for Dell keyboard"); } #endif @@ -372,7 +410,7 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, TxLength - offsetof(PIN_VERIFY_STRUCTURE, abData)); /* Create T=1 block */ - ret = t1_build(&((get_ccid_slot(reader_index))->t1), + (void)t1_build(&((get_ccid_slot(reader_index))->t1), sdata, 0, T1_I_BLOCK, &sbuf, NULL); /* Increment the sequence numbers */ @@ -417,7 +455,7 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, /* the SPR532 will append the PIN code without any padding */ return_value = CmdEscape(reader_index, cmd_tmp, sizeof(cmd_tmp), - res_tmp, &res_length); + res_tmp, &res_length, 0); if (return_value != IFD_SUCCESS) return return_value; @@ -430,23 +468,28 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, i2dw(a - 10, cmd + 1); /* CCID message length */ old_read_timeout = ccid_descriptor -> readTimeout; - ccid_descriptor -> readTimeout = max(30, TxBuffer[0]+10); /* at least 30 seconds */ + ccid_descriptor -> readTimeout = max(90, TxBuffer[0]+10)*1000; /* at least 90 seconds */ - if (WritePort(reader_index, a, cmd) != STATUS_SUCCESS) + res = WritePort(reader_index, a, cmd); + if (STATUS_SUCCESS != res) { - ret = IFD_COMMUNICATION_ERROR; + if (STATUS_NO_SUCH_DEVICE == res) + ret = IFD_NO_SUCH_DEVICE; + else + ret = IFD_COMMUNICATION_ERROR; goto end; } ret = CCID_Receive(reader_index, RxLength, RxBuffer, NULL); /* T=1 Protocol Management for a TPDU reader */ - if ((IFD_SUCCESS == ret) - && (SCARD_PROTOCOL_T1 == ccid_descriptor->cardProtocol) + if ((SCARD_PROTOCOL_T1 == ccid_descriptor->cardProtocol) && (CCID_CLASS_TPDU == (ccid_descriptor->dwFeatures & CCID_CLASS_EXCHANGE_MASK))) { /* timeout and cancel cases are faked by CCID_Receive() */ - if (2 == *RxLength) + if ((2 == *RxLength) + /* the CCID command is rejected or failed */ + || (IFD_SUCCESS != ret)) { /* Decrement the sequence numbers since no TPDU was sent */ get_ccid_slot(reader_index)->t1.ns ^= 1; @@ -467,6 +510,44 @@ RESPONSECODE SecurePINVerify(unsigned int reader_index, } /* SecurePINVerify */ +#ifdef BOGUS_PINPAD_FIRMWARE +/***************************************************************************** + * + * has_gemalto_modify_pin_bug + * + ****************************************************************************/ +static int has_gemalto_modify_pin_bug(_ccid_descriptor *ccid_descriptor) +{ + /* Bug not present by default */ + int has_bug = 0; + + /* Covadis Véga-Alpha reader */ + if (VEGAALPHA == ccid_descriptor->readerID) + { + /* This reader has the bug (uses a Gemalto firmware) */ + has_bug = 1; + } + else + { + /* Gemalto reader */ + if ((GET_VENDOR(ccid_descriptor->readerID) == VENDOR_GEMALTO)) + { + has_bug = 1; /* assume it has the bug */ + + if (ccid_descriptor->gemalto_firmware_features && + ccid_descriptor->gemalto_firmware_features->bNumberMessageFix) + { + /* A Gemalto reader has the ModifyPIN structure bug */ + /* unless it explicitly reports it has been fixed */ + has_bug = 0; + } + } + } + + return has_bug; +} /* has_gemalto_modify_pin_bug */ +#endif + /***************************************************************************** * * SecurePINModify @@ -476,15 +557,19 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, unsigned char TxBuffer[], unsigned int TxLength, unsigned char RxBuffer[], unsigned int *RxLength) { - unsigned char cmd[11+19+CMD_BUF_SIZE]; + unsigned char cmd[11+19+TxLength]; unsigned int a, b; + PIN_MODIFY_STRUCTURE *pms; _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); int old_read_timeout; RESPONSECODE ret; + status_t res; #ifdef BOGUS_PINPAD_FIRMWARE - int bNumberMessages = 0; /* for GemPC Pinpad */ + int bNumberMessage = 0; /* for GemPC Pinpad */ + int gemalto_modify_pin_bug; #endif + pms = (PIN_MODIFY_STRUCTURE *)TxBuffer; cmd[0] = 0x69; /* Secure */ cmd[5] = ccid_descriptor->bCurrentSlotIndex; /* slot number */ cmd[6] = (*ccid_descriptor->pbSeq)++; @@ -493,19 +578,26 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, cmd[9] = 0; cmd[10] = 1; /* bPINOperation: PIN Modification */ - /* 24 is the size of the PCSC PIN modify structure - * The equivalent CCID structure is only 18 or 19-bytes long */ - if (TxLength > 24+CMD_BUF_SIZE) /* command too large? */ + if (TxLength < 24+4 /* 4 = APDU size */) /* command too short? */ { - DEBUG_INFO3("Command too long: %d > %d", TxLength, 24+CMD_BUF_SIZE); + DEBUG_INFO3("Command too short: %d < %d", TxLength, 24+4); return IFD_NOT_SUPPORTED; } - if (TxLength < 24+4 /* 4 = APDU size */) /* command too short? */ + /* On little endian machines we are all set. */ + /* If on big endian machine and caller is using host byte order */ + if ((pms->ulDataLength + 24 == TxLength) && + (bei2i((unsigned char*)(&pms->ulDataLength)) == pms->ulDataLength)) { - DEBUG_INFO3("Command too short: %d < %d", TxLength, 24+4); - return IFD_NOT_SUPPORTED; + DEBUG_INFO("Reversing order from big to little endian"); + /* If ulDataLength is big endian, assume others are too */ + /* reverse the byte order for 3 fields */ + pms->wPINMaxExtraDigit = BSWAP_16(pms->wPINMaxExtraDigit); + pms->wLangId = BSWAP_16(pms->wLangId); + pms->ulDataLength = BSWAP_32(pms->ulDataLength); } + /* At this point we now have the above 3 variables in little endian */ + if (dw2i(TxBuffer, 20) + 24 != TxLength) /* ulDataLength field coherency */ { @@ -539,22 +631,23 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, if ((SPR532 == ccid_descriptor->readerID) || (CHERRYST2000 == ccid_descriptor->readerID)) { - TxBuffer[11] = 0x03; /* set bNumberMessages to 3 so that + TxBuffer[11] = 0x03; /* set bNumberMessage to 3 so that all bMsgIndex123 are filled */ TxBuffer[14] = TxBuffer[15] = TxBuffer[16] = 0; /* bMsgIndex123 */ } /* the bug is a bit different than for the Cherry ST 2000C - * with bNumberMessages < 3 the command seems to be accepted + * with bNumberMessage < 3 the command seems to be accepted * and the card sends 6B 80 */ if (CHERRYXX44 == ccid_descriptor->readerID) { - TxBuffer[11] = 0x03; /* set bNumberMessages to 3 so that + TxBuffer[11] = 0x03; /* set bNumberMessage to 3 so that all bMsgIndex123 are filled */ } /* bug circumvention for the GemPC Pinpad */ - if (GEMPCPINPAD == ccid_descriptor->readerID) + if ((GEMPCPINPAD == ccid_descriptor->readerID) + || (VEGAALPHA == ccid_descriptor->readerID)) { /* The reader does not support, and actively reject, "max size reached" * and "timeout occured" validation conditions */ @@ -564,13 +657,21 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, TxBuffer[10]); TxBuffer[10] = 0x02; /* validation key pressed */ } + } + + gemalto_modify_pin_bug = has_gemalto_modify_pin_bug(ccid_descriptor); + if (gemalto_modify_pin_bug) + { + DEBUG_INFO("Gemalto CCID Modify Pin Bug"); - /* the reader does not support any other value than 3 for the number - * of messages */ - bNumberMessages = TxBuffer[11]; + /* The reader requests a value for bMsgIndex2 and bMsgIndex3 + * even if they should not be present. So we fake + * bNumberMessage=3. The real number of messages will be + * corrected later in the code */ + bNumberMessage = TxBuffer[11]; if (0x03 != TxBuffer[11]) { - DEBUG_INFO2("Correct bNumberMessages for GemPC Pinpad (was %d)", + DEBUG_INFO2("Correct bNumberMessage for GemPC Pinpad (was %d)", TxBuffer[11]); TxBuffer[11] = 0x03; /* 3 messages */ } @@ -590,7 +691,7 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, TxLength - offsetof(PIN_MODIFY_STRUCTURE, abData)); /* Create T=1 block */ - ret = t1_build(&((get_ccid_slot(reader_index))->t1), + (void)t1_build(&((get_ccid_slot(reader_index))->t1), sdata, 0, T1_I_BLOCK, &sbuf, NULL); /* Increment the sequence numbers */ @@ -638,40 +739,45 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, /* copy to the CCID block 'verbatim' */ cmd[a] = TxBuffer[b]; a++; - } + } #ifdef BOGUS_PINPAD_FIRMWARE if ((SPR532 == ccid_descriptor->readerID) || (CHERRYST2000 == ccid_descriptor->readerID)) { - cmd[21] = 0x00; /* set bNumberMessages to 0 */ + cmd[21] = 0x00; /* set bNumberMessage to 0 */ } - if (GEMPCPINPAD == ccid_descriptor->readerID) - cmd[21] = bNumberMessages; /* restore the real value */ + if (gemalto_modify_pin_bug) + cmd[21] = bNumberMessage; /* restore the real value */ #endif /* We know the size of the CCID message now */ i2dw(a - 10, cmd + 1); /* command length (includes bPINOperation) */ old_read_timeout = ccid_descriptor -> readTimeout; - ccid_descriptor -> readTimeout = max(30, TxBuffer[0]+10); /* at least 30 seconds */ + ccid_descriptor -> readTimeout = max(90, TxBuffer[0]+10)*1000; /* at least 90 seconds */ - if (WritePort(reader_index, a, cmd) != STATUS_SUCCESS) + res = WritePort(reader_index, a, cmd); + if (STATUS_SUCCESS != res) { - ret = IFD_COMMUNICATION_ERROR; + if (STATUS_NO_SUCH_DEVICE == res) + ret = IFD_NO_SUCH_DEVICE; + else + ret = IFD_COMMUNICATION_ERROR; goto end; } - ret = CCID_Receive(reader_index, RxLength, RxBuffer, NULL); + ret = CCID_Receive(reader_index, RxLength, RxBuffer, NULL); /* T=1 Protocol Management for a TPDU reader */ - if ((IFD_SUCCESS == ret) - && (SCARD_PROTOCOL_T1 == ccid_descriptor->cardProtocol) + if ((SCARD_PROTOCOL_T1 == ccid_descriptor->cardProtocol) && (CCID_CLASS_TPDU == (ccid_descriptor->dwFeatures & CCID_CLASS_EXCHANGE_MASK))) { /* timeout and cancel cases are faked by CCID_Receive() */ - if (2 == *RxLength) + if ((2 == *RxLength) + /* the CCID command is rejected or failed */ + || (IFD_SUCCESS != ret)) { /* Decrement the sequence numbers since no TPDU was sent */ get_ccid_slot(reader_index)->t1.ns ^= 1; @@ -699,7 +805,7 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, ****************************************************************************/ RESPONSECODE CmdEscape(unsigned int reader_index, const unsigned char TxBuffer[], unsigned int TxLength, - unsigned char RxBuffer[], unsigned int *RxLength) + unsigned char RxBuffer[], unsigned int *RxLength, unsigned int timeout) { unsigned char *cmd_in, *cmd_out; status_t res; @@ -708,8 +814,12 @@ RESPONSECODE CmdEscape(unsigned int reader_index, int old_read_timeout; _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); - old_read_timeout = ccid_descriptor -> readTimeout; - ccid_descriptor -> readTimeout = 30; /* 30 seconds */ + /* a value of 0 do not change the default read timeout */ + if (timeout > 0) + { + old_read_timeout = ccid_descriptor -> readTimeout; + ccid_descriptor -> readTimeout = timeout; + } again: /* allocate buffers */ @@ -742,10 +852,15 @@ RESPONSECODE CmdEscape(unsigned int reader_index, if (res != STATUS_SUCCESS) { free(cmd_out); - return_value = IFD_COMMUNICATION_ERROR; + if (STATUS_NO_SUCH_DEVICE == res) + return_value = IFD_NO_SUCH_DEVICE; + else + return_value = IFD_COMMUNICATION_ERROR; goto end; } +time_request: + length_out = 10 + *RxLength; res = ReadPort(reader_index, &length_out, cmd_out); /* replay the command if NAK @@ -761,17 +876,27 @@ RESPONSECODE CmdEscape(unsigned int reader_index, if (res != STATUS_SUCCESS) { free(cmd_out); - return_value = IFD_COMMUNICATION_ERROR; + if (STATUS_NO_SUCH_DEVICE == res) + return_value = IFD_NO_SUCH_DEVICE; + else + return_value = IFD_COMMUNICATION_ERROR; goto end; } if (length_out < STATUS_OFFSET+1) { + free(cmd_out); DEBUG_CRITICAL2("Not enough data received: %d bytes", length_out); return_value = IFD_COMMUNICATION_ERROR; goto end; } + if (cmd_out[STATUS_OFFSET] & CCID_TIME_EXTENSION) + { + DEBUG_COMM2("Time extension requested: 0x%02X", cmd_out[ERROR_OFFSET]); + goto time_request; + } + if (cmd_out[STATUS_OFFSET] & CCID_COMMAND_FAILED) { ccid_error(cmd_out[ERROR_OFFSET], __FILE__, __LINE__, __FUNCTION__); /* bError */ @@ -788,7 +913,9 @@ RESPONSECODE CmdEscape(unsigned int reader_index, free(cmd_out); end: - ccid_descriptor -> readTimeout = old_read_timeout; + if (timeout > 0) + ccid_descriptor -> readTimeout = old_read_timeout; + return return_value; } /* Escape */ @@ -807,7 +934,7 @@ RESPONSECODE CmdPowerOff(unsigned int reader_index) _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); #ifndef TWIN_SERIAL - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { int r; @@ -824,7 +951,7 @@ RESPONSECODE CmdPowerOff(unsigned int reader_index) return IFD_SUCCESS; } - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { int r; unsigned char buffer[3]; @@ -860,13 +987,11 @@ RESPONSECODE CmdPowerOff(unsigned int reader_index) cmd[7] = cmd[8] = cmd[9] = 0; /* RFU */ res = WritePort(reader_index, sizeof(cmd), cmd); - if (res != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + CHECK_STATUS(res) length = sizeof(cmd); res = ReadPort(reader_index, &length, cmd); - if (res != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + CHECK_STATUS(res) if (length < STATUS_OFFSET+1) { @@ -898,14 +1023,14 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char buffer[]) _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); #ifndef TWIN_SERIAL - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { int r; unsigned char status[1]; again_status: /* SlotStatus */ - r = ControlUSB(reader_index, 0xA1, 0xA0, 0, status, sizeof(status)); + r = ControlUSB(reader_index, 0xA1, 0xA0, 0, status, sizeof(status)); /* we got an error? */ if (r < 0) @@ -938,7 +1063,7 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char buffer[]) return IFD_SUCCESS; } - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { int r; unsigned char buffer_tmp[3]; @@ -980,17 +1105,11 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char buffer[]) cmd[7] = cmd[8] = cmd[9] = 0; /* RFU */ res = WritePort(reader_index, sizeof(cmd), cmd); - if (res != STATUS_SUCCESS) - { - if (STATUS_NO_SUCH_DEVICE == res) - return IFD_NO_SUCH_DEVICE; - return IFD_COMMUNICATION_ERROR; - } + CHECK_STATUS(res) length = SIZE_GET_SLOT_STATUS; res = ReadPort(reader_index, &length, buffer); - if (res != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + CHECK_STATUS(res) if (length < STATUS_OFFSET+1) { @@ -998,20 +1117,12 @@ RESPONSECODE CmdGetSlotStatus(unsigned int reader_index, unsigned char buffer[]) return IFD_COMMUNICATION_ERROR; } - if (buffer[STATUS_OFFSET] & CCID_COMMAND_FAILED) + if ((buffer[STATUS_OFFSET] & CCID_COMMAND_FAILED) + /* card absent or mute is not an communication error */ + && (buffer[ERROR_OFFSET] != 0xFE)) { -#ifdef O2MICRO_OZ776_PATCH - /* the O2MICRO OZ 776 reader sends card absent or mute errors - * when no card is inserted */ - if (! (((OZ776 == ccid_descriptor->readerID) - || (OZ776_7772 == ccid_descriptor->readerID)) - && (buffer[ERROR_OFFSET] == 0xFE))) -#endif + return_value = IFD_COMMUNICATION_ERROR; ccid_error(buffer[ERROR_OFFSET], __FILE__, __LINE__, __FUNCTION__); /* bError */ - - /* card absent or mute is not an communication error */ - if (buffer[ERROR_OFFSET] != 0xFE) - return_value = IFD_COMMUNICATION_ERROR; } return return_value; @@ -1063,7 +1174,7 @@ RESPONSECODE CmdXfrBlock(unsigned int reader_index, unsigned int tx_length, if (protocol == T_1) return_value = CmdXfrBlockTPDU_T1(reader_index, tx_length, tx_buffer, rx_length, rx_buffer); - else + else return_value = IFD_PROTOCOL_NOT_SUPPORTED; break; @@ -1083,17 +1194,18 @@ RESPONSECODE CmdXfrBlock(unsigned int reader_index, unsigned int tx_length, RESPONSECODE CCID_Transmit(unsigned int reader_index, unsigned int tx_length, const unsigned char tx_buffer[], unsigned short rx_length, unsigned char bBWI) { - unsigned char cmd[10+CMD_BUF_SIZE]; /* CCID + APDU buffer */ + unsigned char cmd[10+tx_length]; /* CCID + APDU buffer */ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); status_t ret; #ifndef TWIN_SERIAL - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { int r; /* Xfr Block */ - r = ControlUSB(reader_index, 0x21, 0x65, 0, tx_buffer, tx_length); + r = ControlUSB(reader_index, 0x21, 0x65, 0, + (unsigned char *)tx_buffer, tx_length); /* we got an error? */ if (r < 0) @@ -1105,7 +1217,7 @@ RESPONSECODE CCID_Transmit(unsigned int reader_index, unsigned int tx_length, return IFD_SUCCESS; } - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { int r; @@ -1115,8 +1227,8 @@ RESPONSECODE CCID_Transmit(unsigned int reader_index, unsigned int tx_length, /* Xfr Block */ DEBUG_COMM2("chain parameter: %d", rx_length); - r = ControlUSB(reader_index, 0x21, 0x65, rx_length << 8, tx_buffer, - tx_length); + r = ControlUSB(reader_index, 0x21, 0x65, rx_length << 8, + (unsigned char *)tx_buffer, tx_length); /* we got an error? */ if (r < 0) @@ -1137,20 +1249,10 @@ RESPONSECODE CCID_Transmit(unsigned int reader_index, unsigned int tx_length, cmd[8] = rx_length & 0xFF; /* Expected length, in character mode only */ cmd[9] = (rx_length >> 8) & 0xFF; - /* check that the command is not too large */ - if (tx_length > CMD_BUF_SIZE) - { - DEBUG_CRITICAL2("TX Length too big: %d", tx_length); - return IFD_NOT_SUPPORTED; - } - memcpy(cmd+10, tx_buffer, tx_length); ret = WritePort(reader_index, 10+tx_length, cmd); - if (STATUS_NO_SUCH_DEVICE == ret) - return IFD_NO_SUCH_DEVICE; - if (ret != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + CHECK_STATUS(ret) return IFD_SUCCESS; } /* CCID_Transmit */ @@ -1168,14 +1270,20 @@ RESPONSECODE CCID_Receive(unsigned int reader_index, unsigned int *rx_length, unsigned int length; RESPONSECODE return_value = IFD_SUCCESS; status_t ret; - -#ifndef TWIN_SERIAL _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + unsigned int old_timeout; - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) +#ifndef TWIN_SERIAL + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { + unsigned char pcbuffer[SIZE_GET_SLOT_STATUS]; int r; + /* wait for ready */ + r = CmdGetSlotStatus(reader_index, pcbuffer); + if (r != IFD_SUCCESS) + return r; + /* Data Block */ r = ControlUSB(reader_index, 0xA1, 0x6F, 0, rx_buffer, *rx_length); @@ -1186,10 +1294,13 @@ RESPONSECODE CCID_Receive(unsigned int reader_index, unsigned int *rx_length, return IFD_COMMUNICATION_ERROR; } + /* we need to store returned value */ + *rx_length = r; + return IFD_SUCCESS; } - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { int r; unsigned char rx_tmp[4]; @@ -1280,15 +1391,16 @@ RESPONSECODE CCID_Receive(unsigned int reader_index, unsigned int *rx_length, } #endif + /* store the original value of read timeout*/ + old_timeout = ccid_descriptor -> readTimeout; + time_request: length = sizeof(cmd); ret = ReadPort(reader_index, &length, cmd); - if (ret != STATUS_SUCCESS) - { - if (STATUS_NO_SUCH_DEVICE == ret) - return IFD_NO_SUCH_DEVICE; - return IFD_COMMUNICATION_ERROR; - } + + /* restore the original value of read timeout */ + ccid_descriptor -> readTimeout = old_timeout; + CHECK_STATUS(ret) if (length < STATUS_OFFSET+1) { @@ -1328,6 +1440,12 @@ RESPONSECODE CCID_Receive(unsigned int reader_index, unsigned int *rx_length, if (cmd[STATUS_OFFSET] & CCID_TIME_EXTENSION) { DEBUG_COMM2("Time extension requested: 0x%02X", cmd[ERROR_OFFSET]); + + /* compute the new value of read timeout */ + if (cmd[ERROR_OFFSET] > 0) + ccid_descriptor -> readTimeout *= cmd[ERROR_OFFSET]; + + DEBUG_COMM2("New timeout: %d ms", ccid_descriptor -> readTimeout); goto time_request; } @@ -1380,10 +1498,10 @@ static RESPONSECODE CmdXfrBlockAPDU_extended(unsigned int reader_index, _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); unsigned char chain_parameter; unsigned int local_tx_length, sent_length; - unsigned int local_rx_length, received_length; + unsigned int local_rx_length = 0, received_length; int buffer_overflow = 0; - if (ICCD_B == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { /* length is on 16-bits only * if a size > 0x1000 is used then usb_control_msg() fails with @@ -1609,14 +1727,15 @@ static RESPONSECODE T0ProcACK(unsigned int reader_index, unsigned int proc_len, int is_rcv) { RESPONSECODE return_value; - unsigned int remain_len; - unsigned char tmp_buf[512]; unsigned int ret_len; DEBUG_COMM2("Enter, is_rcv = %d", is_rcv); if (is_rcv == 1) { /* Receiving mode */ + unsigned int remain_len; + unsigned char tmp_buf[512]; + if (*in_len > 0) { /* There are still available data in our buffer */ if (*in_len >= proc_len) @@ -1729,8 +1848,6 @@ static RESPONSECODE T0ProcSW1(unsigned int reader_index, { RESPONSECODE return_value = IFD_SUCCESS; UCHAR tmp_buf[512]; - unsigned char *rcv_buf_tmp = rcv_buf; - const unsigned int rcv_len_tmp = *rcv_len; unsigned char sw1, sw2; /* store the SW1 */ @@ -1756,17 +1873,9 @@ static RESPONSECODE T0ProcSW1(unsigned int reader_index, in_buf = tmp_buf; } sw2 = *rcv_buf = *in_buf; - rcv_buf++; - in_buf++; in_len--; (*rcv_len)++; - if (return_value != IFD_SUCCESS) - { - rcv_buf_tmp[0] = rcv_buf_tmp[1] = 0; - *rcv_len = rcv_len_tmp; - } - DEBUG_COMM3("Exit: SW=%02X %02X", sw1, sw2); return return_value; @@ -1792,9 +1901,18 @@ static RESPONSECODE CmdXfrBlockCHAR_T0(unsigned int reader_index, DEBUG_COMM2("T=0: %d bytes", snd_len); - if (ICCD_A == ccid_descriptor->bInterfaceProtocol) + if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { unsigned char pcbuffer[SIZE_GET_SLOT_STATUS]; + unsigned int backup_len; + + /* length is on 16-bits only + * if a size > 0x1000 is used then usb_control_msg() fails with + * "Invalid argument" */ + if (*rcv_len > 0x1000) + *rcv_len = 0x1000; + + backup_len = *rcv_len; /* Command to send to the smart card (must be 5 bytes) */ memset(cmd, 0, sizeof(cmd)); @@ -1817,44 +1935,53 @@ static RESPONSECODE CmdXfrBlockCHAR_T0(unsigned int reader_index, return return_value; /* wait for ready */ + pcbuffer[0] = 0; return_value = CmdGetSlotStatus(reader_index, pcbuffer); if (return_value != IFD_SUCCESS) return return_value; - if ((0x20 != pcbuffer[0]) && (snd_len > 0)) + if (0x10 == pcbuffer[0]) { - /* continue sending the APDU */ - return_value = CCID_Transmit(reader_index, snd_len, snd_buf, 0, 0); - if (return_value != IFD_SUCCESS) - return return_value; - } - else - { - if ((0x20 == pcbuffer[0]) && (*rcv_len > 2)) - /* we will just read SW1-SW2 */ - *rcv_len = 2; - - return_value = CCID_Receive(reader_index, rcv_len, rcv_buf, NULL); - if (return_value != IFD_SUCCESS) - DEBUG_CRITICAL("CCID_Receive failed"); - - return return_value; + if (snd_len > 0) + { + /* continue sending the APDU */ + return_value = CCID_Transmit(reader_index, snd_len, snd_buf, + 0, 0); + if (return_value != IFD_SUCCESS) + return return_value; + } + else + { + /* read apdu data */ + return_value = CCID_Receive(reader_index, rcv_len, rcv_buf, + NULL); + if (return_value != IFD_SUCCESS) + return return_value; + } } - /* wait for ready */ return_value = CmdGetSlotStatus(reader_index, pcbuffer); if (return_value != IFD_SUCCESS) return return_value; - if ((0x20 == pcbuffer[0]) && (*rcv_len > 2)) - /* we will just read SW1-SW2 */ + /* SW1-SW2 available */ + if (0x20 == pcbuffer[0]) + { + /* backup apdu data length */ + /* if no data recieved before - backup length must be zero */ + backup_len = (backup_len == *rcv_len) ? 0 : *rcv_len; + + /* wait for 2 bytes (SW1-SW2) */ *rcv_len = 2; - /* read SW1-SW2 */ - return_value = CCID_Receive(reader_index, rcv_len, rcv_buf, NULL); - if (return_value != IFD_SUCCESS) - DEBUG_CRITICAL("CCID_Receive failed"); + return_value = CCID_Receive(reader_index, rcv_len, + rcv_buf + backup_len, NULL); + if (return_value != IFD_SUCCESS) + DEBUG_CRITICAL("CCID_Receive failed"); + /* restore recieved length */ + *rcv_len += backup_len; + } return return_value; } @@ -2009,8 +2136,9 @@ static RESPONSECODE CmdXfrBlockTPDU_T1(unsigned int reader_index, RESPONSECODE SetParameters(unsigned int reader_index, char protocol, unsigned int length, unsigned char buffer[]) { - unsigned char cmd[10+CMD_BUF_SIZE]; /* CCID + APDU buffer */ + unsigned char cmd[10+length]; /* CCID + APDU buffer */ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + status_t res; DEBUG_COMM2("length: %d bytes", length); @@ -2021,18 +2149,14 @@ RESPONSECODE SetParameters(unsigned int reader_index, char protocol, cmd[7] = protocol; /* bProtocolNum */ cmd[8] = cmd[9] = 0; /* RFU */ - /* check that the command is not too large */ - if (length > CMD_BUF_SIZE) - return IFD_NOT_SUPPORTED; - memcpy(cmd+10, buffer, length); - if (WritePort(reader_index, 10+length, cmd) != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + res = WritePort(reader_index, 10+length, cmd); + CHECK_STATUS(res) length = sizeof(cmd); - if (ReadPort(reader_index, &length, cmd) != STATUS_SUCCESS) - return IFD_COMMUNICATION_ERROR; + res = ReadPort(reader_index, &length, cmd); + CHECK_STATUS(res) if (length < STATUS_OFFSET+1) { @@ -2081,3 +2205,13 @@ static void i2dw(int value, unsigned char buffer[]) buffer[3] = (value >> 24) & 0xFF; } /* i2dw */ +/***************************************************************************** +* +* bei2i (big endian integer to host order interger) +* +****************************************************************************/ + +static unsigned int bei2i(unsigned char buffer[]) +{ + return (buffer[0]<<24) + (buffer[1]<<16) + (buffer[2]<<8) + buffer[3]; +} diff --git a/ccid/ccid/src/commands.h b/ccid/ccid/src/commands.h index 79734b5..c082bf2 100644 --- a/ccid/ccid/src/commands.h +++ b/ccid/ccid/src/commands.h @@ -1,6 +1,6 @@ /* commands.h: Commands sent to the card - Copyright (C) 2003 Ludovic Rousseau + Copyright (C) 2003-2009 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: commands.h 3270 2009-01-05 14:46:36Z rousseau $ + * $Id: commands.h 6783 2013-10-24 09:36:52Z rousseau $ */ #define SIZE_GET_SLOT_STATUS 10 @@ -39,7 +39,7 @@ RESPONSECODE SecurePINModify(unsigned int reader_index, RESPONSECODE CmdEscape(unsigned int reader_index, const unsigned char TxBuffer[], unsigned int TxLength, - unsigned char RxBuffer[], unsigned int *RxLength); + unsigned char RxBuffer[], unsigned int *RxLength, unsigned int timeout); RESPONSECODE CmdPowerOff(unsigned int reader_index); diff --git a/ccid/ccid/src/convert_version.pl b/ccid/ccid/src/convert_version.pl index 0ee7fe2..914fb76 100755 --- a/ccid/ccid/src/convert_version.pl +++ b/ccid/ccid/src/convert_version.pl @@ -2,7 +2,7 @@ # convert_version.pl: generate a version integer from a version text # -# Copyright (C) 2006 Ludovic Rousseau +# Copyright (C) 2006-2008 Ludovic Rousseau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/ccid/ccid/src/create_Info_plist.pl b/ccid/ccid/src/create_Info_plist.pl index c5f0098..8ca3b7b 100755 --- a/ccid/ccid/src/create_Info_plist.pl +++ b/ccid/ccid/src/create_Info_plist.pl @@ -3,7 +3,7 @@ # create_Info_plist.pl: generate Infor.plist from a template and a # list of suported readers # -# Copyright (C) 2004 Ludovic Rousseau +# Copyright (C) 2004-2009 Ludovic Rousseau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -26,27 +26,22 @@ my (@manuf, @product, @name); my ($manuf, $product, $name); -my $ifdCapabilities = "0x00000000"; my $target = "libccid.so"; my $version = "1.0.0"; -my $bundle = "ifd-ccid.bundle"; my $class = "CFBundleName CCIDCLASSDRIVER"; my $noclass = 0; -GetOptions("ifdCapabilities=s" => \$ifdCapabilities, +GetOptions( "target=s" => \$target, "version=s" => \$version, - "bundle=s" => \$bundle, "no-class" => \$noclass); if ($#ARGV < 1) { print "usage: $0 supported_readers.txt Info.plist - --ifdCapabilities=$ifdCapabilities --target=$target - --version=$version - --bundle=$bundle\n"; + --version=$version\n"; exit; } @@ -61,6 +56,7 @@ # print "m: $manuf, p: $product, n: $name\n"; push @manuf, $manuf; push @product, $product; + $name =~ s/&/&/g; push @name, $name } close IN; @@ -88,12 +84,6 @@ print @name; next; } - if (m/MAGIC_IFDCAPABILITIES/) - { - s/MAGIC_IFDCAPABILITIES/$ifdCapabilities/; - print; - next; - } if (m/MAGIC_TARGET/) { s/MAGIC_TARGET/$target/; @@ -106,12 +96,6 @@ print; next; } - if (m/MAGIC_BUNDLE/) - { - s/MAGIC_BUNDLE/$bundle/; - print; - next; - } if (m/MAGIC_CLASS/) { next if ($noclass); diff --git a/ccid/ccid/src/debug.c b/ccid/ccid/src/debug.c index c8ade61..86a4b86 100644 --- a/ccid/ccid/src/debug.c +++ b/ccid/ccid/src/debug.c @@ -1,6 +1,6 @@ /* debug.c: log (or not) messages - Copyright (C) 2003-2005 Ludovic Rousseau + Copyright (C) 2003-2011 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,58 +18,140 @@ */ /* - * $Id: debug.c 3268 2009-01-05 14:28:26Z rousseau $ + * $Id: debug.c 6760 2013-10-01 12:57:50Z rousseau $ */ #include "config.h" +#include "misc.h" #include "debug.h" #include #include #include +#include +#include -#define DEBUG_BUF_SIZE ((256+20)*3+10) +#include "strlcpycat.h" -static char DebugBuffer[DEBUG_BUF_SIZE]; +#undef LOG_TO_STDERR -#define LOG_TO_STDERR +#ifdef LOG_TO_STDERR +#define LOG_STREAM stderr +#else +#define LOG_STREAM stdout +#endif void log_msg(const int priority, const char *fmt, ...) { + char debug_buffer[160]; /* up to 2 lines of 80 characters */ va_list argptr; + static struct timeval last_time = { 0, 0 }; + struct timeval new_time = { 0, 0 }; + struct timeval tmp; + int delta; + const char *color_pfx = "", *color_sfx = ""; + const char *time_pfx = "", *time_sfx = ""; + static int initialized = 0; + static int LogDoColor = 0; + + if (!initialized) + { + char *term; + + initialized = 1; + term = getenv("TERM"); + if (term) + { + const char *terms[] = { "linux", "xterm", "xterm-color", "Eterm", "rxvt", "rxvt-unicode", "xterm-256color" }; + unsigned int i; + + /* for each known color terminal */ + for (i = 0; i < COUNT_OF(terms); i++) + { + /* we found a supported term? */ + if (0 == strcmp(terms[i], term)) + { + LogDoColor = 1; + break; + } + } + } + } + + if (LogDoColor) + { + color_sfx = "\33[0m"; + time_sfx = color_sfx; + time_pfx = "\33[36m"; /* Cyan */ + + switch (priority) + { + case PCSC_LOG_CRITICAL: + color_pfx = "\33[01;31m"; /* bright + Red */ + break; + + case PCSC_LOG_ERROR: + color_pfx = "\33[35m"; /* Magenta */ + break; + + case PCSC_LOG_INFO: + color_pfx = "\33[34m"; /* Blue */ + break; + + case PCSC_LOG_DEBUG: + color_pfx = ""; /* normal (black) */ + color_sfx = ""; + break; + } + } + + gettimeofday(&new_time, NULL); + if (0 == last_time.tv_sec) + last_time = new_time; + + tmp.tv_sec = new_time.tv_sec - last_time.tv_sec; + tmp.tv_usec = new_time.tv_usec - last_time.tv_usec; + if (tmp.tv_usec < 0) + { + tmp.tv_sec--; + tmp.tv_usec += 1000000; + } + if (tmp.tv_sec < 100) + delta = tmp.tv_sec * 1000000 + tmp.tv_usec; + else + delta = 99999999; + + last_time = new_time; va_start(argptr, fmt); - (void)vsnprintf(DebugBuffer, DEBUG_BUF_SIZE, fmt, argptr); + (void)vsnprintf(debug_buffer, sizeof debug_buffer, fmt, argptr); va_end(argptr); -#ifdef LOG_TO_STDERR - (void)fprintf(stderr, "%s\n", DebugBuffer); -#endif + (void)fprintf(LOG_STREAM, "%s%.8d%s %s%s%s\n", time_pfx, delta, time_sfx, + color_pfx, debug_buffer, color_sfx); + fflush(LOG_STREAM); } /* log_msg */ void log_xxd(const int priority, const char *msg, const unsigned char *buffer, const int len) { int i; - char *c, *debug_buf_end; + char *c, debug_buffer[len*3 + strlen(msg) +1]; + size_t l; - debug_buf_end = DebugBuffer + DEBUG_BUF_SIZE - 5; + (void)priority; - strncpy(DebugBuffer, msg, sizeof(DebugBuffer)-1); - c = DebugBuffer + strlen(DebugBuffer); + l = strlcpy(debug_buffer, msg, sizeof debug_buffer); + c = debug_buffer + l; - for (i = 0; (i < len) && (c < debug_buf_end); ++i) + for (i = 0; i < len; ++i) { - (void)sprintf(c, "%02X ", (unsigned char)buffer[i]); - c += strlen(c); + /* 2 hex characters, 1 space, 1 NUL : total 4 characters */ + (void)snprintf(c, 4, "%02X ", buffer[i]); + c += 3; } -#ifdef LOG_TO_STDERR - if (c >= debug_buf_end) - (void)fprintf(stderr, "Debug buffer too short\n"); - - (void)fprintf(stderr, "%s\n", DebugBuffer); -#endif + (void)fprintf(LOG_STREAM, "%s\n", debug_buffer); + fflush(LOG_STREAM); } /* log_xxd */ - diff --git a/ccid/ccid/src/debug.h b/ccid/ccid/src/debug.h index 41bb73b..f6f25c5 100644 --- a/ccid/ccid/src/debug.h +++ b/ccid/ccid/src/debug.h @@ -1,6 +1,6 @@ /* debug.h: log (or not) messages using syslog - Copyright (C) 2003-2005 Ludovic Rousseau + Copyright (C) 2003-2008 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,12 +18,12 @@ */ /* - * $Id: debug.h 3198 2008-11-10 12:11:28Z rousseau $ + * $Id: debug.h 5916 2011-08-27 15:50:04Z rousseau $ */ /* * DEBUG_CRITICAL("text"); - * log "text" if (LogLevel & DEBUG_LEVEL_CRITICAL) is TRUE + * log "text" if (LogLevel & DEBUG_LEVEL_CRITICAL) is TRUE * * DEBUG_CRITICAL2("text: %d", 1234); * log "text: 1234" if (DEBUG_LEVEL_CRITICAL & DEBUG_LEVEL_CRITICAL) is TRUE @@ -62,6 +62,8 @@ extern int LogLevel; #define DEBUG_CRITICAL4(fmt, data1, data2, data3) if (LogLevel & DEBUG_LEVEL_CRITICAL) Log4(PCSC_LOG_CRITICAL, fmt, data1, data2, data3) +#define DEBUG_CRITICAL5(fmt, data1, data2, data3, data4) if (LogLevel & DEBUG_LEVEL_CRITICAL) Log5(PCSC_LOG_CRITICAL, fmt, data1, data2, data3, data4) + /* DEBUG_INFO */ #define DEBUG_INFO(fmt) if (LogLevel & DEBUG_LEVEL_INFO) Log1(PCSC_LOG_INFO, fmt) diff --git a/ccid/ccid/src/defs.h b/ccid/ccid/src/defs.h index 3ca21e0..7d0699a 100644 --- a/ccid/ccid/src/defs.h +++ b/ccid/ccid/src/defs.h @@ -1,6 +1,6 @@ /* defs.h: - Copyright (C) 2003 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: defs.h 4292 2009-07-01 12:28:01Z rousseau $ + * $Id: defs.h 6305 2012-05-19 08:10:08Z rousseau $ */ #include @@ -66,34 +66,27 @@ typedef enum { /* Flag set when a power down is requested */ #define MASK_POWERFLAGS_PDWN 0x02 -/* Kobil readers does not support APDU chaining for T=1 so you can't send an - * extended APDU. The readers supports a command of up to 512 or 420 bytes. - * For a Kobil KAAN Base/advanced reader you should use - * #define CMD_BUF_SIZE 420 - * For the other models you should use - * #define CMD_BUF_SIZE 512 - * Kobil is aware of the problem and do not plan to solve it. - */ -/* Communication buffer size (max=adpu+Lc+data+Le) */ -#define CMD_BUF_SIZE (4+1+256+1) -/* Larger communication buffer size (max=reader status+data+sw) */ -#define RESP_BUF_SIZE (1+256+2) +/* Communication buffer size (max=adpu+Lc+data+Le) + * we use a 64kB for extended APDU on APDU mode readers */ +#define CMD_BUF_SIZE (4 +3 +64*1024 +3) /* Protocols */ #define T_0 0 #define T_1 1 -/* Size of an ISO command (CLA+INS+P1+P2) */ -#define ISO_CMD_SIZE 4 -/* Offset of the length byte in an TPDU */ -#define ISO_OFFSET_LENGTH 4 -/* Offset of the data in a TPDU */ -#define ISO_OFFSET_TPDU_DATA 5 -/* ISO length size (1 in general) */ -#define ISO_LENGTH_SIZE 1 - -/* Default communication read timeout in seconds */ -#define DEFAULT_COM_READ_TIMEOUT 2 +/* Default communication read timeout in milliseconds */ +#define DEFAULT_COM_READ_TIMEOUT (3*1000) + +/* DWORD type formating */ +#ifdef __APPLE__ +/* Apple defines DWORD as uint32_t */ +#define DWORD_X "%X" +#define DWORD_D "%d" +#else +/* pcsc-lite defines DWORD as unsigned long */ +#define DWORD_X "%lX" +#define DWORD_D "%ld" +#endif /* * communication ports abstraction diff --git a/ccid/ccid/src/ifdhandler.c b/ccid/ccid/src/ifdhandler.c index 501f811..8ecc913 100644 --- a/ccid/ccid/src/ifdhandler.c +++ b/ccid/ccid/src/ifdhandler.c @@ -1,6 +1,6 @@ /* ifdhandler.c: IFDH API - Copyright (C) 2003-2009 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,14 +17,14 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* $Id: ifdhandler.c 4346 2009-07-28 13:39:37Z rousseau $ */ +/* $Id: ifdhandler.c 6790 2013-11-25 10:02:35Z rousseau $ */ #include #include #include #include -#include "misc.h" #include "config.h" +#include "misc.h" #include #include #include @@ -38,6 +38,7 @@ #include "towitoko/atr.h" #include "towitoko/pps.h" #include "parser.h" +#include "strlcpycat.h" #ifdef HAVE_PTHREAD #include @@ -57,10 +58,6 @@ int PowerOnVoltage = VOLTAGE_5V; static int DebugInitialized = FALSE; /* local functions */ -#if HAVE_DECL_TAG_IFD_POLLING_THREAD && !defined(TWIN_SERIAL) && defined(USE_USB_INTERRUPT) -static RESPONSECODE IFDHPolling(DWORD Lun); -static RESPONSECODE IFDHSleep(DWORD Lun); -#endif static void init_driver(void); static void extra_egt(ATR_t *atr, _ccid_descriptor *ccid_desc, DWORD Protocol); static char find_baud_rate(unsigned int baudrate, unsigned int *list); @@ -68,9 +65,11 @@ static unsigned int T0_card_timeout(double f, double d, int TC1, int TC2, int clock_frequency); static unsigned int T1_card_timeout(double f, double d, int TC1, int BWI, int CWI, int clock_frequency); +static int get_IFSC(ATR_t *atr, int *i); -EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice) +static RESPONSECODE CreateChannelByNameOrChannel(DWORD Lun, + LPSTR lpcDevice, DWORD Channel) { RESPONSECODE return_value = IFD_SUCCESS; int reader_index; @@ -79,7 +78,14 @@ EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice) if (! DebugInitialized) init_driver(); - DEBUG_INFO3("lun: %X, device: %s", Lun, lpcDevice); + if (lpcDevice) + { + DEBUG_INFO3("Lun: " DWORD_X ", device: %s", Lun, lpcDevice); + } + else + { + DEBUG_INFO3("Lun: " DWORD_X ", Channel: " DWORD_X, Lun, Channel); + } if (-1 == (reader_index = GetNewReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; @@ -92,13 +98,20 @@ EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice) CcidSlots[reader_index].bPowerFlags = POWERFLAGS_RAZ; /* reader name */ - CcidSlots[reader_index].readerName = strdup(lpcDevice); + if (lpcDevice) + CcidSlots[reader_index].readerName = strdup(lpcDevice); + else + CcidSlots[reader_index].readerName = strdup("no name"); #ifdef HAVE_PTHREAD (void)pthread_mutex_lock(&ifdh_context_mutex); #endif - ret = OpenPortByName(reader_index, lpcDevice); + if (lpcDevice) + ret = OpenPortByName(reader_index, lpcDevice); + else + ret = OpenPort(reader_index, Channel); + if (ret != STATUS_SUCCESS) { DEBUG_CRITICAL("failed"); @@ -107,11 +120,15 @@ EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice) else return_value = IFD_COMMUNICATION_ERROR; - /* release the allocated reader_index */ - ReleaseReaderIndex(reader_index); + goto error; } else { + unsigned char pcbuffer[SIZE_GET_SLOT_STATUS]; + unsigned int oldReadTimeout; + RESPONSECODE cmd_ret; + _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + /* Maybe we have a special treatment for this reader */ (void)ccid_open_hack_pre(reader_index); @@ -120,30 +137,62 @@ EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice) * restarted with the reader already connected. We get some * "usb_bulk_read: Resource temporarily unavailable" on the first * few tries. It is an empirical hack */ - if ((IFD_COMMUNICATION_ERROR == IFDHICCPresence(Lun)) - && (IFD_COMMUNICATION_ERROR == IFDHICCPresence(Lun)) - && (IFD_COMMUNICATION_ERROR == IFDHICCPresence(Lun))) + + /* The reader may have to start here so give it some time */ + cmd_ret = CmdGetSlotStatus(reader_index, pcbuffer); + if (IFD_NO_SUCH_DEVICE == cmd_ret) + { + return_value = cmd_ret; + goto error; + } + + /* save the current read timeout computed from card capabilities */ + oldReadTimeout = ccid_descriptor->readTimeout; + + /* 100 ms just to resync the USB toggle bits */ + ccid_descriptor->readTimeout = 100; + + if ((IFD_COMMUNICATION_ERROR == CmdGetSlotStatus(reader_index, pcbuffer)) + && (IFD_COMMUNICATION_ERROR == CmdGetSlotStatus(reader_index, pcbuffer))) { DEBUG_CRITICAL("failed"); return_value = IFD_COMMUNICATION_ERROR; - - /* release the allocated resources */ - (void)ClosePort(reader_index); - ReleaseReaderIndex(reader_index); } - else + else + { /* Maybe we have a special treatment for this reader */ - (void)ccid_open_hack_post(reader_index); + return_value = ccid_open_hack_post(reader_index); + if (return_value != IFD_SUCCESS) + { + DEBUG_CRITICAL("failed"); + } + } + + /* set back the old timeout */ + ccid_descriptor->readTimeout = oldReadTimeout; } +error: #ifdef HAVE_PTHREAD (void)pthread_mutex_unlock(&ifdh_context_mutex); #endif + if (return_value != IFD_SUCCESS) + { + /* release the allocated resources */ + free(CcidSlots[reader_index].readerName); + ReleaseReaderIndex(reader_index); + } + return return_value; -} /* IFDHCreateChannelByName */ +} /* CreateChannelByNameOrChannel */ +EXTERNAL RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice) +{ + return CreateChannelByNameOrChannel(Lun, lpcDevice, -1); +} + EXTERNAL RESPONSECODE IFDHCreateChannel(DWORD Lun, DWORD Channel) { /* @@ -179,70 +228,7 @@ EXTERNAL RESPONSECODE IFDHCreateChannel(DWORD Lun, DWORD Channel) * * IFD_SUCCESS IFD_COMMUNICATION_ERROR */ - RESPONSECODE return_value = IFD_SUCCESS; - int reader_index; - - if (! DebugInitialized) - init_driver(); - - DEBUG_INFO2("lun: %X", Lun); - - if (-1 == (reader_index = GetNewReaderIndex(Lun))) - return IFD_COMMUNICATION_ERROR; - - /* Reset ATR buffer */ - CcidSlots[reader_index].nATRLength = 0; - *CcidSlots[reader_index].pcATRBuffer = '\0'; - - /* Reset PowerFlags */ - CcidSlots[reader_index].bPowerFlags = POWERFLAGS_RAZ; - - /* reader name */ - CcidSlots[reader_index].readerName = strdup("no name"); - -#ifdef HAVE_PTHREAD - (void)pthread_mutex_lock(&ifdh_context_mutex); -#endif - - if (OpenPort(reader_index, Channel) != STATUS_SUCCESS) - { - DEBUG_CRITICAL("failed"); - return_value = IFD_COMMUNICATION_ERROR; - - /* release the allocated reader_index */ - ReleaseReaderIndex(reader_index); - } - else - { - /* Maybe we have a special treatment for this reader */ - (void)ccid_open_hack_pre(reader_index); - - /* Try to access the reader */ - /* This "warm up" sequence is sometimes needed when pcscd is - * restarted with the reader already connected. We get some - * "usb_bulk_read: Resource temporarily unavailable" on the first - * few tries. It is an empirical hack */ - if ((IFD_COMMUNICATION_ERROR == IFDHICCPresence(Lun)) - && (IFD_COMMUNICATION_ERROR == IFDHICCPresence(Lun)) - && (IFD_COMMUNICATION_ERROR == IFDHICCPresence(Lun))) - { - DEBUG_CRITICAL("failed"); - return_value = IFD_COMMUNICATION_ERROR; - - /* release the allocated resources */ - (void)ClosePort(reader_index); - ReleaseReaderIndex(reader_index); - } - else - /* Maybe we have a special treatment for this reader */ - (void)ccid_open_hack_post(reader_index); - } - -#ifdef HAVE_PTHREAD - (void)pthread_mutex_unlock(&ifdh_context_mutex); -#endif - - return return_value; + return CreateChannelByNameOrChannel(Lun, NULL, Channel); } /* IFDHCreateChannel */ @@ -263,7 +249,8 @@ EXTERNAL RESPONSECODE IFDHCloseChannel(DWORD Lun) if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO3("%s (lun: %X)", CcidSlots[reader_index].readerName, Lun); + DEBUG_INFO3("%s (lun: " DWORD_X ")", CcidSlots[reader_index].readerName, + Lun); /* Restore the default timeout * No need to wait too long if the reader disapeared */ @@ -290,37 +277,33 @@ EXTERNAL RESPONSECODE IFDHCloseChannel(DWORD Lun) } /* IFDHCloseChannel */ -#if HAVE_DECL_TAG_IFD_POLLING_THREAD && !defined(TWIN_SERIAL) && defined(USE_USB_INTERRUPT) -static RESPONSECODE IFDHPolling(DWORD Lun) +#if !defined(TWIN_SERIAL) +static RESPONSECODE IFDHPolling(DWORD Lun, int timeout) { int reader_index; - int ret; if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; /* log only if DEBUG_LEVEL_PERIODIC is set */ if (LogLevel & DEBUG_LEVEL_PERIODIC) - DEBUG_INFO3("%s (lun: %X)", CcidSlots[reader_index].readerName, Lun); - - ret = InterruptRead(reader_index, 2*1000); /* 2 seconds */ - if (ret > 0) - return IFD_SUCCESS; - if (0 == ret) - return IFD_NO_SUCH_DEVICE; - return IFD_COMMUNICATION_ERROR; + DEBUG_INFO4("%s (lun: " DWORD_X ") %d ms", + CcidSlots[reader_index].readerName, Lun, timeout); + + return InterruptRead(reader_index, timeout); } /* on an ICCD device the card is always inserted * so no card movement will ever happen: just do nothing */ -static RESPONSECODE IFDHSleep(DWORD Lun) +static RESPONSECODE IFDHSleep(DWORD Lun, int timeout) { int reader_index; if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO3("%s (lun: %X)", CcidSlots[reader_index].readerName, Lun); + DEBUG_INFO4("%s (lun: " DWORD_X ") %d ms", + CcidSlots[reader_index].readerName, Lun, timeout); /* just sleep for 5 seconds since the polling thread is NOT killable * so pcscd event thread must loop to exit cleanly @@ -329,7 +312,21 @@ static RESPONSECODE IFDHSleep(DWORD Lun) * TAG_IFD_POLLING_THREAD_KILLABLE then we could use a much longer delay * and be killed before pcscd exits */ - (void)sleep(600); /* 10 minutes */ + (void)usleep(timeout); + return IFD_SUCCESS; +} + +static RESPONSECODE IFDHStopPolling(DWORD Lun) +{ + int reader_index; + + if (-1 == (reader_index = LunToReaderIndex(Lun))) + return IFD_COMMUNICATION_ERROR; + + DEBUG_INFO3("%s (lun: " DWORD_X ")", + CcidSlots[reader_index].readerName, Lun); + + (void)InterruptStop(reader_index); return IFD_SUCCESS; } #endif @@ -356,11 +353,12 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, * IFD_SUCCESS IFD_ERROR_TAG */ int reader_index; + RESPONSECODE return_value = IFD_SUCCESS; if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO4("tag: 0x%X, %s (lun: %X)", Tag, + DEBUG_INFO4("tag: 0x" DWORD_X ", %s (lun: " DWORD_X ")", Tag, CcidSlots[reader_index].readerName, Lun); switch (Tag) @@ -370,11 +368,41 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, /* If Length is not zero, powerICC has been performed. * Otherwise, return NULL pointer * Buffer size is stored in *Length */ - *Length = (*Length < CcidSlots[reader_index].nATRLength) ? - *Length : CcidSlots[reader_index].nATRLength; + if ((int)*Length >= CcidSlots[reader_index].nATRLength) + { + *Length = CcidSlots[reader_index].nATRLength; - if (*Length) memcpy(Value, CcidSlots[reader_index].pcATRBuffer, *Length); + } + else + return_value = IFD_ERROR_INSUFFICIENT_BUFFER; + break; + + case SCARD_ATTR_ICC_INTERFACE_STATUS: + *Length = 1; + if (IFD_ICC_PRESENT == IFDHICCPresence(Lun)) + /* nonzero if contact is active */ + *Value = 1; + else + /* smart card electrical contact is not active */ + *Value = 0; + break; + + case SCARD_ATTR_ICC_PRESENCE: + *Length = 1; + /* Single byte indicating smart card presence: + * 0 = not present + * 1 = card present but not swallowed (applies only if + * reader supports smart card swallowing) + * 2 = card present (and swallowed if reader supports smart + * card swallowing) + * 4 = card confiscated. */ + if (IFD_ICC_PRESENT == IFDHICCPresence(Lun)) + /* Card present */ + *Value = 2; + else + /* Not present */ + *Value = 0; break; #ifdef HAVE_PTHREAD @@ -384,6 +412,8 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *Length = 1; *Value = CCID_DRIVER_MAX_READERS; } + else + return_value = IFD_ERROR_INSUFFICIENT_BUFFER; break; case TAG_IFD_THREAD_SAFE: @@ -396,6 +426,8 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *Value = 1; /* Can talk to multiple readers at the same time */ #endif } + else + return_value = IFD_ERROR_INSUFFICIENT_BUFFER; break; #endif @@ -417,6 +449,8 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, #endif DEBUG_INFO2("Reader supports %d slot(s)", *Value); } + else + return_value = IFD_ERROR_INSUFFICIENT_BUFFER; break; case TAG_IFD_SLOT_THREAD_SAFE: @@ -425,22 +459,38 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *Length = 1; *Value = 0; /* Can NOT talk to multiple slots at the same time */ } + else + return_value = IFD_ERROR_INSUFFICIENT_BUFFER; break; case SCARD_ATTR_VENDOR_IFD_VERSION: - /* Vendor-supplied interface device version (DWORD in the form - * 0xMMmmbbbb where MM = major version, mm = minor version, and - * bbbb = build number). */ - *Length = sizeof(DWORD); - if (Value) - *(DWORD *)Value = CCID_VERSION; + { + int IFD_bcdDevice = get_ccid_descriptor(reader_index)->IFD_bcdDevice; + + /* Vendor-supplied interface device version (DWORD in the form + * 0xMMmmbbbb where MM = major version, mm = minor version, and + * bbbb = build number). */ + *Length = 4; + if (Value) + *(uint32_t *)Value = IFD_bcdDevice << 16; + } break; case SCARD_ATTR_VENDOR_NAME: -#define VENDOR_NAME "Ludovic Rousseau" - *Length = sizeof(VENDOR_NAME); - if (Value) - memcpy(Value, VENDOR_NAME, sizeof(VENDOR_NAME)); + { + const char *sIFD_iManufacturer = get_ccid_descriptor(reader_index) -> sIFD_iManufacturer; + + if (sIFD_iManufacturer) + { + strlcpy((char *)Value, sIFD_iManufacturer, *Length); + *Length = strlen((char *)Value) +1; + } + else + { + /* not supported */ + *Length = 0; + } + } break; case SCARD_ATTR_MAXINPUT: @@ -449,8 +499,8 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *(uint32_t *)Value = get_ccid_descriptor(reader_index) -> dwMaxCCIDMessageLength -10; break; -#if HAVE_DECL_TAG_IFD_POLLING_THREAD && !defined(TWIN_SERIAL) && defined(USE_USB_INTERRUPT) - case TAG_IFD_POLLING_THREAD: +#if !defined(TWIN_SERIAL) + case TAG_IFD_POLLING_THREAD_WITH_TIMEOUT: { _ccid_descriptor *ccid_desc; @@ -458,8 +508,9 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *Length = 0; ccid_desc = get_ccid_descriptor(reader_index); + /* CCID and not ICCD */ - if ((0 == ccid_desc -> bInterfaceProtocol) + if ((PROTOCOL_CCID == ccid_desc -> bInterfaceProtocol) /* 3 end points */ && (3 == ccid_desc -> bNumEndpoints)) { @@ -468,8 +519,8 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *(void **)Value = IFDHPolling; } - if ((ICCD_A == ccid_desc->bInterfaceProtocol) - || (ICCD_B == ccid_desc->bInterfaceProtocol)) + if ((PROTOCOL_ICCD_A == ccid_desc->bInterfaceProtocol) + || (PROTOCOL_ICCD_B == ccid_desc->bInterfaceProtocol)) { *Length = sizeof(void *); if (Value) @@ -486,8 +537,8 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, *Length = 0; ccid_desc = get_ccid_descriptor(reader_index); - if ((ICCD_A == ccid_desc->bInterfaceProtocol) - || (ICCD_B == ccid_desc->bInterfaceProtocol)) + if ((PROTOCOL_ICCD_A == ccid_desc->bInterfaceProtocol) + || (PROTOCOL_ICCD_B == ccid_desc->bInterfaceProtocol)) { *Length = 1; /* 1 char */ if (Value) @@ -495,13 +546,51 @@ EXTERNAL RESPONSECODE IFDHGetCapabilities(DWORD Lun, DWORD Tag, } } break; + + case TAG_IFD_STOP_POLLING_THREAD: + { + _ccid_descriptor *ccid_desc; + + /* default value: not supported */ + *Length = 0; + + ccid_desc = get_ccid_descriptor(reader_index); + /* CCID and not ICCD */ + if ((PROTOCOL_CCID == ccid_desc -> bInterfaceProtocol) + /* 3 end points */ + && (3 == ccid_desc -> bNumEndpoints)) + { + *Length = sizeof(void *); + if (Value) + *(void **)Value = IFDHStopPolling; + } + } + break; #endif + case SCARD_ATTR_VENDOR_IFD_SERIAL_NO: + { + _ccid_descriptor *ccid_desc; + + ccid_desc = get_ccid_descriptor(reader_index); + if (ccid_desc->sIFD_serial_number) + { + strlcpy((char *)Value, ccid_desc->sIFD_serial_number, *Length); + *Length = strlen((char *)Value); + } + else + { + /* not supported */ + *Length = 0; + } + } + break; + default: - return IFD_ERROR_TAG; + return_value = IFD_ERROR_TAG; } - return IFD_SUCCESS; + return return_value; } /* IFDHGetCapabilities */ @@ -525,19 +614,17 @@ EXTERNAL RESPONSECODE IFDHSetCapabilities(DWORD Lun, DWORD Tag, * IFD_ERROR_VALUE_READ_ONLY */ - /* By default, say it worked */ + (void)Length; + (void)Value; int reader_index; if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO4("tag: 0x%X, %s (lun: %X)", Tag, + DEBUG_INFO4("tag: 0x" DWORD_X ", %s (lun: " DWORD_X ")", Tag, CcidSlots[reader_index].readerName, Lun); - /* if (CheckLun(Lun)) - return IFD_COMMUNICATION_ERROR; */ - return IFD_NOT_SUPPORTED; } /* IFDHSetCapabilities */ @@ -577,8 +664,8 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO4("protocol T=%d, %s (lun: %X)", Protocol-SCARD_PROTOCOL_T0, - CcidSlots[reader_index].readerName, Lun); + DEBUG_INFO4("protocol T=" DWORD_D ", %s (lun: " DWORD_X ")", + Protocol-SCARD_PROTOCOL_T0, CcidSlots[reader_index].readerName, Lun); /* Set to zero buffer */ memset(pps, 0, sizeof(pps)); @@ -591,7 +678,10 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, /* Do not send CCID command SetParameters or PPS to the CCID * The CCID will do this himself */ if (ccid_desc->dwFeatures & CCID_CLASS_AUTO_PPS_PROP) + { + DEBUG_COMM2("Timeout: %d ms", ccid_desc->readTimeout); goto end; + } /* Get ATR of the card */ (void)ATR_InitFromArray(&atr, ccid_slot->pcATRBuffer, @@ -794,8 +884,8 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, { /* convert from ATR_PROTOCOL_TYPE_T? to SCARD_PROTOCOL_T? */ Protocol = default_protocol + - (SCARD_PROTOCOL_T0 - ATR_PROTOCOL_TYPE_T0); - DEBUG_INFO2("PPS not supported on O2Micro readers. Using T=%d", + (SCARD_PROTOCOL_T0 - ATR_PROTOCOL_TYPE_T0); + DEBUG_INFO2("PPS not supported on O2Micro readers. Using T=" DWORD_D, Protocol - SCARD_PROTOCOL_T0); } else @@ -833,6 +923,7 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, t1_state_t *t1 = &(ccid_slot -> t1); RESPONSECODE ret; double f, d; + int ifsc; /* TA1 is not default */ if (PPS_HAS_PPS1(pps)) @@ -860,9 +951,9 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, { /* Hack for OpenPGP card */ - char openpgp_atr[] = { 0x3B, 0xFA, 0x13, 0x00, 0xFF, 0x81, - 0x31, 0x80, 0x45, 0x00, 0x31, 0xC1, 0x73, 0xC0, - 0x01, 0x00, 0x00, 0x90, 0x00, 0xB1 }; + unsigned char openpgp_atr[] = { 0x3B, 0xFA, 0x13, + 0x00, 0xFF, 0x81, 0x31, 0x80, 0x45, 0x00, 0x31, + 0xC1, 0x73, 0xC0, 0x01, 0x00, 0x00, 0x90, 0x00, 0xB1 }; if (0 == memcmp(ccid_slot->pcATRBuffer, openpgp_atr, ccid_slot->nATRLength)) @@ -886,19 +977,14 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, (param[3] & 0xF0) >> 4 /* BWI */, param[3] & 0x0F /* CWI */, ccid_desc->dwDefaultClock); - /* TAi (i>2) present? IFSC */ - for (i=2; i2) must be used */ - break; - } + ifsc = get_IFSC(&atr, &i); + if (ifsc > 0) + { + DEBUG_COMM3("IFSC (TA%d) present: %d", i, ifsc); + param[5] = ifsc; + } - DEBUG_COMM2("Timeout: %d seconds", ccid_desc->readTimeout); + DEBUG_COMM2("Timeout: %d ms", ccid_desc->readTimeout); ret = SetParameters(reader_index, 1, sizeof(param), param); if (IFD_SUCCESS != ret) @@ -939,8 +1025,7 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, ccid_desc->readTimeout = T0_card_timeout(f, d, param[2] /* TC1 */, param[3] /* TC2 */, ccid_desc->dwDefaultClock); - DEBUG_COMM2("Communication timeout: %d seconds", - ccid_desc->readTimeout); + DEBUG_COMM2("Communication timeout: %d ms", ccid_desc->readTimeout); ret = SetParameters(reader_index, 0, sizeof(param), param); if (IFD_SUCCESS != ret) @@ -951,20 +1036,14 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol, if (SCARD_PROTOCOL_T1 == Protocol) { t1_state_t *t1 = &(ccid_slot -> t1); - int i; - - /* TAi (i>2) present? */ - for (i=2; i2) must be used */ - break; - } + ifsc = get_IFSC(&atr, &i); + if (ifsc > 0) + { + DEBUG_COMM3("IFSC (TA%d) present: %d", i, ifsc); + (void)t1_set_param(t1, IFD_PROTOCOL_T1_IFSC, ifsc); + } /* IFSD not negociated by the reader? */ if (! (ccid_desc->dwFeatures & CCID_CLASS_AUTO_IFSD)) @@ -1027,7 +1106,7 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action, unsigned int nlength; RESPONSECODE return_value = IFD_SUCCESS; - unsigned char pcbuffer[RESP_BUF_SIZE]; + unsigned char pcbuffer[10+MAX_ATR_SIZE]; int reader_index; const char *actions[] = { "PowerUp", "PowerDown", "Reset" }; unsigned int oldReadTimeout; @@ -1039,8 +1118,8 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action, if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO4("action: %s, %s (lun: %X)", actions[Action-IFD_POWER_UP], - CcidSlots[reader_index].readerName, Lun); + DEBUG_INFO4("action: %s, %s (lun: " DWORD_X ")", + actions[Action-IFD_POWER_UP], CcidSlots[reader_index].readerName, Lun); switch (Action) { @@ -1070,6 +1149,19 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action, ccid_descriptor = get_ccid_descriptor(reader_index); oldReadTimeout = ccid_descriptor->readTimeout; + /* The German eID card is bogus and need to be powered off + * before a power on */ + if (KOBIL_IDTOKEN == ccid_descriptor -> readerID) + { + /* send the command */ + if (IFD_SUCCESS != CmdPowerOff(reader_index)) + { + DEBUG_CRITICAL("PowerDown failed"); + return_value = IFD_ERROR_POWER_ACTION; + goto end; + } + } + /* use a very long timeout since the card can use up to * (9600+12)*33 ETU in total * 12 ETU per byte @@ -1078,7 +1170,7 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action, * 1 ETU = 372 cycles during ATR * with a 4 MHz clock => 29 seconds */ - ccid_descriptor->readTimeout = 60; + ccid_descriptor->readTimeout = 60*1000; nlength = sizeof(pcbuffer); return_value = CmdPowerOn(reader_index, &nlength, pcbuffer, @@ -1090,8 +1182,9 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD Lun, DWORD Action, if (return_value != IFD_SUCCESS) { /* used by GemCore SIM PRO: no card is present */ - get_ccid_descriptor(reader_index)->dwSlotStatus - = IFD_ICC_NOT_PRESENT;; + if (GEMCORESIMPRO == ccid_descriptor -> readerID) + get_ccid_descriptor(reader_index)->dwSlotStatus + = IFD_ICC_NOT_PRESENT; DEBUG_CRITICAL("PowerUp failed"); return_value = IFD_ERROR_POWER_ACTION; @@ -1164,10 +1257,64 @@ EXTERNAL RESPONSECODE IFDHTransmitToICC(DWORD Lun, SCARD_IO_HEADER SendPci, unsigned int rx_length; int reader_index; + (void)RecvPci; + if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_INFO3("%s (lun: %X)", CcidSlots[reader_index].readerName, Lun); + DEBUG_INFO3("%s (lun: " DWORD_X ")", CcidSlots[reader_index].readerName, + Lun); + + /* special APDU for the Kobil IDToken (CLASS = 0xFF) */ + if (KOBIL_IDTOKEN == get_ccid_descriptor(reader_index) -> readerID) + { + char manufacturer[] = {0xFF, 0x9A, 0x01, 0x01, 0x00}; + char product_name[] = {0xFF, 0x9A, 0x01, 0x03, 0x00}; + char firmware_version[] = {0xFF, 0x9A, 0x01, 0x06, 0x00}; + char driver_version[] = {0xFF, 0x9A, 0x01, 0x07, 0x00}; + + if ((sizeof manufacturer == TxLength) + && (memcmp(TxBuffer, manufacturer, sizeof manufacturer) == 0)) + { + DEBUG_INFO("IDToken: Manufacturer command"); + memcpy(RxBuffer, "KOBIL systems\220\0", 15); + *RxLength = 15; + return IFD_SUCCESS; + } + + if ((sizeof product_name == TxLength) + && (memcmp(TxBuffer, product_name, sizeof product_name) == 0)) + { + DEBUG_INFO("IDToken: Product name command"); + memcpy(RxBuffer, "IDToken\220\0", 9); + *RxLength = 9; + return IFD_SUCCESS; + } + + if ((sizeof firmware_version == TxLength) + && (memcmp(TxBuffer, firmware_version, sizeof firmware_version) == 0)) + { + int IFD_bcdDevice = get_ccid_descriptor(reader_index)->IFD_bcdDevice; + + DEBUG_INFO("IDToken: Firmware version command"); + *RxLength = sprintf((char *)RxBuffer, "%X.%02X", + IFD_bcdDevice >> 8, IFD_bcdDevice & 0xFF); + RxBuffer[(*RxLength)++] = 0x90; + RxBuffer[(*RxLength)++] = 0x00; + return IFD_SUCCESS; + } + + if ((sizeof driver_version == TxLength) + && (memcmp(TxBuffer, driver_version, sizeof driver_version) == 0)) + { + DEBUG_INFO("IDToken: Driver version command"); +#define DRIVER_VERSION "2012.2.7\220\0" + memcpy(RxBuffer, DRIVER_VERSION, sizeof DRIVER_VERSION -1); + *RxLength = sizeof DRIVER_VERSION -1; + return IFD_SUCCESS; + } + + } rx_length = *RxLength; return_value = CmdXfrBlock(reader_index, TxLength, TxBuffer, &rx_length, @@ -1199,15 +1346,18 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, * * Notes: RxLength should be zero on error. */ - RESPONSECODE return_value = IFD_COMMUNICATION_ERROR; + RESPONSECODE return_value = IFD_ERROR_NOT_SUPPORTED; int reader_index; + _ccid_descriptor *ccid_descriptor; reader_index = LunToReaderIndex(Lun); if ((-1 == reader_index) || (NULL == pdwBytesReturned)) - return return_value; + return IFD_COMMUNICATION_ERROR; - DEBUG_INFO4("ControlCode: 0x%X, %s (lun: %X)", dwControlCode, - CcidSlots[reader_index].readerName, Lun); + ccid_descriptor = get_ccid_descriptor(reader_index); + + DEBUG_INFO4("ControlCode: 0x" DWORD_X ", %s (lun: " DWORD_X ")", + dwControlCode, CcidSlots[reader_index].readerName, Lun); DEBUG_INFO_XXD("Control TxBuffer: ", TxBuffer, TxLength); /* Set the return length to 0 to avoid problems */ @@ -1215,7 +1365,29 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, if (IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE == dwControlCode) { - if (FALSE == (DriverOptions & DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED)) + int allowed = (DriverOptions & DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED); + int readerID = ccid_descriptor -> readerID; + + if (VENDOR_GEMALTO == GET_VENDOR(readerID)) + { + unsigned char switch_interface[] = { 0x52, 0xF8, 0x04, 0x01, 0x00 }; + + /* get firmware version escape command */ + if ((1 == TxLength) && (0x02 == TxBuffer[0])) + allowed = TRUE; + + /* switch interface escape command on the GemProx DU + * the next byte in the command is the interface: + * 0x01 switch to contactless interface + * 0x02 switch to contact interface + */ + if ((GEMALTOPROXDU == readerID) + && (6 == TxLength) + && (0 == memcmp(TxBuffer, switch_interface, sizeof(switch_interface)))) + allowed = TRUE; + } + + if (!allowed) { DEBUG_INFO("ifd exchange (Escape command) not allowed"); return_value = IFD_COMMUNICATION_ERROR; @@ -1225,27 +1397,31 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, unsigned int iBytesReturned; iBytesReturned = RxLength; - return_value = CmdEscape(reader_index, TxBuffer, TxLength, RxBuffer, - &iBytesReturned); + /* 30 seconds timeout for long commands */ + return_value = CmdEscape(reader_index, TxBuffer, TxLength, + RxBuffer, &iBytesReturned, 30*1000); *pdwBytesReturned = iBytesReturned; } } - /* Implement the PC/SC v2.02.05 Part 10 IOCTL mechanism */ + /* Implement the PC/SC v2.02.07 Part 10 IOCTL mechanism */ /* Query for features */ - if (CM_IOCTL_GET_FEATURE_REQUEST == dwControlCode) + /* 0x313520 is the Windows value for SCARD_CTL_CODE(3400) + * This hack is needed for RDP applications */ + if ((CM_IOCTL_GET_FEATURE_REQUEST == dwControlCode) + || (0x313520 == dwControlCode)) { unsigned int iBytesReturned = 0; PCSC_TLV_STRUCTURE *pcsc_tlv = (PCSC_TLV_STRUCTURE *)RxBuffer; + int readerID = ccid_descriptor -> readerID; - /* we need room for up to for records */ - if (RxLength < 4 * sizeof(PCSC_TLV_STRUCTURE)) - return IFD_COMMUNICATION_ERROR; + /* we need room for up to five records */ + if (RxLength < 6 * sizeof(PCSC_TLV_STRUCTURE)) + return IFD_ERROR_INSUFFICIENT_BUFFER; /* We can only support direct verify and/or modify currently */ - if (get_ccid_descriptor(reader_index) -> bPINSupport - & CCID_CLASS_PIN_VERIFY) + if (ccid_descriptor -> bPINSupport & CCID_CLASS_PIN_VERIFY) { pcsc_tlv -> tag = FEATURE_VERIFY_PIN_DIRECT; pcsc_tlv -> length = 0x04; /* always 0x04 */ @@ -1255,8 +1431,7 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); } - if (get_ccid_descriptor(reader_index) -> bPINSupport - & CCID_CLASS_PIN_MODIFY) + if (ccid_descriptor -> bPINSupport & CCID_CLASS_PIN_MODIFY) { pcsc_tlv -> tag = FEATURE_MODIFY_PIN_DIRECT; pcsc_tlv -> length = 0x04; /* always 0x04 */ @@ -1266,21 +1441,40 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); } -#ifdef FEATURE_IFD_PIN_PROPERTIES - /* We can always forward wLcdLayout */ - pcsc_tlv -> tag = FEATURE_IFD_PIN_PROPERTIES; - pcsc_tlv -> length = 0x04; /* always 0x04 */ - pcsc_tlv -> value = htonl(IOCTL_FEATURE_IFD_PIN_PROPERTIES); + /* Provide IFD_PIN_PROPERTIES only for pinpad readers */ + if (ccid_descriptor -> bPINSupport) + { + pcsc_tlv -> tag = FEATURE_IFD_PIN_PROPERTIES; + pcsc_tlv -> length = 0x04; /* always 0x04 */ + pcsc_tlv -> value = htonl(IOCTL_FEATURE_IFD_PIN_PROPERTIES); + pcsc_tlv++; + iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); + } + + if ((KOBIL_TRIBANK == readerID) + || (KOBIL_MIDENTITY_VISUAL == readerID)) + { + pcsc_tlv -> tag = FEATURE_MCT_READER_DIRECT; + pcsc_tlv -> length = 0x04; /* always 0x04 */ + pcsc_tlv -> value = htonl(IOCTL_FEATURE_MCT_READER_DIRECT); + + pcsc_tlv++; + iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); + } + + pcsc_tlv -> tag = FEATURE_GET_TLV_PROPERTIES; + pcsc_tlv -> length = 0x04; /* always 0x04 */ + pcsc_tlv -> value = htonl(IOCTL_FEATURE_GET_TLV_PROPERTIES); pcsc_tlv++; iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); -#endif - if (KOBIL_TRIBANK == get_ccid_descriptor(reader_index) -> readerID) + /* IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE */ + if (DriverOptions & DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED) { - pcsc_tlv -> tag = FEATURE_MCT_READERDIRECT; + pcsc_tlv -> tag = FEATURE_CCID_ESC_COMMAND; pcsc_tlv -> length = 0x04; /* always 0x04 */ - pcsc_tlv -> value = htonl(IOCTL_FEATURE_MCT_READERDIRECT); + pcsc_tlv -> value = htonl(IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE); pcsc_tlv++; iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); @@ -1290,26 +1484,147 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, return_value = IFD_SUCCESS; } -#ifdef FEATURE_IFD_PIN_PROPERTIES /* Get PIN handling capabilities */ if (IOCTL_FEATURE_IFD_PIN_PROPERTIES == dwControlCode) { PIN_PROPERTIES_STRUCTURE *caps = (PIN_PROPERTIES_STRUCTURE *)RxBuffer; if (RxLength < sizeof(PIN_PROPERTIES_STRUCTURE)) - return IFD_COMMUNICATION_ERROR; + return IFD_ERROR_INSUFFICIENT_BUFFER; /* Only give the LCD size for now */ - caps -> wLcdLayout = get_ccid_descriptor(reader_index) -> wLcdLayout; - caps -> wLcdMaxCharacters = 0x0000; - caps -> wLcdMaxLines = 0x0000; + caps -> wLcdLayout = ccid_descriptor -> wLcdLayout; caps -> bEntryValidationCondition = 0x07; /* Default */ caps -> bTimeOut2 = 0x00; /* We do not distinguish bTimeOut from TimeOut2 */ *pdwBytesReturned = sizeof(*caps); return_value = IFD_SUCCESS; } -#endif + + /* Reader features */ + if (IOCTL_FEATURE_GET_TLV_PROPERTIES == dwControlCode) + { + int p = 0; + int tmp; + + /* wLcdLayout */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_wLcdLayout; /* tag */ + RxBuffer[p++] = 2; /* length */ + tmp = ccid_descriptor -> wLcdLayout; + RxBuffer[p++] = tmp & 0xFF; /* value in little endian order */ + RxBuffer[p++] = (tmp >> 8) & 0xFF; + + /* only if the reader has a display */ + if (ccid_descriptor -> wLcdLayout) + { + /* wLcdMaxCharacters */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_wLcdMaxCharacters; /* tag */ + RxBuffer[p++] = 2; /* length */ + tmp = ccid_descriptor -> wLcdLayout & 0xFF; + RxBuffer[p++] = tmp & 0xFF; /* value in little endian order */ + RxBuffer[p++] = (tmp >> 8) & 0xFF; + + /* wLcdMaxLines */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_wLcdMaxLines; /* tag */ + RxBuffer[p++] = 2; /* length */ + tmp = ccid_descriptor -> wLcdLayout >> 8; + RxBuffer[p++] = tmp & 0xFF; /* value in little endian order */ + RxBuffer[p++] = (tmp >> 8) & 0xFF; + } + + /* bTimeOut2 */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bTimeOut2; + RxBuffer[p++] = 1; /* length */ + /* IFD does not distinguish bTimeOut from bTimeOut2 */ + RxBuffer[p++] = 0x00; + + /* sFirmwareID */ + if (VENDOR_GEMALTO == GET_VENDOR(ccid_descriptor -> readerID)) + { + unsigned char firmware[256]; + const unsigned char cmd[] = { 0x02 }; + RESPONSECODE ret; + unsigned int len; + + len = sizeof(firmware); + ret = CmdEscape(reader_index, cmd, sizeof(cmd), firmware, &len, 0); + + if (IFD_SUCCESS == ret) + { + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_sFirmwareID; + RxBuffer[p++] = len; + memcpy(&RxBuffer[p], firmware, len); + p += len; + } + } + + /* Gemalto PC Pinpad V1 */ + if ((GEMPCPINPAD == ccid_descriptor -> readerID) + /* Covadis Véga-Alpha */ + || (VEGAALPHA == ccid_descriptor->readerID)) + { + /* bMinPINSize */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bMinPINSize; + RxBuffer[p++] = 1; /* length */ + RxBuffer[p++] = 4; /* min PIN size */ + + /* bMaxPINSize */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bMaxPINSize; + RxBuffer[p++] = 1; /* length */ + RxBuffer[p++] = 8; /* max PIN size */ + + /* bEntryValidationCondition */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bEntryValidationCondition; + RxBuffer[p++] = 1; /* length */ + RxBuffer[p++] = 0x02; /* validation key pressed */ + } + + /* bPPDUSupport */ + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bPPDUSupport; + RxBuffer[p++] = 1; /* length */ + RxBuffer[p++] = + (DriverOptions & DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED) ? 1 : 0; + /* bit0: PPDU is supported over SCardControl using + * FEATURE_CCID_ESC_COMMAND */ + + /* wIdVendor */ + { + int idVendor = ccid_descriptor -> readerID >> 16; + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_wIdVendor; + RxBuffer[p++] = 2; /* length */ + RxBuffer[p++] = idVendor & 0xFF; + RxBuffer[p++] = idVendor >> 8; + } + + /* wIdProduct */ + { + int idProduct = ccid_descriptor -> readerID & 0xFFFF; + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_wIdProduct; + RxBuffer[p++] = 2; /* length */ + RxBuffer[p++] = idProduct & 0xFF; + RxBuffer[p++] = idProduct >> 8; + } + + /* dwMaxAPDUDataSize */ + { + int MaxAPDUDataSize = 0; /* short APDU only by default */ + + /* reader is TPDU or extended APDU */ + if ((ccid_descriptor -> dwFeatures & CCID_CLASS_EXTENDED_APDU) + || (ccid_descriptor -> dwFeatures & CCID_CLASS_TPDU)) + MaxAPDUDataSize = 0x10000; + + RxBuffer[p++] = PCSCv2_PART10_PROPERTY_dwMaxAPDUDataSize; + RxBuffer[p++] = 4; /* length */ + RxBuffer[p++] = MaxAPDUDataSize & 0xFF; + RxBuffer[p++] = (MaxAPDUDataSize >> 8) & 0xFF; + RxBuffer[p++] = (MaxAPDUDataSize >> 16) & 0xFF; + RxBuffer[p++] = (MaxAPDUDataSize >> 24) & 0xFF; + } + + *pdwBytesReturned = p; + return_value = IFD_SUCCESS; + } /* Verify a PIN, plain CCID */ if (IOCTL_FEATURE_VERIFY_PIN_DIRECT == dwControlCode) @@ -1334,7 +1649,7 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, } /* MCT: Multifunctional Card Terminal */ - if (IOCTL_FEATURE_MCT_READERDIRECT == dwControlCode) + if (IOCTL_FEATURE_MCT_READER_DIRECT == dwControlCode) { if ( (TxBuffer[0] != 0x20) /* CLA */ || ((TxBuffer[1] & 0xF0) != 0x70) /* INS */ @@ -1359,8 +1674,8 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, /* we just transmit the buffer as a CCID Escape command */ iBytesReturned = RxLength; - return_value = CmdEscape(reader_index, TxBuffer, TxLength, RxBuffer, - &iBytesReturned); + return_value = CmdEscape(reader_index, TxBuffer, TxLength, + RxBuffer, &iBytesReturned, 0); *pdwBytesReturned = iBytesReturned; } } @@ -1393,12 +1708,15 @@ EXTERNAL RESPONSECODE IFDHICCPresence(DWORD Lun) if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; - DEBUG_PERIODIC3("%s (lun: %X)", CcidSlots[reader_index].readerName, Lun); + DEBUG_PERIODIC3("%s (lun: " DWORD_X ")", CcidSlots[reader_index].readerName, Lun); ccid_descriptor = get_ccid_descriptor(reader_index); - if (GEMCORESIMPRO == ccid_descriptor->readerID) + if ((GEMCORESIMPRO == ccid_descriptor->readerID) + && (ccid_descriptor->IFD_bcdDevice < 0x0200)) { + /* GemCore SIM Pro firmware 2.00 and up features + * a full independant second slot */ return_value = ccid_descriptor->dwSlotStatus; goto end; } @@ -1481,7 +1799,7 @@ EXTERNAL RESPONSECODE IFDHICCPresence(DWORD Lun) if (! (LogLevel & DEBUG_LEVEL_PERIODIC)) LogLevel &= ~DEBUG_LEVEL_COMM; - ret = CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res); + ret = CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res, 0); /* set back the old LogLevel */ LogLevel = oldLogLevel; @@ -1525,9 +1843,10 @@ CcidDesc *get_ccid_slot(unsigned int reader_index) void init_driver(void) { - char keyValue[TOKEN_MAX_VALUE_SIZE]; char infofile[FILENAME_MAX]; char *e; + int rv; + list_t plist, *values; DEBUG_INFO("Driver version: " VERSION); @@ -1535,14 +1854,32 @@ void init_driver(void) (void)snprintf(infofile, sizeof(infofile), "%s/%s/Contents/Info.plist", PCSCLITE_HP_DROPDIR, BUNDLE); - /* Log level */ - if (0 == LTPBundleFindValueWithKey(infofile, "ifdLogLevel", keyValue, 0)) + rv = bundleParse(infofile, &plist); + if (0 == rv) { - /* convert from hex or dec or octal */ - LogLevel = strtoul(keyValue, NULL, 0); + /* Log level */ + rv = LTPBundleFindValueWithKey(&plist, "ifdLogLevel", &values); + if (0 == rv) + { + /* convert from hex or dec or octal */ + LogLevel = strtoul(list_get_at(values, 0), NULL, 0); - /* print the log level used */ - DEBUG_INFO2("LogLevel: 0x%.4X", LogLevel); + /* print the log level used */ + DEBUG_INFO2("LogLevel: 0x%.4X", LogLevel); + } + + /* Driver options */ + rv = LTPBundleFindValueWithKey(&plist, "ifdDriverOptions", &values); + if (0 == rv) + { + /* convert from hex or dec or octal */ + DriverOptions = strtoul(list_get_at(values, 0), NULL, 0); + + /* print the log level used */ + DEBUG_INFO2("DriverOptions: 0x%.4X", DriverOptions); + } + + bundleRelease(&plist); } e = getenv("LIBCCID_ifdLogLevel"); @@ -1554,16 +1891,6 @@ void init_driver(void) /* print the log level used */ DEBUG_INFO2("LogLevel from LIBCCID_ifdLogLevel: 0x%.4X", LogLevel); } - - /* Driver options */ - if (0 == LTPBundleFindValueWithKey(infofile, "ifdDriverOptions", keyValue, 0)) - { - /* convert from hex or dec or octal */ - DriverOptions = strtoul(keyValue, NULL, 0); - - /* print the log level used */ - DEBUG_INFO2("DriverOptions: 0x%.4X", DriverOptions); - } /* get the voltage parameter */ switch ((DriverOptions >> 4) & 0x03) @@ -1609,7 +1936,6 @@ void extra_egt(ATR_t *atr, _ccid_descriptor *ccid_desc, DWORD Protocol) unsigned int card_baudrate; unsigned int default_baudrate; double f, d; - int i; /* if TA1 not present */ if (! atr->ib[0][ATR_INTERFACE_BYTE_TA].present) @@ -1647,6 +1973,8 @@ void extra_egt(ATR_t *atr, _ccid_descriptor *ccid_desc, DWORD Protocol) if (SCARD_PROTOCOL_T1 == Protocol) { + int i; + /* TBi (i>2) present? BWI/CWI */ for (i=2; i * <- Procedure byte * 256 data bytes -> - * <- SW1-SW2 + * <- SW1-SW2 * = 261 EGT + 3 WWT + 3 WWT * * ISO_OUT Timeout is the sum of: * Terminal: Smart card: * 5 bytes header cmd -> - * <- Procedure byte + 256 data bytes + SW1-SW2 + * <- Procedure byte + 256 data bytes + SW1-SW2 * = 5 EGT + 1 WWT + 259 WWT */ @@ -1724,7 +2052,7 @@ static unsigned int T0_card_timeout(double f, double d, int TC1, int TC2, /* may happen with non ISO cards */ if ((0 == f) || (0 == d) || (0 == clock_frequency)) - return 60; /* 60 seconds */ + return 60 * 1000; /* 60 seconds */ /* EGT */ /* see ch. 6.5.3 Extra Guard Time, page 12 of ISO 7816-3 */ @@ -1736,16 +2064,11 @@ static unsigned int T0_card_timeout(double f, double d, int TC1, int TC2, /* ISO in */ t = 261 * EGT + (3 + 3) * WWT; - /* Convert from milliseonds to seconds rouned to the upper value - * use +1 instead of ceil() to round up to the nearest integer - * so we can avoid a dependency on the math library */ - t = t/1000 +1; if (timeout < t) timeout = t; /* ISO out */ t = 5 * EGT + (1 + 259) * WWT; - t = t/1000 +1; if (timeout < t) timeout = t; @@ -1774,7 +2097,7 @@ static unsigned int T1_card_timeout(double f, double d, int TC1, /* may happen with non ISO cards */ if ((0 == f) || (0 == d) || (0 == clock_frequency)) - return 60; /* 60 seconds */ + return 60 * 1000; /* 60 seconds */ /* see ch. 6.5.2 Transmission factors F and D, page 12 of ISO 7816-3 */ etu = f / d / clock_frequency; @@ -1793,11 +2116,46 @@ static unsigned int T1_card_timeout(double f, double d, int TC1, timeout = 260*EGT + BWT + 260*CWT; - /* Convert from milliseonds to seconds rounded to the upper value - * we use +1 instead of ceil() to round up to the nearest greater integer - * so we can avoid a dependency on the math library */ - timeout = timeout/1000 +1; + /* This is the card/reader timeout. Add 1 second for the libusb + * timeout so we get the error from the reader. */ + timeout += 1000; return timeout; } /* T1_card_timeout */ + +static int get_IFSC(ATR_t *atr, int *idx) +{ + int i, ifsc, protocol = -1; + + /* default return values */ + ifsc = -1; + *idx = -1; + + for (i=0; i2) present and protocol=1 => IFSC */ + if (i >= 2 && protocol == 1 + && atr->ib[i][ATR_INTERFACE_BYTE_TA].present) + { + ifsc = atr->ib[i][ATR_INTERFACE_BYTE_TA].value; + *idx = i+1; + /* only the first TAi (i>2) must be used */ + break; + } + + /* protocol T=? */ + if (atr->ib[i][ATR_INTERFACE_BYTE_TD].present) + protocol = atr->ib[i][ATR_INTERFACE_BYTE_TD].value & 0x0F; + } + + if (ifsc > 254) + { + /* 0xFF is not a valid value for IFSC */ + DEBUG_INFO2("Non ISO IFSC: 0x%X", ifsc); + ifsc = 254; + } + + return ifsc; +} /* get_IFSC */ + diff --git a/ccid/ccid/src/misc.h b/ccid/ccid/src/misc.h index bd5039a..0f3e642 100644 --- a/ccid/ccid/src/misc.h +++ b/ccid/ccid/src/misc.h @@ -3,20 +3,15 @@ * * MUSCLE SmartCard Development ( http://www.linuxnet.com ) * - * Copyright (C) 2005 + * Copyright (C) 2005-2010 * Ludovic Rousseau * - * $Id: misc.h 2481 2007-03-15 08:23:07Z rousseau $ + * $Id: misc.h 6758 2013-10-01 12:55:58Z rousseau $ */ #ifndef __misc_h__ #define __misc_h__ -#ifdef __cplusplus -extern "C" -{ -#endif - /* * Declare the function as internal to the library: the function name is * not exported and can't be used by a program linked to the library @@ -24,9 +19,13 @@ extern "C" * see http://gcc.gnu.org/onlinedocs/gcc-3.3.5/gcc/Function-Attributes.html#Function-Attributes * see http://www.nedprod.com/programs/gccvisibility.html */ -#if defined __GNUC__ && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) +#if defined __GNUC__ && (! defined (__sun)) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) #define INTERNAL __attribute__ ((visibility("hidden"))) #define PCSC_API __attribute__ ((visibility("default"))) +#elif (! defined __GNUC__ ) && defined (__sun) +/* http://wikis.sun.com/display/SunStudio/Macros+for+Shared+Library+Symbol+Visibility */ +#define INTERNAL __hidden +#define PCSC_API __global #else #define INTERNAL #define PCSC_API @@ -56,8 +55,8 @@ extern "C" #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif -#ifdef __cplusplus -} +#ifndef COUNT_OF +#define COUNT_OF(arr) (sizeof(arr)/sizeof(arr[0])) #endif #endif /* __misc_h__ */ diff --git a/ccid/ccid/src/openct/proto-t1.c b/ccid/ccid/src/openct/proto-t1.c index 17ad38d..54beaf0 100644 --- a/ccid/ccid/src/openct/proto-t1.c +++ b/ccid/ccid/src/openct/proto-t1.c @@ -115,6 +115,7 @@ int t1_init(t1_state_t * t1, int lun) */ void t1_release(/*@unused@*/ t1_state_t * t1) { + (void)t1; /* NOP */ } @@ -157,7 +158,7 @@ int t1_transceive(t1_state_t * t1, unsigned int dad, { ct_buf_t sbuf, rbuf, tbuf; unsigned char sdata[T1_BUFFER_SIZE], sblk[5]; - unsigned int slen, retries, resyncs, sent_length = 0; + unsigned int slen, retries, resyncs; size_t last_send = 0; if (snd_len == 0) @@ -290,6 +291,10 @@ int t1_transceive(t1_state_t * t1, unsigned int dad, DEBUG_COMM4("received: %d, expected: %d, more: %d", t1_seq(pcb), t1->ns, t1->more); + /* ISO 7816-3 Rule 7.4.2 */ + if (retries == 0) + goto resync; + /* ISO 7816-3 Rule 7.2 */ if (T1_R_BLOCK == t1_block_type(t1->previous_block[PCB])) { @@ -299,9 +304,6 @@ int t1_transceive(t1_state_t * t1, unsigned int dad, } DEBUG_COMM("R-Block required"); - /* ISO 7816-3 Rule 7.4.2 */ - if (retries == 0) - goto resync; slen = t1_build(t1, sdata, dad, T1_R_BLOCK | T1_OTHER_ERROR, NULL, NULL); @@ -329,7 +331,6 @@ int t1_transceive(t1_state_t * t1, unsigned int dad, * block successfully */ if (t1_seq(pcb) != t1->ns) { ct_buf_get(&sbuf, NULL, last_send); - sent_length += last_send; last_send = 0; t1->ns ^= 1; } @@ -360,6 +361,11 @@ int t1_transceive(t1_state_t * t1, unsigned int dad, * an R block */ if (t1_seq(pcb) != t1->nr) { DEBUG_COMM("wrong nr"); + + /* ISO 7816-3 Rule 7.4.2 */ + if (retries == 0) + goto resync; + slen = t1_build(t1, sdata, dad, T1_R_BLOCK | T1_OTHER_ERROR, NULL, NULL); @@ -386,7 +392,6 @@ int t1_transceive(t1_state_t * t1, unsigned int dad, DEBUG_COMM("S-Block answer received"); /* ISO 7816-3 Rule 6.3 */ t1->state = SENDING; - sent_length = 0; last_send = 0; resyncs = 3; retries = t1->retries; @@ -640,7 +645,7 @@ static int t1_verify_checksum(t1_state_t * t1, unsigned char *rbuf, static int t1_xcv(t1_state_t * t1, unsigned char *block, size_t slen, size_t rmax) { - int n, m; + int n; _ccid_descriptor *ccid_desc ; int oldReadTimeout; unsigned int rmax_int; @@ -664,14 +669,13 @@ static int t1_xcv(t1_state_t * t1, unsigned char *block, size_t slen, n = CCID_Transmit(t1 -> lun, slen, block, rmax, t1->wtx); if (n != IFD_SUCCESS) - return n; + return -1; /* the second argument of CCID_Receive() is (unsigned int *) * so we can't use &rmax since &rmax is a (size_t *) and may not * be the same on 64-bits architectures for example (iMac G5) */ rmax_int = rmax; n = CCID_Receive(t1 -> lun, &rmax_int, block, NULL); - rmax = rmax_int; if (n == IFD_PARITY_ERROR) return -2; @@ -682,7 +686,7 @@ static int t1_xcv(t1_state_t * t1, unsigned char *block, size_t slen, n = CCID_Transmit(t1 -> lun, 0, block, rmax, t1->wtx); if (n != IFD_SUCCESS) - return n; + return -1; rmax_int = rmax; n = CCID_Receive(t1 -> lun, &rmax_int, &block[3], NULL); @@ -699,7 +703,7 @@ static int t1_xcv(t1_state_t * t1, unsigned char *block, size_t slen, n = CCID_Transmit(t1 -> lun, slen, block, 0, t1->wtx); t1->wtx = 0; /* reset to default value */ if (n != IFD_SUCCESS) - return n; + return -1; /* Get the response en bloc */ rmax_int = rmax; @@ -715,6 +719,8 @@ static int t1_xcv(t1_state_t * t1, unsigned char *block, size_t slen, if (n >= 0) { + int m; + m = block[2] + 3 + t1->rc_bytes; if (m < n) n = m; @@ -771,7 +777,7 @@ int t1_negotiate_ifsd(t1_state_t * t1, unsigned int dad, int ifsd) || (sdata[DATA] != ifsd) /* Wrong ifsd received */ || (sdata[NAD] != swap_nibbles(dad)) /* wrong NAD */ || (!t1_verify_checksum(t1, sdata, n)) /* checksum failed */ - || (n != 4 + t1->rc_bytes) /* wrong frame length */ + || (n != 4 + (int)t1->rc_bytes) /* wrong frame length */ || (sdata[LEN] != 1) /* wrong data length */ || (sdata[PCB] != (T1_S_BLOCK | T1_S_RESPONSE | T1_S_IFS))) /* wrong PCB */ continue; diff --git a/ccid/ccid/src/parse.c b/ccid/ccid/src/parse.c index c1051ab..bd65ce4 100644 --- a/ccid/ccid/src/parse.c +++ b/ccid/ccid/src/parse.c @@ -1,6 +1,6 @@ /* parse.c: parse CCID structure - Copyright (C) 2003-2004 Ludovic Rousseau + Copyright (C) 2003-2010 Ludovic Rousseau This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ */ /* - * $Id: parse.c 3408 2009-04-02 07:27:13Z rousseau $ + * $Id: parse.c 6633 2013-05-22 14:11:37Z rousseau $ */ #include @@ -26,12 +26,15 @@ # ifdef S_SPLINT_S # include # endif -#include #include #include "defs.h" #include "ccid.h" +/* define DISPLAY_EXTRA_VALUES to display the extra (invalid) values + * returned by bNumClockSupported and bNumDataRatesSupported */ +#undef DISPLAY_EXTRA_VALUES + #ifndef TRUE #define TRUE 1 #define FALSE 0 @@ -44,8 +47,15 @@ #define MAGENTA "\33[35m" #define NORMAL "\33[0m" -static int ccid_parse_interface_descriptor(usb_dev_handle *handle, - struct usb_device *dev, int num); +/* global variables used in ccid_usb.c but defined in ifdhandler.c */ +int LogLevel = 1+2+4+8; /* full debug */ +int DriverOptions = 0; + +static int ccid_parse_interface_descriptor(libusb_device_handle *handle, + struct libusb_device_descriptor desc, + struct libusb_config_descriptor *config_desc, + int num, + const struct libusb_interface *usb_interface); /***************************************************************************** @@ -55,136 +65,177 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, ****************************************************************************/ int main(int argc, char *argv[]) { - static struct usb_bus *busses = NULL; - struct usb_bus *bus; - struct usb_dev_handle *dev_handle; - int nb = 0; - char buffer[256]; + libusb_device **devs, *dev; + int nb = 0, r, i; + unsigned char buffer[256]; char class_ff = FALSE; + ssize_t cnt; if ((argc > 1) && (0 == strcmp(argv[1], "-p"))) class_ff = TRUE; - usb_init(); - (void)usb_find_busses(); - (void)usb_find_devices(); + r = libusb_init(NULL); + if (r < 0) + { + (void)printf("libusb_init() failed\n"); + return r; + } - busses = usb_get_busses(); - if (busses == NULL) + cnt = libusb_get_device_list(NULL, &devs); + if (cnt < 0) { - (void)printf("No USB buses found\n"); - return -1; + (void)printf("libusb_get_device_list() failed\n"); + return (int)cnt; } - /* on any USB buses */ - for (bus = busses; bus; bus = bus->next) + /* for every device */ + i = 0; + while ((dev = devs[i++]) != NULL) { - struct usb_device *dev; + struct libusb_device_descriptor desc; + struct libusb_config_descriptor *config_desc; + struct libusb_device_handle *handle; + const struct libusb_interface *usb_interface = NULL; +#ifndef __APPLE__ + int interface; +#endif + int num = 0; - /* any device on this bus */ - for (dev = bus->devices; dev; dev = dev->next) + r = libusb_open(dev, &handle); + if (r < 0) { - struct usb_interface *usb_interface = NULL; - int interface; - int num = 0; - - dev_handle = usb_open(dev); - if (NULL == dev_handle) + (void)fprintf(stderr, "Can't libusb_open(): %s\n", strerror(errno)); + if (getuid()) { - (void)fprintf(stderr, "Can't usb_open(%s/%s): %s\n", - bus->dirname, dev->filename, strerror(errno)); - if (getuid()) - { - (void)fprintf(stderr, BRIGHT_RED "Please, restart the command as root\n" NORMAL); - return 1; - } - continue; + (void)fprintf(stderr, + BRIGHT_RED "Please, restart the command as root\n" NORMAL); + return 1; } + continue; + } - (void)fprintf(stderr, "Parsing USB bus/device: %s/%s\n", - bus->dirname, dev->filename); - - (void)fprintf(stderr, " idVendor: 0x%04X", dev->descriptor.idVendor); - if (usb_get_string_simple(dev_handle, dev->descriptor.iManufacturer, - buffer, sizeof(buffer)) < 0) + r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) + { + (void)fprintf(stderr, + BRIGHT_RED "failed to get device descriptor" NORMAL); + return 1; + } + + (void)fprintf(stderr, + "Parsing USB bus/device: %04X:%04X (bus %d, device %d)\n", + desc.idVendor, desc.idProduct, + libusb_get_bus_number(dev), libusb_get_device_address(dev)); + + (void)fprintf(stderr, " idVendor: 0x%04X", desc.idVendor); + r = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, + buffer, sizeof(buffer)); + if (r < 0) + { + (void)fprintf(stderr, " Can't get iManufacturer string\n"); + if (getuid()) { - (void)fprintf(stderr, " Can't get iManufacturer string\n"); - if (getuid()) - { - (void)fprintf(stderr, BRIGHT_RED "Please, restart the command as root\n" NORMAL); - return 1; - } + (void)fprintf(stderr, + BRIGHT_RED "Please, restart the command as root\n" NORMAL); + return 1; } - else - (void)fprintf(stderr, " iManufacturer: " BLUE "%s\n" NORMAL, buffer); + } + else + (void)fprintf(stderr, + " iManufacturer: " BLUE "%s\n" NORMAL, buffer); - (void)fprintf(stderr, " idProduct: 0x%04X", dev->descriptor.idProduct); - if (usb_get_string_simple(dev_handle, dev->descriptor.iProduct, - buffer, sizeof(buffer)) < 0) - (void)fprintf(stderr, " Can't get iProduct string\n"); - else - (void)fprintf(stderr, " iProduct: " BLUE "%s\n" NORMAL, buffer); + (void)fprintf(stderr, " idProduct: 0x%04X", desc.idProduct); + r = libusb_get_string_descriptor_ascii(handle, desc.iProduct, + buffer, sizeof(buffer)); + if (r < 0) + (void)fprintf(stderr, " Can't get iProduct string\n"); + else + (void)fprintf(stderr, " iProduct: " BLUE "%s\n" NORMAL, buffer); again: - /* check if the device has bInterfaceClass == 11 */ - usb_interface = get_ccid_usb_interface(dev, &num); - if (NULL == usb_interface) - { - (void)usb_close(dev_handle); - /* only if we found no CCID interface */ - if (0 == num) - (void)fprintf(stderr, RED " NOT a CCID/ICCD device\n" NORMAL); - continue; - } - if (!class_ff && (0xFF == usb_interface->altsetting->bInterfaceClass)) - { - (void)fprintf(stderr, MAGENTA " Found a possibly CCID/ICCD device (bInterfaceClass = 0xFF). Use -p\n" NORMAL); - continue; - } - (void)fprintf(stderr, GREEN " Found a CCID/ICCD device at interface %d\n" NORMAL, num); + /* check if the device has bInterfaceClass == 11 */ + r = libusb_get_active_config_descriptor(dev, &config_desc); + if (r < 0) + { + (void)fprintf(stderr, " Can't get config descriptor: %d\n", r); + (void)libusb_close(handle); + continue; + } - /* now we found a free reader and we try to use it */ - if (NULL == dev->config) - { - (void)usb_close(dev_handle); - (void)fprintf(stderr, "No dev->config found for %s/%s\n", - bus->dirname, dev->filename); - continue; - } + usb_interface = get_ccid_usb_interface(config_desc, &num); + if (NULL == usb_interface) + { + (void)libusb_close(handle); + /* only if we found no CCID interface */ + if (0 == num) + (void)fprintf(stderr, RED " NOT a CCID/ICCD device\n" NORMAL); + continue; + } + if (!class_ff && (0xFF == usb_interface->altsetting->bInterfaceClass)) + { + (void)libusb_close(handle); + (void)fprintf(stderr, MAGENTA " Found a possibly CCID/ICCD device (bInterfaceClass = 0xFF). Use %s -p\n" NORMAL, argv[0]); + continue; + } + (void)fprintf(stderr, + GREEN " Found a CCID/ICCD device at interface %d\n" NORMAL, num); + + /* now we found a free reader and we try to use it */ +#if 0 + if (NULL == dev->config) + { + (void)libusb_close(handle); + (void)fprintf(stderr, "No dev->config found for %s/%s\n", + bus->dirname, dev->filename); + continue; + } +#endif - interface = usb_interface->altsetting->bInterfaceNumber; #ifndef __APPLE__ - if (usb_claim_interface(dev_handle, interface) < 0) + interface = usb_interface->altsetting->bInterfaceNumber; + r = libusb_claim_interface(handle, interface); + if (r < 0) + { + (void)fprintf(stderr, + "Can't claim interface (bus %d, device %d): %s\n", + libusb_get_bus_number(dev), libusb_get_device_address(dev), + strerror(errno)); + (void)libusb_close(handle); + + if (EBUSY == errno) { - (void)usb_close(dev_handle); - (void)fprintf(stderr, "Can't claim interface %s/%s: %s\n", - bus->dirname, dev->filename, strerror(errno)); - if (EBUSY == errno) - { - (void)fprintf(stderr, - BRIGHT_RED " Please, stop pcscd and retry\n\n" NORMAL); + (void)fprintf(stderr, + BRIGHT_RED " Please, stop pcscd and retry\n\n" NORMAL); + + if (class_ff) + /* maybe the device with Class = 0xFF is NOT a CCID + * reader */ + continue; + else return TRUE; - } - continue; } + continue; + } #endif - (void)ccid_parse_interface_descriptor(dev_handle, dev, num); + (void)ccid_parse_interface_descriptor(handle, desc, config_desc, num, + usb_interface); + nb++; #ifndef __APPLE__ - (void)usb_release_interface(dev_handle, interface); + (void)libusb_release_interface(handle, interface); #endif - /* check for another CCID interface on the same device */ - num++; - goto again; - - (void)usb_close(dev_handle); - nb++; - } + /* check for another CCID interface on the same device */ + num++; + goto again; } if ((0 == nb) && (0 != geteuid())) - (void)fprintf(stderr, "Can't find any CCID device.\nMaybe you must run parse as root?\n"); + (void)fprintf(stderr, + "Can't find any CCID device.\nMaybe you must run parse as root?\n"); + + libusb_exit(NULL); + return 0; } /* main */ @@ -194,21 +245,24 @@ int main(int argc, char *argv[]) * Parse a CCID USB Descriptor * ****************************************************************************/ -static int ccid_parse_interface_descriptor(usb_dev_handle *handle, - struct usb_device *dev, int num) +static int ccid_parse_interface_descriptor(libusb_device_handle *handle, + struct libusb_device_descriptor desc, + struct libusb_config_descriptor *config_desc, + int num, + const struct libusb_interface *usb_interface) { - struct usb_interface_descriptor *usb_interface; - unsigned char *extra; - char buffer[256*sizeof(int)]; /* maximum is 256 records */ - /* unsigned version of buffer[] used for multi-bytes conversions */ - unsigned char *ubuffer = (unsigned char *)buffer; + const struct libusb_interface_descriptor *usb_interface_descriptor; + const unsigned char *device_descriptor; + unsigned char buffer[256*sizeof(int)]; /* maximum is 256 records */ + int r; /* * Vendor/model name */ - (void)printf(" idVendor: 0x%04X\n", dev->descriptor.idVendor); - if (usb_get_string_simple(handle, dev->descriptor.iManufacturer, - buffer, sizeof(buffer)) < 0) + (void)printf(" idVendor: 0x%04X\n", desc.idVendor); + r = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, + buffer, sizeof(buffer)); + if (r < 0) { (void)printf(" Can't get iManufacturer string\n"); if (getuid()) @@ -221,28 +275,29 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, else (void)printf(" iManufacturer: %s\n", buffer); - (void)printf(" idProduct: 0x%04X\n", dev->descriptor.idProduct); - if (usb_get_string_simple(handle, dev->descriptor.iProduct, - buffer, sizeof(buffer)) < 0) + (void)printf(" idProduct: 0x%04X\n", desc.idProduct); + r = libusb_get_string_descriptor_ascii(handle, desc.iProduct, + buffer, sizeof(buffer)); + if (r < 0) (void)printf(" Can't get iProduct string\n"); else (void)printf(" iProduct: %s\n", buffer); (void)printf(" bcdDevice: %X.%02X (firmware release?)\n", - dev->descriptor.bcdDevice >> 8, dev->descriptor.bcdDevice & 0xFF); + desc.bcdDevice >> 8, desc.bcdDevice & 0xFF); - usb_interface = get_ccid_usb_interface(dev, &num)->altsetting; + usb_interface_descriptor = get_ccid_usb_interface(config_desc, &num)->altsetting; - (void)printf(" bLength: %d\n", usb_interface->bLength); + (void)printf(" bLength: %d\n", usb_interface_descriptor->bLength); - (void)printf(" bDescriptorType: %d\n", usb_interface->bDescriptorType); + (void)printf(" bDescriptorType: %d\n", usb_interface_descriptor->bDescriptorType); - (void)printf(" bInterfaceNumber: %d\n", usb_interface->bInterfaceNumber); + (void)printf(" bInterfaceNumber: %d\n", usb_interface_descriptor->bInterfaceNumber); - (void)printf(" bAlternateSetting: %d\n", usb_interface->bAlternateSetting); + (void)printf(" bAlternateSetting: %d\n", usb_interface_descriptor->bAlternateSetting); - (void)printf(" bNumEndpoints: %d\n", usb_interface->bNumEndpoints); - switch (usb_interface->bNumEndpoints) + (void)printf(" bNumEndpoints: %d\n", usb_interface_descriptor->bNumEndpoints); + switch (usb_interface_descriptor->bNumEndpoints) { case 0: (void)printf(" Control only\n"); @@ -260,24 +315,26 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, (void)printf(" UNKNOWN value\n"); } - (void)printf(" bInterfaceClass: 0x%02X", usb_interface->bInterfaceClass); - if (usb_interface->bInterfaceClass == 0x0b) + (void)printf(" bInterfaceClass: 0x%02X", usb_interface_descriptor->bInterfaceClass); + if (usb_interface_descriptor->bInterfaceClass == 0x0b) (void)printf(" [Chip Card Interface Device Class (CCID)]\n"); else { (void)printf("\n NOT A CCID DEVICE\n"); - if (usb_interface->bInterfaceClass != 0xFF) + if (usb_interface_descriptor->bInterfaceClass != 0xFF) return TRUE; else (void)printf(" Class is 0xFF (proprietary)\n"); } - (void)printf(" bInterfaceSubClass: %d\n", usb_interface->bInterfaceSubClass); - if (usb_interface->bInterfaceSubClass) + (void)printf(" bInterfaceSubClass: %d\n", + usb_interface_descriptor->bInterfaceSubClass); + if (usb_interface_descriptor->bInterfaceSubClass) (void)printf(" UNSUPPORTED SubClass\n"); - (void)printf(" bInterfaceProtocol: %d\n", usb_interface->bInterfaceProtocol); - switch (usb_interface->bInterfaceProtocol) + (void)printf(" bInterfaceProtocol: %d\n", + usb_interface_descriptor->bInterfaceProtocol); + switch (usb_interface_descriptor->bInterfaceProtocol) { case 0: (void)printf(" bulk transfer, optional interrupt-IN (CCID)\n"); @@ -292,15 +349,16 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, (void)printf(" UNSUPPORTED InterfaceProtocol\n"); } - if (usb_get_string_simple(handle, usb_interface->iInterface, - buffer, sizeof(buffer)) < 0) + r = libusb_get_string_descriptor_ascii(handle, usb_interface_descriptor->iInterface, + buffer, sizeof(buffer)); + if (r < 0) (void)printf(" Can't get iInterface string\n"); else (void)printf(" iInterface: %s\n", buffer); - if (usb_interface->extralen < 54) + device_descriptor = get_ccid_device_descriptor(usb_interface); + if (NULL == device_descriptor) { - (void)printf("USB extra length is too short: %d\n", usb_interface->extralen); (void)printf("\n NOT A CCID DEVICE\n"); return TRUE; } @@ -309,19 +367,18 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, * CCID Class Descriptor */ (void)printf(" CCID Class Descriptor\n"); - extra = usb_interface->extra; - (void)printf(" bLength: 0x%02X\n", extra[0]); - if (extra[0] != 0x36) + (void)printf(" bLength: 0x%02X\n", device_descriptor[0]); + if (device_descriptor[0] != 0x36) { (void)printf(" UNSUPPORTED bLength\n"); return TRUE; } - (void)printf(" bDescriptorType: 0x%02X\n", extra[1]); - if (extra[1] != 0x21) + (void)printf(" bDescriptorType: 0x%02X\n", device_descriptor[1]); + if (device_descriptor[1] != 0x21) { - if (0xFF == extra[1]) + if (0xFF == device_descriptor[1]) (void)printf(" PROPRIETARY bDescriptorType\n"); else { @@ -330,36 +387,36 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, } } - (void)printf(" bcdCCID: %X.%02X\n", extra[3], extra[2]); - (void)printf(" bMaxSlotIndex: 0x%02X\n", extra[4]); - (void)printf(" bVoltageSupport: 0x%02X\n", extra[5]); - if (extra[5] & 0x01) + (void)printf(" bcdCCID: %X.%02X\n", device_descriptor[3], device_descriptor[2]); + (void)printf(" bMaxSlotIndex: 0x%02X\n", device_descriptor[4]); + (void)printf(" bVoltageSupport: 0x%02X\n", device_descriptor[5]); + if (device_descriptor[5] & 0x01) (void)printf(" 5.0V\n"); - if (extra[5] & 0x02) + if (device_descriptor[5] & 0x02) (void)printf(" 3.0V\n"); - if (extra[5] & 0x04) + if (device_descriptor[5] & 0x04) (void)printf(" 1.8V\n"); - (void)printf(" dwProtocols: 0x%02X%02X 0x%02X%02X\n", extra[9], extra[8], - extra[7], extra[6]); - if (extra[6] & 0x01) + (void)printf(" dwProtocols: 0x%02X%02X 0x%02X%02X\n", device_descriptor[9], device_descriptor[8], + device_descriptor[7], device_descriptor[6]); + if (device_descriptor[6] & 0x01) (void)printf(" T=0\n"); - if (extra[6] & 0x02) + if (device_descriptor[6] & 0x02) (void)printf(" T=1\n"); - (void)printf(" dwDefaultClock: %.3f MHz\n", dw2i(extra, 10)/1000.0); - (void)printf(" dwMaximumClock: %.3f MHz\n", dw2i(extra, 14)/1000.0); - (void)printf(" bNumClockSupported: %d %s\n", extra[18], - extra[18] ? "" : "(will use whatever is returned)"); + (void)printf(" dwDefaultClock: %.3f MHz\n", dw2i(device_descriptor, 10)/1000.0); + (void)printf(" dwMaximumClock: %.3f MHz\n", dw2i(device_descriptor, 14)/1000.0); + (void)printf(" bNumClockSupported: %d%s\n", device_descriptor[18], + device_descriptor[18] ? "" : " (will use whatever is returned)"); { int n; /* See CCID 3.7.2 page 25 */ - n = usb_control_msg(handle, + n = libusb_control_transfer(handle, 0xA1, /* request type */ 0x02, /* GET CLOCK FREQUENCIES */ 0x00, /* value */ - usb_interface->bInterfaceNumber, /* interface */ + usb_interface_descriptor->bInterfaceNumber, /* interface */ buffer, sizeof(buffer), 2 * 1000); @@ -376,40 +433,42 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, } } else - if (n % 4) /* not a multiple of 4 */ + if (n % 4) /* not a multiple of 4 */ (void)printf(" wrong size for GET CLOCK FREQUENCIES: %d\n", n); else { int i; /* we do not get the expected number of data rates */ - if ((n != extra[18]*4) && extra[18]) + if ((n != device_descriptor[18]*4) && device_descriptor[18]) { (void)printf(" Got %d clock frequencies but was expecting %d\n", - n/4, extra[18]); + n/4, device_descriptor[18]); /* we got more data than expected */ - if (n > extra[18]*4) - n = extra[18]*4; +#ifndef DISPLAY_EXTRA_VALUES + if (n > device_descriptor[18]*4) + n = device_descriptor[18]*4; +#endif } for (i=0; ibInterfaceNumber, /* interface */ + usb_interface_descriptor->bInterfaceNumber, /* interface */ buffer, sizeof(buffer), 2 * 1000); @@ -419,74 +478,76 @@ static int ccid_parse_interface_descriptor(usb_dev_handle *handle, (void)printf(" IFD does not support GET_DATA_RATES request: %s\n", strerror(errno)); else - if (n % 4) /* not a multiple of 4 */ + if (n % 4) /* not a multiple of 4 */ (void)printf(" wrong size for GET_DATA_RATES: %d\n", n); else { int i; /* we do not get the expected number of data rates */ - if ((n != extra[27]*4) && extra[27]) + if ((n != device_descriptor[27]*4) && device_descriptor[27]) { (void)printf(" Got %d data rates but was expecting %d\n", n/4, - extra[27]); + device_descriptor[27]); /* we got more data than expected */ - if (n > extra[27]*4) - n = extra[27]*4; +#ifndef DISPLAY_EXTRA_VALUES + if (n > device_descriptor[27]*4) + n = device_descriptor[27]*4; +#endif } for (i=0; i + * Copyright (C) 2003-2009 * Ludovic Rousseau * - * $Id: parser.h 4248 2009-06-05 08:41:19Z rousseau $ + * $Id: parser.h 5434 2010-12-08 14:13:21Z rousseau $ */ /** @@ -16,25 +17,16 @@ #ifndef __parser_h__ #define __parser_h__ -#ifdef __cplusplus -extern "C" -{ -#endif - -#define TOKEN_MAX_KEY_SIZE 200 -#define TOKEN_MAX_VALUE_SIZE 200 - -#define TOKEN_TYPE_KEY 1 -#define TOKEN_TYPE_STRING 2 +#include "simclist.h" -int LTPBundleFindValueWithKey(const char *fileName, const char *tokenKey, - /*@out@*/ char *tokenValue, int tokenIndice); - -int LTPBundleFindOptionalValueWithKey(const char *fileName, - const char *tokenKey, /*@out@*/ char *tokenValue, int tokenIndice); +struct bundleElt +{ + char *key; + list_t values; +}; -#ifdef __cplusplus -} -#endif +int LTPBundleFindValueWithKey(list_t *l, const char *key, list_t **values); +int bundleParse(const char *fileName, list_t *l); +void bundleRelease(list_t *l); #endif diff --git a/ccid/ccid/src/pcscd_ccid.rules b/ccid/ccid/src/pcscd_ccid.rules deleted file mode 100644 index 9387307..0000000 --- a/ccid/ccid/src/pcscd_ccid.rules +++ /dev/null @@ -1,38 +0,0 @@ -# udev rules for pcscd and CCID readers - -# Gemplus PCMCIA Card -#SUBSYSTEMS=="pcmcia", DRIVERS=="serial_cs", ACTION=="add", ATTRS{prod_id1}=="Gemplus", ATTRS{prod_id2}=="SerialPort", ATTRS{prod_id3}=="GemPC Card", RUN+="/usr/sbin/pcscd --hotplug" - -# If not adding the device, go away -ACTION!="add", GOTO="pcscd_ccid_rules_end" - -# Kobil mIDentity -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0d46", ATTRS{idProduct}=="4081", RUN+="/usr/sbin/Kobil_mIDentity_switch" - -# generic CCID device -SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="0b", RUN+="/usr/sbin/pcscd --hotplug" - -# non CCID generic (InterfaceClass: 0xFF) -# CherrySmartTerminalST2XXX.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="046a", ATTRS{idProduct}=="003e", RUN+="/usr/sbin/pcscd --hotplug" -# DellSK-3106.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2100", RUN+="/usr/sbin/pcscd --hotplug" -# MySmartPad.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="09be", ATTRS{idProduct}=="0002", RUN+="/usr/sbin/pcscd --hotplug" -# SCR331-DI-NTTCom.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e6", ATTRS{idProduct}=="5120", RUN+="/usr/sbin/pcscd --hotplug" -# SCR331-DI.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e6", ATTRS{idProduct}=="5111", RUN+="/usr/sbin/pcscd --hotplug" -# SDI010.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e6", ATTRS{idProduct}=="5121", RUN+="/usr/sbin/pcscd --hotplug" -# SPR532.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e6", ATTRS{idProduct}=="e003", RUN+="/usr/sbin/pcscd --hotplug" -# Verisign_secure_storage_token.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="08e6", ATTRS{idProduct}=="1359", RUN+="/usr/sbin/pcscd --hotplug" -# Verisign_secure_token.txt -SUBSYSTEMS=="usb", ATTRS{idVendor}=="08e6", ATTRS{idProduct}=="ace0", RUN+="/usr/sbin/pcscd --hotplug" -# SchlumbergerSema Cyberflex Access e-gate -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0973", ATTRS{idProduct}=="0003", RUN+="/usr/sbin/pcscd --hotplug" - -# All done -LABEL="pcscd_ccid_rules_end" diff --git a/ccid/ccid/src/reader.conf.in b/ccid/ccid/src/reader.conf.in index 97f99d4..27b2ef7 100644 --- a/ccid/ccid/src/reader.conf.in +++ b/ccid/ccid/src/reader.conf.in @@ -1,4 +1,4 @@ -# Gemplus reader with serial communication +# Gemalto reader with serial communication # - n is the serial port to use n in [0..3] # - reader is the reader name. It is needed for multi-slot readers. # Possible reader values are: GemPCPinPad, GemCorePOSPro, GemCoreSIMPro, diff --git a/ccid/ccid/src/simclist.c b/ccid/ccid/src/simclist.c new file mode 100644 index 0000000..c8d36f5 --- /dev/null +++ b/ccid/ccid/src/simclist.c @@ -0,0 +1,1525 @@ +/* + * Copyright (c) 2007,2008,2009,2010,2011 Mij + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +/* + * SimCList library. See http://mij.oltrelinux.com/devel/simclist + */ + +/* SimCList implementation, version 1.6 */ + +#include +#include +#include /* for setting errno */ +#include +#ifndef _WIN32 + /* not in Windows! */ +# include +# include +#endif +#ifndef SIMCLIST_NO_DUMPRESTORE + /* includes for dump/restore */ +# include +# include /* for READ_ERRCHECK() and write() */ +# include /* for open() etc */ +# ifndef _WIN32 +# include /* for htons() on UNIX */ +# else +# include /* for htons() on Windows */ +# endif +#endif + +/* disable asserts */ +#ifndef SIMCLIST_DEBUG +#define NDEBUG +#endif + +#include + + +#include /* for open()'s access modes S_IRUSR etc */ +#include + +#if defined(_MSC_VER) || defined(__MINGW32__) +/* provide gettimeofday() missing in Windows */ +int gettimeofday(struct timeval *tp, void *tzp) { + DWORD t; + + /* XSI says: "If tzp is not a null pointer, the behavior is unspecified" */ + assert(tzp == NULL); + + t = timeGetTime(); + tp->tv_sec = t / 1000; + tp->tv_usec = t % 1000; + return 0; +} +#endif + + +/* work around lack of inttypes.h support in broken Microsoft Visual Studio compilers */ +#if !defined(_WIN32) || !defined(_MSC_VER) +# include /* (u)int*_t */ +#else +# include +typedef UINT8 uint8_t; +typedef UINT16 uint16_t; +typedef ULONG32 uint32_t; +typedef UINT64 uint64_t; +typedef INT8 int8_t; +typedef INT16 int16_t; +typedef LONG32 int32_t; +typedef INT64 int64_t; +#endif + + +/* define some commodity macros for Dump/Restore functionality */ +#ifndef SIMCLIST_NO_DUMPRESTORE +/* write() decorated with error checking logic */ +#define WRITE_ERRCHECK(fd, msgbuf, msglen) do { \ + if (write(fd, msgbuf, msglen) < 0) return -1; \ + } while (0); +/* READ_ERRCHECK() decorated with error checking logic */ +#define READ_ERRCHECK(fd, msgbuf, msglen) do { \ + if (read(fd, msgbuf, msglen) != msglen) { \ + /*errno = EPROTO;*/ \ + return -1; \ + } \ + } while (0); + +/* convert 64bit integers from host to network format */ +#define hton64(x) (\ + htons(1) == 1 ? \ + (uint64_t)x /* big endian */ \ + : /* little endian */ \ + ((uint64_t)((((uint64_t)(x) & 0xff00000000000000ULL) >> 56) | \ + (((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \ + (((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \ + (((uint64_t)(x) & 0x000000ff00000000ULL) >> 8) | \ + (((uint64_t)(x) & 0x00000000ff000000ULL) << 8) | \ + (((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \ + (((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \ + (((uint64_t)(x) & 0x00000000000000ffULL) << 56))) \ + ) + +/* convert 64bit integers from network to host format */ +#define ntoh64(x) (hton64(x)) +#endif + +/* some OSes don't have EPROTO (eg OpenBSD) */ +#ifndef EPROTO +#define EPROTO EIO +#endif + +#ifdef SIMCLIST_WITH_THREADS +/* limit (approx) to the number of threads running + * for threaded operations. Only meant when + * SIMCLIST_WITH_THREADS is defined */ +#define SIMCLIST_MAXTHREADS 2 +#endif + +/* + * how many elems to keep as spare. During a deletion, an element + * can be saved in a "free-list", not free()d immediately. When + * latter insertions are performed, spare elems can be used instead + * of malloc()ing new elems. + * + * about this param, some values for appending + * 10 million elems into an empty list: + * (#, time[sec], gain[%], gain/no[%]) + * 0 2,164 0,00 0,00 <-- feature disabled + * 1 1,815 34,9 34,9 + * 2 1,446 71,8 35,9 <-- MAX gain/no + * 3 1,347 81,7 27,23 + * 5 1,213 95,1 19,02 + * 8 1,064 110,0 13,75 + * 10 1,015 114,9 11,49 <-- MAX gain w/ likely sol + * 15 1,019 114,5 7,63 + * 25 0,985 117,9 4,72 + * 50 1,088 107,6 2,15 + * 75 1,016 114,8 1,53 + * 100 0,988 117,6 1,18 + * 150 1,022 114,2 0,76 + * 200 0,939 122,5 0,61 <-- MIN time + */ +#ifndef SIMCLIST_MAX_SPARE_ELEMS +#define SIMCLIST_MAX_SPARE_ELEMS 5 +#endif + + +#ifdef SIMCLIST_WITH_THREADS +#include +#endif + +#include "simclist.h" + + +/* minumum number of elements for sorting with quicksort instead of insertion */ +#define SIMCLIST_MINQUICKSORTELS 24 + + +/* list dump declarations */ +#define SIMCLIST_DUMPFORMAT_VERSION 1 /* (short integer) version of fileformat managed by _dump* and _restore* functions */ + +#define SIMCLIST_DUMPFORMAT_HEADERLEN 30 /* length of the header */ + +/* header for a list dump */ +struct list_dump_header_s { + uint16_t ver; /* version */ + int32_t timestamp_sec; /* dump timestamp, seconds since UNIX Epoch */ + int32_t timestamp_usec; /* dump timestamp, microseconds since timestamp_sec */ + int32_t rndterm; /* random value terminator -- terminates the data sequence */ + + uint32_t totlistlen; /* sum of every element' size, bytes */ + uint32_t numels; /* number of elements */ + uint32_t elemlen; /* bytes length of an element, for constant-size lists, <= 0 otherwise */ + int32_t listhash; /* hash of the list at the time of dumping, or 0 if to be ignored */ +}; + + + +/* deletes tmp from list, with care wrt its position (head, tail, middle) */ +static int list_drop_elem(list_t *restrict l, struct list_entry_s *tmp, unsigned int pos); + +/* set default values for initialized lists */ +static int list_attributes_setdefaults(list_t *restrict l); + +#ifndef NDEBUG +/* check whether the list internal REPresentation is valid -- Costs O(n) */ +static int list_repOk(const list_t *restrict l); + +/* check whether the list attribute set is valid -- Costs O(1) */ +static int list_attrOk(const list_t *restrict l); +#endif + +/* do not inline, this is recursive */ +static void list_sort_quicksort(list_t *restrict l, int versus, + unsigned int first, struct list_entry_s *fel, + unsigned int last, struct list_entry_s *lel); + +static inline void list_sort_selectionsort(list_t *restrict l, int versus, + unsigned int first, struct list_entry_s *fel, + unsigned int last, struct list_entry_s *lel); + +static void *list_get_minmax(const list_t *restrict l, int versus); + +static inline struct list_entry_s *list_findpos(const list_t *restrict l, int posstart); + +/* + * Random Number Generator + * + * The user is expected to seed the RNG (ie call srand()) if + * SIMCLIST_SYSTEM_RNG is defined. + * + * Otherwise, a self-contained RNG based on LCG is used; see + * http://en.wikipedia.org/wiki/Linear_congruential_generator . + * + * Facts pro local RNG: + * 1. no need for the user to call srand() on his own + * 2. very fast, possibly faster than OS + * 3. avoid interference with user's RNG + * + * Facts pro system RNG: + * 1. may be more accurate (irrelevant for SimCList randno purposes) + * 2. why reinvent the wheel + * + * Default to local RNG for user's ease of use. + */ + +#ifdef SIMCLIST_SYSTEM_RNG +/* keep track whether we initialized already (non-0) or not (0) */ +static unsigned random_seed = 0; + +/* use local RNG */ +static inline void seed_random(void) { + if (random_seed == 0) + random_seed = (unsigned)getpid() ^ (unsigned)time(NULL); +} + +static inline long get_random(void) { + random_seed = (1664525 * random_seed + 1013904223); + return random_seed; +} + +#else +/* use OS's random generator */ +# define seed_random() +# define get_random() (rand()) +#endif + + +/* list initialization */ +int list_init(list_t *restrict l) { + if (l == NULL) return -1; + + seed_random(); + + l->numels = 0; + + /* head/tail sentinels and mid pointer */ + l->head_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); + l->tail_sentinel = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); + l->head_sentinel->next = l->tail_sentinel; + l->tail_sentinel->prev = l->head_sentinel; + l->head_sentinel->prev = l->tail_sentinel->next = l->mid = NULL; + l->head_sentinel->data = l->tail_sentinel->data = NULL; + + /* iteration attributes */ + l->iter_active = 0; + l->iter_pos = 0; + l->iter_curentry = NULL; + + /* free-list attributes */ + l->spareels = (struct list_entry_s **)malloc(SIMCLIST_MAX_SPARE_ELEMS * sizeof(struct list_entry_s *)); + l->spareelsnum = 0; + +#ifdef SIMCLIST_WITH_THREADS + l->threadcount = 0; +#endif + + list_attributes_setdefaults(l); + + assert(list_repOk(l)); + assert(list_attrOk(l)); + + return 0; +} + +void list_destroy(list_t *restrict l) { + unsigned int i; + + list_clear(l); + for (i = 0; i < l->spareelsnum; i++) { + free(l->spareels[i]); + } + free(l->spareels); + free(l->head_sentinel); + free(l->tail_sentinel); +} + +int list_attributes_setdefaults(list_t *restrict l) { + l->attrs.comparator = NULL; + l->attrs.seeker = NULL; + + /* also free() element data when removing and element from the list */ + l->attrs.meter = NULL; + l->attrs.copy_data = 0; + + l->attrs.hasher = NULL; + + /* serializer/unserializer */ + l->attrs.serializer = NULL; + l->attrs.unserializer = NULL; + + assert(list_attrOk(l)); + + return 0; +} + +/* setting list properties */ +int list_attributes_comparator(list_t *restrict l, element_comparator comparator_fun) { + if (l == NULL) return -1; + + l->attrs.comparator = comparator_fun; + + assert(list_attrOk(l)); + + return 0; +} + +int list_attributes_seeker(list_t *restrict l, element_seeker seeker_fun) { + if (l == NULL) return -1; + + l->attrs.seeker = seeker_fun; + assert(list_attrOk(l)); + + return 0; +} + +int list_attributes_copy(list_t *restrict l, element_meter metric_fun, int copy_data) { + if (l == NULL || (metric_fun == NULL && copy_data != 0)) return -1; + + l->attrs.meter = metric_fun; + l->attrs.copy_data = copy_data; + + assert(list_attrOk(l)); + + return 0; +} + +int list_attributes_hash_computer(list_t *restrict l, element_hash_computer hash_computer_fun) { + if (l == NULL) return -1; + + l->attrs.hasher = hash_computer_fun; + assert(list_attrOk(l)); + return 0; +} + +int list_attributes_serializer(list_t *restrict l, element_serializer serializer_fun) { + if (l == NULL) return -1; + + l->attrs.serializer = serializer_fun; + assert(list_attrOk(l)); + return 0; +} + +int list_attributes_unserializer(list_t *restrict l, element_unserializer unserializer_fun) { + if (l == NULL) return -1; + + l->attrs.unserializer = unserializer_fun; + assert(list_attrOk(l)); + return 0; +} + +int list_append(list_t *restrict l, const void *data) { + return list_insert_at(l, data, l->numels); +} + +int list_prepend(list_t *restrict l, const void *data) { + return list_insert_at(l, data, 0); +} + +void *list_fetch(list_t *restrict l) { + return list_extract_at(l, 0); +} + +void *list_get_at(const list_t *restrict l, unsigned int pos) { + struct list_entry_s *tmp; + + tmp = list_findpos(l, pos); + + return (tmp != NULL ? tmp->data : NULL); +} + +void *list_get_max(const list_t *restrict l) { + return list_get_minmax(l, +1); +} + +void *list_get_min(const list_t *restrict l) { + return list_get_minmax(l, -1); +} + +/* REQUIRES {list->numels >= 1} + * return the min (versus < 0) or max value (v > 0) in l */ +static void *list_get_minmax(const list_t *restrict l, int versus) { + void *curminmax; + struct list_entry_s *s; + + if (l->attrs.comparator == NULL || l->numels == 0) + return NULL; + + curminmax = l->head_sentinel->next->data; + for (s = l->head_sentinel->next->next; s != l->tail_sentinel; s = s->next) { + if (l->attrs.comparator(curminmax, s->data) * versus > 0) + curminmax = s->data; + } + + return curminmax; +} + +/* set tmp to point to element at index posstart in l */ +static inline struct list_entry_s *list_findpos(const list_t *restrict l, int posstart) { + struct list_entry_s *ptr; + float x; + int i; + + /* accept 1 slot overflow for fetching head and tail sentinels */ + if (posstart < -1 || posstart > (int)l->numels) return NULL; + + x = (float)(posstart+1) / l->numels; + if (x <= 0.25) { + /* first quarter: get to posstart from head */ + for (i = -1, ptr = l->head_sentinel; i < posstart; ptr = ptr->next, i++); + } else if (x < 0.5) { + /* second quarter: get to posstart from mid */ + for (i = (l->numels-1)/2, ptr = l->mid; i > posstart; ptr = ptr->prev, i--); + } else if (x <= 0.75) { + /* third quarter: get to posstart from mid */ + for (i = (l->numels-1)/2, ptr = l->mid; i < posstart; ptr = ptr->next, i++); + } else { + /* fourth quarter: get to posstart from tail */ + for (i = l->numels, ptr = l->tail_sentinel; i > posstart; ptr = ptr->prev, i--); + } + + return ptr; +} + +void *list_extract_at(list_t *restrict l, unsigned int pos) { + struct list_entry_s *tmp; + void *data; + + if (l->iter_active || pos >= l->numels) return NULL; + + tmp = list_findpos(l, pos); + data = tmp->data; + + tmp->data = NULL; /* save data from list_drop_elem() free() */ + list_drop_elem(l, tmp, pos); + l->numels--; + + assert(list_repOk(l)); + + return data; +} + +int list_insert_at(list_t *restrict l, const void *data, unsigned int pos) { + struct list_entry_s *lent, *succ, *prec; + + if (l->iter_active || pos > l->numels) return -1; + + /* this code optimizes malloc() with a free-list */ + if (l->spareelsnum > 0) { + lent = l->spareels[l->spareelsnum-1]; + l->spareelsnum--; + } else { + lent = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); + if (lent == NULL) + return -1; + } + + if (l->attrs.copy_data) { + /* make room for user' data (has to be copied) */ + size_t datalen = l->attrs.meter(data); + lent->data = (struct list_entry_s *)malloc(datalen); + memcpy(lent->data, data, datalen); + } else { + lent->data = (void*)data; + } + + /* actually append element */ + prec = list_findpos(l, pos-1); + succ = prec->next; + + prec->next = lent; + lent->prev = prec; + lent->next = succ; + succ->prev = lent; + + l->numels++; + + /* fix mid pointer */ + if (l->numels == 1) { /* first element, set pointer */ + l->mid = lent; + } else if (l->numels % 2) { /* now odd */ + if (pos >= (l->numels-1)/2) l->mid = l->mid->next; + } else { /* now even */ + if (pos <= (l->numels-1)/2) l->mid = l->mid->prev; + } + + assert(list_repOk(l)); + + return 1; +} + +int list_delete(list_t *restrict l, const void *data) { + int pos, r; + + pos = list_locate(l, data); + if (pos < 0) + return -1; + + r = list_delete_at(l, pos); + if (r < 0) + return -1; + + assert(list_repOk(l)); + + return 0; +} + +int list_delete_at(list_t *restrict l, unsigned int pos) { + struct list_entry_s *delendo; + + + if (l->iter_active || pos >= l->numels) return -1; + + delendo = list_findpos(l, pos); + + list_drop_elem(l, delendo, pos); + + l->numels--; + + + assert(list_repOk(l)); + + return 0; +} + +int list_delete_range(list_t *restrict l, unsigned int posstart, unsigned int posend) { + struct list_entry_s *lastvalid, *tmp, *tmp2; + unsigned int numdel, midposafter, i; + int movedx; + + if (l->iter_active || posend < posstart || posend >= l->numels) return -1; + + numdel = posend - posstart + 1; + if (numdel == l->numels) return list_clear(l); + + tmp = list_findpos(l, posstart); /* first el to be deleted */ + lastvalid = tmp->prev; /* last valid element */ + + midposafter = (l->numels-1-numdel)/2; + + midposafter = midposafter < posstart ? midposafter : midposafter+numdel; + movedx = midposafter - (l->numels-1)/2; + + if (movedx > 0) { /* move right */ + for (i = 0; i < (unsigned int)movedx; l->mid = l->mid->next, i++); + } else { /* move left */ + movedx = -movedx; + for (i = 0; i < (unsigned int)movedx; l->mid = l->mid->prev, i++); + } + + assert(posstart == 0 || lastvalid != l->head_sentinel); + i = posstart; + if (l->attrs.copy_data) { + /* also free element data */ + for (; i <= posend; i++) { + tmp2 = tmp; + tmp = tmp->next; + if (tmp2->data != NULL) free(tmp2->data); + if (l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS) { + l->spareels[l->spareelsnum++] = tmp2; + } else { + free(tmp2); + } + } + } else { + /* only free containers */ + for (; i <= posend; i++) { + tmp2 = tmp; + tmp = tmp->next; + if (l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS) { + l->spareels[l->spareelsnum++] = tmp2; + } else { + free(tmp2); + } + } + } + assert(i == posend+1 && (posend != l->numels || tmp == l->tail_sentinel)); + + lastvalid->next = tmp; + tmp->prev = lastvalid; + + l->numels -= posend - posstart + 1; + + assert(list_repOk(l)); + + return numdel; +} + +int list_clear(list_t *restrict l) { + struct list_entry_s *s; + unsigned int numels; + + /* will be returned */ + numels = l->numels; + + if (l->iter_active) return -1; + + if (l->attrs.copy_data) { /* also free user data */ + /* spare a loop conditional with two loops: spareing elems and freeing elems */ + for (s = l->head_sentinel->next; l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS && s != l->tail_sentinel; s = s->next) { + /* move elements as spares as long as there is room */ + if (s->data != NULL) free(s->data); + l->spareels[l->spareelsnum++] = s; + } + while (s != l->tail_sentinel) { + /* free the remaining elems */ + if (s->data != NULL) free(s->data); + s = s->next; + free(s->prev); + } + l->head_sentinel->next = l->tail_sentinel; + l->tail_sentinel->prev = l->head_sentinel; + } else { /* only free element containers */ + /* spare a loop conditional with two loops: spareing elems and freeing elems */ + for (s = l->head_sentinel->next; l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS && s != l->tail_sentinel; s = s->next) { + /* move elements as spares as long as there is room */ + l->spareels[l->spareelsnum++] = s; + } + while (s != l->tail_sentinel) { + /* free the remaining elems */ + s = s->next; + free(s->prev); + } + l->head_sentinel->next = l->tail_sentinel; + l->tail_sentinel->prev = l->head_sentinel; + } + l->numels = 0; + l->mid = NULL; + + assert(list_repOk(l)); + + return numels; +} + +unsigned int list_size(const list_t *restrict l) { + return l->numels; +} + +int list_empty(const list_t *restrict l) { + return (l->numels == 0); +} + +int list_locate(const list_t *restrict l, const void *data) { + struct list_entry_s *el; + int pos = 0; + + if (l->attrs.comparator != NULL) { + /* use comparator */ + for (el = l->head_sentinel->next; el != l->tail_sentinel; el = el->next, pos++) { + if (l->attrs.comparator(data, el->data) == 0) break; + } + } else { + /* compare references */ + for (el = l->head_sentinel->next; el != l->tail_sentinel; el = el->next, pos++) { + if (el->data == data) break; + } + } + if (el == l->tail_sentinel) return -1; + + return pos; +} + +void *list_seek(list_t *restrict l, const void *indicator) { + const struct list_entry_s *iter; + + if (l->attrs.seeker == NULL) return NULL; + + for (iter = l->head_sentinel->next; iter != l->tail_sentinel; iter = iter->next) { + if (l->attrs.seeker(iter->data, indicator) != 0) return iter->data; + } + + return NULL; +} + +int list_contains(const list_t *restrict l, const void *data) { + return (list_locate(l, data) >= 0); +} + +int list_concat(const list_t *l1, const list_t *l2, list_t *restrict dest) { + struct list_entry_s *el, *srcel; + unsigned int cnt; + int err; + + + if (l1 == NULL || l2 == NULL || dest == NULL || l1 == dest || l2 == dest) + return -1; + + list_init(dest); + + dest->numels = l1->numels + l2->numels; + if (dest->numels == 0) + return 0; + + /* copy list1 */ + srcel = l1->head_sentinel->next; + el = dest->head_sentinel; + while (srcel != l1->tail_sentinel) { + el->next = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); + el->next->prev = el; + el = el->next; + el->data = srcel->data; + srcel = srcel->next; + } + dest->mid = el; /* approximate position (adjust later) */ + /* copy list 2 */ + srcel = l2->head_sentinel->next; + while (srcel != l2->tail_sentinel) { + el->next = (struct list_entry_s *)malloc(sizeof(struct list_entry_s)); + el->next->prev = el; + el = el->next; + el->data = srcel->data; + srcel = srcel->next; + } + el->next = dest->tail_sentinel; + dest->tail_sentinel->prev = el; + + /* fix mid pointer */ + err = l2->numels - l1->numels; + if ((err+1)/2 > 0) { /* correct pos RIGHT (err-1)/2 moves */ + err = (err+1)/2; + for (cnt = 0; cnt < (unsigned int)err; cnt++) dest->mid = dest->mid->next; + } else if (err/2 < 0) { /* correct pos LEFT (err/2)-1 moves */ + err = -err/2; + for (cnt = 0; cnt < (unsigned int)err; cnt++) dest->mid = dest->mid->prev; + } + + assert(!(list_repOk(l1) && list_repOk(l2)) || list_repOk(dest)); + + return 0; +} + +int list_sort(list_t *restrict l, int versus) { + if (l->iter_active || l->attrs.comparator == NULL) /* cannot modify list in the middle of an iteration */ + return -1; + + if (l->numels <= 1) + return 0; + list_sort_quicksort(l, versus, 0, l->head_sentinel->next, l->numels-1, l->tail_sentinel->prev); + assert(list_repOk(l)); + return 0; +} + +#ifdef SIMCLIST_WITH_THREADS +struct list_sort_wrappedparams { + list_t *restrict l; + int versus; + unsigned int first, last; + struct list_entry_s *fel, *lel; +}; + +static void *list_sort_quicksort_threadwrapper(void *wrapped_params) { + struct list_sort_wrappedparams *wp = (struct list_sort_wrappedparams *)wrapped_params; + list_sort_quicksort(wp->l, wp->versus, wp->first, wp->fel, wp->last, wp->lel); + free(wp); + pthread_exit(NULL); + return NULL; +} +#endif + +static inline void list_sort_selectionsort(list_t *restrict l, int versus, + unsigned int first, struct list_entry_s *fel, + unsigned int last, struct list_entry_s *lel) { + struct list_entry_s *cursor, *toswap, *firstunsorted; + void *tmpdata; + + if (last <= first) /* <= 1-element lists are always sorted */ + return; + + for (firstunsorted = fel; firstunsorted != lel; firstunsorted = firstunsorted->next) { + /* find min or max in the remainder of the list */ + for (toswap = firstunsorted, cursor = firstunsorted->next; cursor != lel->next; cursor = cursor->next) + if (l->attrs.comparator(toswap->data, cursor->data) * -versus > 0) toswap = cursor; + if (toswap != firstunsorted) { /* swap firstunsorted with toswap */ + tmpdata = firstunsorted->data; + firstunsorted->data = toswap->data; + toswap->data = tmpdata; + } + } +} + +static void list_sort_quicksort(list_t *restrict l, int versus, + unsigned int first, struct list_entry_s *fel, + unsigned int last, struct list_entry_s *lel) { + unsigned int pivotid; + unsigned int i; + register struct list_entry_s *pivot; + struct list_entry_s *left, *right; + void *tmpdata; +#ifdef SIMCLIST_WITH_THREADS + pthread_t tid; + int traised; +#endif + + + if (last <= first) /* <= 1-element lists are always sorted */ + return; + + if (last - first+1 <= SIMCLIST_MINQUICKSORTELS) { + list_sort_selectionsort(l, versus, first, fel, last, lel); + return; + } + + /* base of iteration: one element list */ + if (! (last > first)) return; + + pivotid = (get_random() % (last - first + 1)); + /* pivotid = (last - first + 1) / 2; */ + + /* find pivot */ + if (pivotid < (last - first + 1)/2) { + for (i = 0, pivot = fel; i < pivotid; pivot = pivot->next, i++); + } else { + for (i = last - first, pivot = lel; i > pivotid; pivot = pivot->prev, i--); + } + + /* smaller PIVOT bigger */ + left = fel; + right = lel; + /* iterate --- left ---> PIV <--- right --- */ + while (left != pivot && right != pivot) { + for (; left != pivot && (l->attrs.comparator(left->data, pivot->data) * -versus <= 0); left = left->next); + /* left points to a smaller element, or to pivot */ + for (; right != pivot && (l->attrs.comparator(right->data, pivot->data) * -versus >= 0); right = right->prev); + /* right points to a bigger element, or to pivot */ + if (left != pivot && right != pivot) { + /* swap, then move iterators */ + tmpdata = left->data; + left->data = right->data; + right->data = tmpdata; + + left = left->next; + right = right->prev; + } + } + + /* now either left points to pivot (end run), or right */ + if (right == pivot) { /* left part longer */ + while (left != pivot) { + if (l->attrs.comparator(left->data, pivot->data) * -versus > 0) { + tmpdata = left->data; + left->data = pivot->prev->data; + pivot->prev->data = pivot->data; + pivot->data = tmpdata; + pivot = pivot->prev; + pivotid--; + if (pivot == left) break; + } else { + left = left->next; + } + } + } else { /* right part longer */ + while (right != pivot) { + if (l->attrs.comparator(right->data, pivot->data) * -versus < 0) { + /* move current right before pivot */ + tmpdata = right->data; + right->data = pivot->next->data; + pivot->next->data = pivot->data; + pivot->data = tmpdata; + pivot = pivot->next; + pivotid++; + if (pivot == right) break; + } else { + right = right->prev; + } + } + } + + /* sort sublists A and B : |---A---| pivot |---B---| */ + +#ifdef SIMCLIST_WITH_THREADS + traised = 0; + if (pivotid > 0) { + /* prepare wrapped args, then start thread */ + if (l->threadcount < SIMCLIST_MAXTHREADS-1) { + struct list_sort_wrappedparams *wp = (struct list_sort_wrappedparams *)malloc(sizeof(struct list_sort_wrappedparams)); + l->threadcount++; + traised = 1; + wp->l = l; + wp->versus = versus; + wp->first = first; + wp->fel = fel; + wp->last = first+pivotid-1; + wp->lel = pivot->prev; + if (pthread_create(&tid, NULL, list_sort_quicksort_threadwrapper, wp) != 0) { + free(wp); + traised = 0; + list_sort_quicksort(l, versus, first, fel, first+pivotid-1, pivot->prev); + } + } else { + list_sort_quicksort(l, versus, first, fel, first+pivotid-1, pivot->prev); + } + } + if (first + pivotid < last) list_sort_quicksort(l, versus, first+pivotid+1, pivot->next, last, lel); + if (traised) { + pthread_join(tid, (void **)NULL); + l->threadcount--; + } +#else + if (pivotid > 0) list_sort_quicksort(l, versus, first, fel, first+pivotid-1, pivot->prev); + if (first + pivotid < last) list_sort_quicksort(l, versus, first+pivotid+1, pivot->next, last, lel); +#endif +} + +int list_iterator_start(list_t *restrict l) { + if (l->iter_active) return 0; + l->iter_pos = 0; + l->iter_active = 1; + l->iter_curentry = l->head_sentinel->next; + return 1; +} + +void *list_iterator_next(list_t *restrict l) { + void *toret; + + if (! l->iter_active) return NULL; + + toret = l->iter_curentry->data; + l->iter_curentry = l->iter_curentry->next; + l->iter_pos++; + + return toret; +} + +int list_iterator_hasnext(const list_t *restrict l) { + if (! l->iter_active) return 0; + return (l->iter_pos < l->numels); +} + +int list_iterator_stop(list_t *restrict l) { + if (! l->iter_active) return 0; + l->iter_pos = 0; + l->iter_active = 0; + return 1; +} + +int list_hash(const list_t *restrict l, list_hash_t *restrict hash) { + struct list_entry_s *x; + list_hash_t tmphash; + + assert(hash != NULL); + + tmphash = l->numels * 2 + 100; + if (l->attrs.hasher == NULL) { +#ifdef SIMCLIST_ALLOW_LOCATIONBASED_HASHES + /* ENABLE WITH CARE !! */ +#warning "Memlocation-based hash is consistent only for testing modification in the same program run." + int i; + + /* only use element references */ + for (x = l->head_sentinel->next; x != l->tail_sentinel; x = x->next) { + for (i = 0; i < sizeof(x->data); i++) { + tmphash += (tmphash ^ (uintptr_t)x->data); + } + tmphash += tmphash % l->numels; + } +#else + return -1; +#endif + } else { + /* hash each element with the user-given function */ + for (x = l->head_sentinel->next; x != l->tail_sentinel; x = x->next) { + tmphash += tmphash ^ l->attrs.hasher(x->data); + tmphash += tmphash % l->numels; + } + } + + *hash = tmphash; + + return 0; +} + +#ifndef SIMCLIST_NO_DUMPRESTORE +int list_dump_getinfo_filedescriptor(int fd, list_dump_info_t *restrict info) { + int32_t terminator_head, terminator_tail; + uint32_t elemlen; + off_t hop; + + + /* version */ + READ_ERRCHECK(fd, & info->version, sizeof(info->version)); + info->version = ntohs(info->version); + if (info->version > SIMCLIST_DUMPFORMAT_VERSION) { + errno = EILSEQ; + return -1; + } + + /* timestamp.tv_sec and timestamp.tv_usec */ + READ_ERRCHECK(fd, & info->timestamp.tv_sec, sizeof(info->timestamp.tv_sec)); + info->timestamp.tv_sec = ntohl(info->timestamp.tv_sec); + READ_ERRCHECK(fd, & info->timestamp.tv_usec, sizeof(info->timestamp.tv_usec)); + info->timestamp.tv_usec = ntohl(info->timestamp.tv_usec); + + /* list terminator (to check thereafter) */ + READ_ERRCHECK(fd, & terminator_head, sizeof(terminator_head)); + terminator_head = ntohl(terminator_head); + + /* list size */ + READ_ERRCHECK(fd, & info->list_size, sizeof(info->list_size)); + info->list_size = ntohl(info->list_size); + + /* number of elements */ + READ_ERRCHECK(fd, & info->list_numels, sizeof(info->list_numels)); + info->list_numels = ntohl(info->list_numels); + + /* length of each element (for checking for consistency) */ + READ_ERRCHECK(fd, & elemlen, sizeof(elemlen)); + elemlen = ntohl(elemlen); + + /* list hash */ + READ_ERRCHECK(fd, & info->list_hash, sizeof(info->list_hash)); + info->list_hash = ntohl(info->list_hash); + + /* check consistency */ + if (elemlen > 0) { + /* constant length, hop by size only */ + hop = info->list_size; + } else { + /* non-constant length, hop by size + all element length blocks */ + hop = info->list_size + elemlen*info->list_numels; + } + if (lseek(fd, hop, SEEK_CUR) == -1) { + return -1; + } + + /* read the trailing value and compare with terminator_head */ + READ_ERRCHECK(fd, & terminator_tail, sizeof(terminator_tail)); + terminator_tail = ntohl(terminator_tail); + + if (terminator_head == terminator_tail) + info->consistent = 1; + else + info->consistent = 0; + + return 0; +} + +int list_dump_getinfo_file(const char *restrict filename, list_dump_info_t *restrict info) { + int fd, ret; + + fd = open(filename, O_RDONLY, 0); + if (fd < 0) return -1; + + ret = list_dump_getinfo_filedescriptor(fd, info); + close(fd); + + return ret; +} + +int list_dump_filedescriptor(const list_t *restrict l, int fd, size_t *restrict len) { + struct list_entry_s *x; + void *ser_buf; + uint32_t bufsize; + struct timeval timeofday; + struct list_dump_header_s header; + + if (l->attrs.meter == NULL && l->attrs.serializer == NULL) { + errno = ENOTTY; + return -1; + } + + /**** DUMP FORMAT **** + + [ ver timestamp | totlen numels elemlen hash | DATA ] + + where DATA can be: + @ for constant-size list (element size is constant; elemlen > 0) + [ elem elem ... elem ] + @ for other lists (element size dictated by element_meter each time; elemlen <= 0) + [ size elem size elem ... size elem ] + + all integers are encoded in NETWORK BYTE FORMAT + *****/ + + + /* prepare HEADER */ + /* version */ + header.ver = htons( SIMCLIST_DUMPFORMAT_VERSION ); + + /* timestamp */ + gettimeofday(&timeofday, NULL); + header.timestamp_sec = htonl(timeofday.tv_sec); + header.timestamp_usec = htonl(timeofday.tv_usec); + + header.rndterm = htonl((int32_t)get_random()); + + /* total list size is postprocessed afterwards */ + + /* number of elements */ + header.numels = htonl(l->numels); + + /* include an hash, if possible */ + if (l->attrs.hasher != NULL) { + if (htonl(list_hash(l, & header.listhash)) != 0) { + /* could not compute list hash! */ + return -1; + } + } else { + header.listhash = htonl(0); + } + + header.totlistlen = header.elemlen = 0; + + /* leave room for the header at the beginning of the file */ + if (lseek(fd, SIMCLIST_DUMPFORMAT_HEADERLEN, SEEK_SET) < 0) { + /* errno set by lseek() */ + return -1; + } + + /* write CONTENT */ + if (l->numels > 0) { + /* SPECULATE that the list has constant element size */ + + if (l->attrs.serializer != NULL) { /* user user-specified serializer */ + /* get preliminary length of serialized element in header.elemlen */ + ser_buf = l->attrs.serializer(l->head_sentinel->next->data, & header.elemlen); + free(ser_buf); + /* request custom serialization of each element */ + for (x = l->head_sentinel->next; x != l->tail_sentinel; x = x->next) { + ser_buf = l->attrs.serializer(x->data, &bufsize); + header.totlistlen += bufsize; + if (header.elemlen != 0) { /* continue on speculation */ + if (header.elemlen != bufsize) { + free(ser_buf); + /* constant element length speculation broken! */ + header.elemlen = 0; + header.totlistlen = 0; + x = l->head_sentinel; + if (lseek(fd, SIMCLIST_DUMPFORMAT_HEADERLEN, SEEK_SET) < 0) { + /* errno set by lseek() */ + return -1; + } + /* restart from the beginning */ + continue; + } + /* speculation confirmed */ + WRITE_ERRCHECK(fd, ser_buf, bufsize); + } else { /* speculation found broken */ + WRITE_ERRCHECK(fd, & bufsize, sizeof(size_t)); + WRITE_ERRCHECK(fd, ser_buf, bufsize); + } + free(ser_buf); + } + } else if (l->attrs.meter != NULL) { + header.elemlen = (uint32_t)l->attrs.meter(l->head_sentinel->next->data); + + /* serialize the element straight from its data */ + for (x = l->head_sentinel->next; x != l->tail_sentinel; x = x->next) { + bufsize = l->attrs.meter(x->data); + header.totlistlen += bufsize; + if (header.elemlen != 0) { + if (header.elemlen != bufsize) { + /* constant element length speculation broken! */ + header.elemlen = 0; + header.totlistlen = 0; + x = l->head_sentinel; + /* restart from the beginning */ + continue; + } + WRITE_ERRCHECK(fd, x->data, bufsize); + } else { + WRITE_ERRCHECK(fd, &bufsize, sizeof(size_t)); + WRITE_ERRCHECK(fd, x->data, bufsize); + } + } + } + /* adjust endianness */ + header.elemlen = htonl(header.elemlen); + header.totlistlen = htonl(header.totlistlen); + } + + /* write random terminator */ + WRITE_ERRCHECK(fd, & header.rndterm, sizeof(header.rndterm)); /* list terminator */ + + + /* write header */ + lseek(fd, 0, SEEK_SET); + + WRITE_ERRCHECK(fd, & header.ver, sizeof(header.ver)); /* version */ + WRITE_ERRCHECK(fd, & header.timestamp_sec, sizeof(header.timestamp_sec)); /* timestamp seconds */ + WRITE_ERRCHECK(fd, & header.timestamp_usec, sizeof(header.timestamp_usec)); /* timestamp microseconds */ + WRITE_ERRCHECK(fd, & header.rndterm, sizeof(header.rndterm)); /* random terminator */ + + WRITE_ERRCHECK(fd, & header.totlistlen, sizeof(header.totlistlen)); /* total length of elements */ + WRITE_ERRCHECK(fd, & header.numels, sizeof(header.numels)); /* number of elements */ + WRITE_ERRCHECK(fd, & header.elemlen, sizeof(header.elemlen)); /* size of each element, or 0 for independent */ + WRITE_ERRCHECK(fd, & header.listhash, sizeof(header.listhash)); /* list hash, or 0 for "ignore" */ + + + /* possibly store total written length in "len" */ + if (len != NULL) { + *len = sizeof(header) + ntohl(header.totlistlen); + } + + return 0; +} + +int list_restore_filedescriptor(list_t *restrict l, int fd, size_t *restrict len) { + struct list_dump_header_s header; + unsigned long cnt; + void *buf; + uint32_t elsize, totreadlen, totmemorylen; + + memset(& header, 0, sizeof(header)); + + /* read header */ + + /* version */ + READ_ERRCHECK(fd, &header.ver, sizeof(header.ver)); + header.ver = ntohs(header.ver); + if (header.ver != SIMCLIST_DUMPFORMAT_VERSION) { + errno = EILSEQ; + return -1; + } + + /* timestamp */ + READ_ERRCHECK(fd, & header.timestamp_sec, sizeof(header.timestamp_sec)); + header.timestamp_sec = ntohl(header.timestamp_sec); + READ_ERRCHECK(fd, & header.timestamp_usec, sizeof(header.timestamp_usec)); + header.timestamp_usec = ntohl(header.timestamp_usec); + + /* list terminator */ + READ_ERRCHECK(fd, & header.rndterm, sizeof(header.rndterm)); + + header.rndterm = ntohl(header.rndterm); + + /* total list size */ + READ_ERRCHECK(fd, & header.totlistlen, sizeof(header.totlistlen)); + header.totlistlen = ntohl(header.totlistlen); + + /* number of elements */ + READ_ERRCHECK(fd, & header.numels, sizeof(header.numels)); + header.numels = ntohl(header.numels); + + /* length of every element, or '0' = variable */ + READ_ERRCHECK(fd, & header.elemlen, sizeof(header.elemlen)); + header.elemlen = ntohl(header.elemlen); + + /* list hash, or 0 = 'ignore' */ + READ_ERRCHECK(fd, & header.listhash, sizeof(header.listhash)); + header.listhash = ntohl(header.listhash); + + + /* read content */ + totreadlen = totmemorylen = 0; + if (header.elemlen > 0) { + /* elements have constant size = header.elemlen */ + if (l->attrs.unserializer != NULL) { + /* use unserializer */ + buf = malloc(header.elemlen); + for (cnt = 0; cnt < header.numels; cnt++) { + READ_ERRCHECK(fd, buf, header.elemlen); + list_append(l, l->attrs.unserializer(buf, & elsize)); + totmemorylen += elsize; + } + } else { + /* copy verbatim into memory */ + for (cnt = 0; cnt < header.numels; cnt++) { + buf = malloc(header.elemlen); + READ_ERRCHECK(fd, buf, header.elemlen); + list_append(l, buf); + } + totmemorylen = header.numels * header.elemlen; + } + totreadlen = header.numels * header.elemlen; + } else { + /* elements have variable size. Each element is preceded by its size */ + if (l->attrs.unserializer != NULL) { + /* use unserializer */ + for (cnt = 0; cnt < header.numels; cnt++) { + READ_ERRCHECK(fd, & elsize, sizeof(elsize)); + buf = malloc((size_t)elsize); + READ_ERRCHECK(fd, buf, elsize); + totreadlen += elsize; + list_append(l, l->attrs.unserializer(buf, & elsize)); + totmemorylen += elsize; + } + } else { + /* copy verbatim into memory */ + for (cnt = 0; cnt < header.numels; cnt++) { + READ_ERRCHECK(fd, & elsize, sizeof(elsize)); + buf = malloc(elsize); + READ_ERRCHECK(fd, buf, elsize); + totreadlen += elsize; + list_append(l, buf); + } + totmemorylen = totreadlen; + } + } + + READ_ERRCHECK(fd, &elsize, sizeof(elsize)); /* read list terminator */ + elsize = ntohl(elsize); + + /* possibly verify the list consistency */ + /* wrt hash */ + /* don't do that + if (header.listhash != 0 && header.listhash != list_hash(l)) { + errno = ECANCELED; + return -1; + } + */ + + /* wrt header */ + if (totreadlen != header.totlistlen && (int32_t)elsize == header.rndterm) { + errno = EPROTO; + return -1; + } + + /* wrt file */ + if (lseek(fd, 0, SEEK_CUR) != lseek(fd, 0, SEEK_END)) { + errno = EPROTO; + return -1; + } + + if (len != NULL) { + *len = totmemorylen; + } + + return 0; +} + +int list_dump_file(const list_t *restrict l, const char *restrict filename, size_t *restrict len) { + int fd, oflag, mode; + +#ifndef _WIN32 + oflag = O_RDWR | O_CREAT | O_TRUNC; + mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; +#else + oflag = _O_RDWR | _O_CREAT | _O_TRUNC; + mode = _S_IRUSR | _S_IWUSR | _S_IRGRP | _S_IROTH; +#endif + fd = open(filename, oflag, mode); + if (fd < 0) return -1; + + list_dump_filedescriptor(l, fd, len); + close(fd); + + return 0; +} + +int list_restore_file(list_t *restrict l, const char *restrict filename, size_t *restrict len) { + int fd; + + fd = open(filename, O_RDONLY, 0); + if (fd < 0) return -1; + + list_restore_filedescriptor(l, fd, len); + close(fd); + + return 0; +} +#endif /* ifndef SIMCLIST_NO_DUMPRESTORE */ + + +static int list_drop_elem(list_t *restrict l, struct list_entry_s *tmp, unsigned int pos) { + if (tmp == NULL) return -1; + + /* fix mid pointer. This is wrt the PRE situation */ + if (l->numels % 2) { /* now odd */ + /* sort out the base case by hand */ + if (l->numels == 1) l->mid = NULL; + else if (pos >= l->numels/2) l->mid = l->mid->prev; + } else { /* now even */ + if (pos < l->numels/2) l->mid = l->mid->next; + } + + tmp->prev->next = tmp->next; + tmp->next->prev = tmp->prev; + + /* free what's to be freed */ + if (l->attrs.copy_data && tmp->data != NULL) + free(tmp->data); + + if (l->spareelsnum < SIMCLIST_MAX_SPARE_ELEMS) { + l->spareels[l->spareelsnum++] = tmp; + } else { + free(tmp); + } + + return 0; +} + +/* ready-made comparators and meters */ +#define SIMCLIST_NUMBER_COMPARATOR(type) int list_comparator_##type(const void *a, const void *b) { return( *(type *)a < *(type *)b) - (*(type *)a > *(type *)b); } + +SIMCLIST_NUMBER_COMPARATOR(int8_t) +SIMCLIST_NUMBER_COMPARATOR(int16_t) +SIMCLIST_NUMBER_COMPARATOR(int32_t) +SIMCLIST_NUMBER_COMPARATOR(int64_t) + +SIMCLIST_NUMBER_COMPARATOR(uint8_t) +SIMCLIST_NUMBER_COMPARATOR(uint16_t) +SIMCLIST_NUMBER_COMPARATOR(uint32_t) +SIMCLIST_NUMBER_COMPARATOR(uint64_t) + +SIMCLIST_NUMBER_COMPARATOR(float) +SIMCLIST_NUMBER_COMPARATOR(double) + +int list_comparator_string(const void *a, const void *b) { return strcmp((const char *)b, (const char *)a); } + +/* ready-made metric functions */ +#define SIMCLIST_METER(type) size_t list_meter_##type(const void *el) { if (el) { /* kill compiler whinge */ } return sizeof(type); } + +SIMCLIST_METER(int8_t) +SIMCLIST_METER(int16_t) +SIMCLIST_METER(int32_t) +SIMCLIST_METER(int64_t) + +SIMCLIST_METER(uint8_t) +SIMCLIST_METER(uint16_t) +SIMCLIST_METER(uint32_t) +SIMCLIST_METER(uint64_t) + +SIMCLIST_METER(float) +SIMCLIST_METER(double) + +size_t list_meter_string(const void *el) { return strlen((const char *)el) + 1; } + +/* ready-made hashing functions */ +#define SIMCLIST_HASHCOMPUTER(type) list_hash_t list_hashcomputer_##type(const void *el) { return (list_hash_t)(*(type *)el); } + +SIMCLIST_HASHCOMPUTER(int8_t) +SIMCLIST_HASHCOMPUTER(int16_t) +SIMCLIST_HASHCOMPUTER(int32_t) +SIMCLIST_HASHCOMPUTER(int64_t) + +SIMCLIST_HASHCOMPUTER(uint8_t) +SIMCLIST_HASHCOMPUTER(uint16_t) +SIMCLIST_HASHCOMPUTER(uint32_t) +SIMCLIST_HASHCOMPUTER(uint64_t) + +SIMCLIST_HASHCOMPUTER(float) +SIMCLIST_HASHCOMPUTER(double) + +list_hash_t list_hashcomputer_string(const void *el) { + size_t l; + list_hash_t hash = 123; + const char *str = (const char *)el; + char plus; + + for (l = 0; str[l] != '\0'; l++) { + if (l) plus = hash ^ str[l]; + else plus = hash ^ (str[l] - str[0]); + hash += (plus << (CHAR_BIT * (l % sizeof(list_hash_t)))); + } + + return hash; +} + + +#ifndef NDEBUG +static int list_repOk(const list_t *restrict l) { + int ok, i; + struct list_entry_s *s; + + ok = (l != NULL) && ( + /* head/tail checks */ + (l->head_sentinel != NULL && l->tail_sentinel != NULL) && + (l->head_sentinel != l->tail_sentinel) && (l->head_sentinel->prev == NULL && l->tail_sentinel->next == NULL) && + /* empty list */ + (l->numels > 0 || (l->mid == NULL && l->head_sentinel->next == l->tail_sentinel && l->tail_sentinel->prev == l->head_sentinel)) && + /* spare elements checks */ + l->spareelsnum <= SIMCLIST_MAX_SPARE_ELEMS + ); + + if (!ok) return 0; + + if (l->numels >= 1) { + /* correct referencing */ + for (i = -1, s = l->head_sentinel; i < (int)(l->numels-1)/2 && s->next != NULL; i++, s = s->next) { + if (s->next->prev != s) break; + } + ok = (i == (int)(l->numels-1)/2 && l->mid == s); + if (!ok) return 0; + for (; s->next != NULL; i++, s = s->next) { + if (s->next->prev != s) break; + } + ok = (i == (int)l->numels && s == l->tail_sentinel); + } + + return ok; +} + +static int list_attrOk(const list_t *restrict l) { + int ok; + + ok = (l->attrs.copy_data == 0 || l->attrs.meter != NULL); + return ok; +} + +#endif + diff --git a/ccid/ccid/src/simclist.h b/ccid/ccid/src/simclist.h new file mode 100644 index 0000000..2ce9d49 --- /dev/null +++ b/ccid/ccid/src/simclist.h @@ -0,0 +1,980 @@ +/* + * Copyright (c) 2007,2008 Mij + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +/* + * SimCList library. See http://mij.oltrelinux.com/devel/simclist + */ + + +#ifndef SIMCLIST_H +#define SIMCLIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#ifndef SIMCLIST_NO_DUMPRESTORE +# ifndef _WIN32 +# include /* list_dump_info_t's struct timeval */ +# else +# include +# endif +#endif + + +/* Be friend of both C90 and C99 compilers */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + /* "inline" and "restrict" are keywords */ +#else +# define inline /* inline */ +# define restrict /* restrict */ +#endif + + +/** + * Type representing list hashes. + * + * This is a signed integer value. + */ +typedef int32_t list_hash_t; + +#ifndef SIMCLIST_NO_DUMPRESTORE +typedef struct { + uint16_t version; /* dump version */ + struct timeval timestamp; /* when the list has been dumped, seconds since UNIX epoch */ + uint32_t list_size; + uint32_t list_numels; + list_hash_t list_hash; /* hash of the list when dumped, or 0 if invalid */ + uint32_t dumpsize; + int consistent; /* 1 if the dump is verified complete/consistent; 0 otherwise */ +} list_dump_info_t; +#endif + +/** + * a comparator of elements. + * + * A comparator of elements is a function that: + * -# receives two references to elements a and b + * -# returns {<0, 0, >0} if (a > b), (a == b), (a < b) respectively + * + * It is responsability of the function to handle possible NULL values. + */ +typedef int (*element_comparator)(const void *a, const void *b); + +/** + * a seeker of elements. + * + * An element seeker is a function that: + * -# receives a reference to an element el + * -# receives a reference to some indicator data + * -# returns non-0 if the element matches the indicator, 0 otherwise + * + * It is responsability of the function to handle possible NULL values in any + * argument. + */ +typedef int (*element_seeker)(const void *el, const void *indicator); + +/** + * an element lenght meter. + * + * An element meter is a function that: + * -# receives the reference to an element el + * -# returns its size in bytes + * + * It is responsability of the function to handle possible NULL values. + */ +typedef size_t (*element_meter)(const void *el); + +/** + * a function computing the hash of elements. + * + * An hash computing function is a function that: + * -# receives the reference to an element el + * -# returns a hash value for el + * + * It is responsability of the function to handle possible NULL values. + */ +typedef list_hash_t (*element_hash_computer)(const void *el); + +/** + * a function for serializing an element. + * + * A serializer function is one that gets a reference to an element, + * and returns a reference to a buffer that contains its serialization + * along with the length of this buffer. + * It is responsability of the function to handle possible NULL values, + * returning a NULL buffer and a 0 buffer length. + * + * These functions have 3 goals: + * -# "freeze" and "flatten" the memory representation of the element + * -# provide a portable (wrt byte order, or type size) representation of the element, if the dump can be used on different sw/hw combinations + * -# possibly extract a compressed representation of the element + * + * @param el reference to the element data + * @param serialize_buffer reference to fill with the length of the buffer + * @return reference to the buffer with the serialized data + */ +typedef void *(*element_serializer)(const void *restrict el, uint32_t *restrict serializ_len); + +/** + * a function for un-serializing an element. + * + * An unserializer function accomplishes the inverse operation of the + * serializer function. An unserializer function is one that gets a + * serialized representation of an element and turns it backe to the original + * element. The serialized representation is passed as a reference to a buffer + * with its data, and the function allocates and returns the buffer containing + * the original element, and it sets the length of this buffer into the + * integer passed by reference. + * + * @param data reference to the buffer with the serialized representation of the element + * @param data_len reference to the location where to store the length of the data in the buffer returned + * @return reference to a buffer with the original, unserialized representation of the element + */ +typedef void *(*element_unserializer)(const void *restrict data, uint32_t *restrict data_len); + +/* [private-use] list entry -- olds actual user datum */ +struct list_entry_s { + void *data; + + /* doubly-linked list service references */ + struct list_entry_s *next; + struct list_entry_s *prev; +}; + +/* [private-use] list attributes */ +struct list_attributes_s { + /* user-set routine for comparing list elements */ + element_comparator comparator; + /* user-set routing for seeking elements */ + element_seeker seeker; + /* user-set routine for determining the length of an element */ + element_meter meter; + int copy_data; + /* user-set routine for computing the hash of an element */ + element_hash_computer hasher; + /* user-set routine for serializing an element */ + element_serializer serializer; + /* user-set routine for unserializing an element */ + element_unserializer unserializer; +}; + +/** list object */ +typedef struct { + struct list_entry_s *head_sentinel; + struct list_entry_s *tail_sentinel; + struct list_entry_s *mid; + + unsigned int numels; + + /* array of spare elements */ + struct list_entry_s **spareels; + unsigned int spareelsnum; + +#ifdef SIMCLIST_WITH_THREADS + /* how many threads are currently running */ + unsigned int threadcount; +#endif + + /* service variables for list iteration */ + int iter_active; + unsigned int iter_pos; + struct list_entry_s *iter_curentry; + + /* list attributes */ + struct list_attributes_s attrs; +} list_t; + +/** + * initialize a list object for use. + * + * @param l must point to a user-provided memory location + * @return 0 for success. -1 for failure + */ +int list_init(list_t *restrict l); + +/** + * completely remove the list from memory. + * + * This function is the inverse of list_init(). It is meant to be called when + * the list is no longer going to be used. Elements and possible memory taken + * for internal use are freed. + * + * @param l list to destroy + */ +void list_destroy(list_t *restrict l); + +/** + * set the comparator function for list elements. + * + * Comparator functions are used for searching and sorting. If NULL is passed + * as reference to the function, the comparator is disabled. + * + * @param l list to operate + * @param comparator_fun pointer to the actual comparator function + * @return 0 if the attribute was successfully set; -1 otherwise + * + * @see element_comparator() + */ +int list_attributes_comparator(list_t *restrict l, element_comparator comparator_fun); + +/** + * set a seeker function for list elements. + * + * Seeker functions are used for finding elements. If NULL is passed as reference + * to the function, the seeker is disabled. + * + * @param l list to operate + * @param seeker_fun pointer to the actual seeker function + * @return 0 if the attribute was successfully set; -1 otherwise + * + * @see element_seeker() + */ +int list_attributes_seeker(list_t *restrict l, element_seeker seeker_fun); + +/** + * require to free element data when list entry is removed (default: don't free). + * + * [ advanced preference ] + * + * By default, when an element is removed from the list, it disappears from + * the list by its actual data is not free()d. With this option, every + * deletion causes element data to be freed. + * + * It is responsability of this function to correctly handle NULL values, if + * NULL elements are inserted into the list. + * + * @param l list to operate + * @param metric_fun pointer to the actual metric function + * @param copy_data 0: do not free element data (default); non-0: do free + * @return 0 if the attribute was successfully set; -1 otherwise + * + * @see element_meter() + * @see list_meter_int8_t() + * @see list_meter_int16_t() + * @see list_meter_int32_t() + * @see list_meter_int64_t() + * @see list_meter_uint8_t() + * @see list_meter_uint16_t() + * @see list_meter_uint32_t() + * @see list_meter_uint64_t() + * @see list_meter_float() + * @see list_meter_double() + * @see list_meter_string() + */ +int list_attributes_copy(list_t *restrict l, element_meter metric_fun, int copy_data); + +/** + * set the element hash computing function for the list elements. + * + * [ advanced preference ] + * + * An hash can be requested depicting the list status at a given time. An hash + * only depends on the elements and their order. By default, the hash of an + * element is only computed on its reference. With this function, the user can + * set a custom function computing the hash of an element. If such function is + * provided, the list_hash() function automatically computes the list hash using + * the custom function instead of simply referring to element references. + * + * @param l list to operate + * @param hash_computer_fun pointer to the actual hash computing function + * @return 0 if the attribute was successfully set; -1 otherwise + * + * @see element_hash_computer() + */ +int list_attributes_hash_computer(list_t *restrict l, element_hash_computer hash_computer_fun); + +/** + * set the element serializer function for the list elements. + * + * [ advanced preference ] + * + * Serialize functions are used for dumping the list to some persistent + * storage. The serializer function is called for each element; it is passed + * a reference to the element and a reference to a size_t object. It will + * provide (and return) the buffer with the serialization of the element and + * fill the size_t object with the length of this serialization data. + * + * @param l list to operate + * @param serializer_fun pointer to the actual serializer function + * @return 0 if the attribute was successfully set; -1 otherwise + * + * @see element_serializer() + * @see list_dump_filedescriptor() + * @see list_restore_filedescriptor() + */ +int list_attributes_serializer(list_t *restrict l, element_serializer serializer_fun); + +/** + * set the element unserializer function for the list elements. + * + * [ advanced preference ] + * + * Unserialize functions are used for restoring the list from some persistent + * storage. The unserializer function is called for each element segment read + * from the storage; it is passed the segment and a reference to an integer. + * It shall allocate and return a buffer compiled with the resumed memory + * representation of the element, and set the integer value to the length of + * this buffer. + * + * @param l list to operate + * @param unserializer_fun pointer to the actual unserializer function + * @return 0 if the attribute was successfully set; -1 otherwise + * + * @see element_unserializer() + * @see list_dump_filedescriptor() + * @see list_restore_filedescriptor() + */ +int list_attributes_unserializer(list_t *restrict l, element_unserializer unserializer_fun); + +/** + * append data at the end of the list. + * + * This function is useful for adding elements with a FIFO/queue policy. + * + * @param l list to operate + * @param data pointer to user data to append + * + * @return 1 for success. < 0 for failure + */ +int list_append(list_t *restrict l, const void *data); + +/** + * insert data in the head of the list. + * + * This function is useful for adding elements with a LIFO/Stack policy. + * + * @param l list to operate + * @param data pointer to user data to append + * + * @return 1 for success. < 0 for failure + */ +int list_prepend(list_t *restrict l, const void *restrict data); + +/** + * extract the element in the top of the list. + * + * This function is for using a list with a FIFO/queue policy. + * + * @param l list to operate + * @return reference to user datum, or NULL on errors + */ +void *list_fetch(list_t *restrict l); + +/** + * retrieve an element at a given position. + * + * @param l list to operate + * @param pos [0,size-1] position index of the element wanted + * @return reference to user datum, or NULL on errors + */ +void *list_get_at(const list_t *restrict l, unsigned int pos); + +/** + * return the maximum element of the list. + * + * @warning Requires a comparator function to be set for the list. + * + * Returns the maximum element with respect to the comparator function output. + * + * @see list_attributes_comparator() + * + * @param l list to operate + * @return the reference to the element, or NULL + */ +void *list_get_max(const list_t *restrict l); + +/** + * return the minimum element of the list. + * + * @warning Requires a comparator function to be set for the list. + * + * Returns the minimum element with respect to the comparator function output. + * + * @see list_attributes_comparator() + * + * @param l list to operate + * @return the reference to the element, or NULL + */ +void *list_get_min(const list_t *restrict l); + +/** + * retrieve and remove from list an element at a given position. + * + * @param l list to operate + * @param pos [0,size-1] position index of the element wanted + * @return reference to user datum, or NULL on errors + */ +void *list_extract_at(list_t *restrict l, unsigned int pos); + +/** + * insert an element at a given position. + * + * @param l list to operate + * @param data reference to data to be inserted + * @param pos [0,size-1] position index to insert the element at + * @return positive value on success. Negative on failure + */ +int list_insert_at(list_t *restrict l, const void *data, unsigned int pos); + +/** + * expunge the first found given element from the list. + * + * Inspects the given list looking for the given element; if the element + * is found, it is removed. Only the first occurence is removed. + * If a comparator function was not set, elements are compared by reference. + * Otherwise, the comparator is used to match the element. + * + * @param l list to operate + * @param data reference of the element to search for + * @return 0 on success. Negative value on failure + * + * @see list_attributes_comparator() + * @see list_delete_at() + */ +int list_delete(list_t *restrict l, const void *data); + +/** + * expunge an element at a given position from the list. + * + * @param l list to operate + * @param pos [0,size-1] position index of the element to be deleted + * @return 0 on success. Negative value on failure + */ +int list_delete_at(list_t *restrict l, unsigned int pos); + +/** + * expunge an array of elements from the list, given their position range. + * + * @param l list to operate + * @param posstart [0,size-1] position index of the first element to be deleted + * @param posend [posstart,size-1] position of the last element to be deleted + * @return the number of elements successfully removed on success, <0 on error + */ +int list_delete_range(list_t *restrict l, unsigned int posstart, unsigned int posend); + +/** + * clear all the elements off of the list. + * + * The element datums will not be freed. + * + * @see list_delete_range() + * @see list_size() + * + * @param l list to operate + * @return the number of elements removed on success, <0 on error + */ +int list_clear(list_t *restrict l); + +/** + * inspect the number of elements in the list. + * + * @param l list to operate + * @return number of elements currently held by the list + */ +unsigned int list_size(const list_t *restrict l); + +/** + * inspect whether the list is empty. + * + * @param l list to operate + * @return 0 iff the list is not empty + * + * @see list_size() + */ +int list_empty(const list_t *restrict l); + +/** + * find the position of an element in a list. + * + * @warning Requires a comparator function to be set for the list. + * + * Inspects the given list looking for the given element; if the element + * is found, its position into the list is returned. + * Elements are inspected comparing references if a comparator has not been + * set. Otherwise, the comparator is used to find the element. + * + * @param l list to operate + * @param data reference of the element to search for + * @return position of element in the list, or <0 if not found + * + * @see list_attributes_comparator() + * @see list_get_at() + */ +int list_locate(const list_t *restrict l, const void *data); + +/** + * returns an element given an indicator. + * + * @warning Requires a seeker function to be set for the list. + * + * Inspect the given list looking with the seeker if an element matches + * an indicator. If such element is found, the reference to the element + * is returned. + * + * @param l list to operate + * @param indicator indicator data to pass to the seeker along with elements + * @return reference to the element accepted by the seeker, or NULL if none found + */ +void *list_seek(list_t *restrict l, const void *indicator); + +/** + * inspect whether some data is member of the list. + * + * @warning Requires a comparator function to be set for the list. + * + * By default, a per-reference comparison is accomplished. That is, + * the data is in list if any element of the list points to the same + * location of data. + * A "semantic" comparison is accomplished, otherwise, if a comparator + * function has been set previously, with list_attributes_comparator(); + * in which case, the given data reference is believed to be in list iff + * comparator_fun(elementdata, userdata) == 0 for any element in the list. + * + * @param l list to operate + * @param data reference to the data to search + * @return 0 iff the list does not contain data as an element + * + * @see list_attributes_comparator() + */ +int list_contains(const list_t *restrict l, const void *data); + +/** + * concatenate two lists + * + * Concatenates one list with another, and stores the result into a + * user-provided list object, which must be different from both the + * lists to concatenate. Attributes from the original lists are not + * cloned. + * The destination list referred is threated as virgin room: if it + * is an existing list containing elements, memory leaks will happen. + * It is OK to specify the same list twice as source, for "doubling" + * it in the destination. + * + * @param l1 base list + * @param l2 list to append to the base + * @param dest reference to the destination list + * @return 0 for success, -1 for errors + */ +int list_concat(const list_t *l1, const list_t *l2, list_t *restrict dest); + +/** + * sort list elements. + * + * @warning Requires a comparator function to be set for the list. + * + * Sorts the list in ascending or descending order as specified by the versus + * flag. The algorithm chooses autonomously what algorithm is best suited for + * sorting the list wrt its current status. + * + * @param l list to operate + * @param versus positive: order small to big; negative: order big to small + * @return 0 iff sorting was successful + * + * @see list_attributes_comparator() + */ +int list_sort(list_t *restrict l, int versus); + +/** + * start an iteration session. + * + * This function prepares the list to be iterated. + * + * @param l list to operate + * @return 0 if the list cannot be currently iterated. >0 otherwise + * + * @see list_iterator_stop() + */ +int list_iterator_start(list_t *restrict l); + +/** + * return the next element in the iteration session. + * + * @param l list to operate + * @return element datum, or NULL on errors + */ +void *list_iterator_next(list_t *restrict l); + +/** + * inspect whether more elements are available in the iteration session. + * + * @param l list to operate + * @return 0 iff no more elements are available. + */ +int list_iterator_hasnext(const list_t *restrict l); + +/** + * end an iteration session. + * + * @param l list to operate + * @return 0 iff the iteration session cannot be stopped + */ +int list_iterator_stop(list_t *restrict l); + +/** + * return the hash of the current status of the list. + * + * @param l list to operate + * @param hash where the resulting hash is put + * + * @return 0 for success; <0 for failure + */ +int list_hash(const list_t *restrict l, list_hash_t *restrict hash); + +#ifndef SIMCLIST_NO_DUMPRESTORE +/** + * get meta informations on a list dump on filedescriptor. + * + * [ advanced function ] + * + * Extracts the meta information from a SimCList dump located in a file + * descriptor. The file descriptor must be open and positioned at the + * beginning of the SimCList dump block. + * + * @param fd file descriptor to get metadata from + * @param info reference to a dump metainformation structure to fill + * @return 0 for success; <0 for failure + * + * @see list_dump_filedescriptor() + */ +int list_dump_getinfo_filedescriptor(int fd, list_dump_info_t *restrict info); + +/** + * get meta informations on a list dump on file. + * + * [ advanced function ] + * + * Extracts the meta information from a SimCList dump located in a file. + * + * @param filename filename of the file to fetch from + * @param info reference to a dump metainformation structure to fill + * @return 0 for success; <0 for failure + * + * @see list_dump_filedescriptor() + */ +int list_dump_getinfo_file(const char *restrict filename, list_dump_info_t *restrict info); + +/** + * dump the list into an open, writable file descriptor. + * + * This function "dumps" the list to a persistent storage so it can be + * preserved across process terminations. + * When called, the file descriptor must be open for writing and positioned + * where the serialized data must begin. It writes its serialization of the + * list in a form which is portable across different architectures. Dump can + * be safely performed on stream-only (non seekable) descriptors. The file + * descriptor is not closed at the end of the operations. + * + * To use dump functions, either of these conditions must be satisfied: + * -# a metric function has been specified with list_attributes_copy() + * -# a serializer function has been specified with list_attributes_serializer() + * + * If a metric function has been specified, each element of the list is dumped + * as-is from memory, copying it from its pointer for its length down to the + * file descriptor. This might have impacts on portability of the dump to + * different architectures. + * + * If a serializer function has been specified, its result for each element is + * dumped to the file descriptor. + * + * + * @param l list to operate + * @param fd file descriptor to write to + * @param len location to store the resulting length of the dump (bytes), or NULL + * + * @return 0 if successful; -1 otherwise + * + * @see element_serializer() + * @see list_attributes_copy() + * @see list_attributes_serializer() + */ +int list_dump_filedescriptor(const list_t *restrict l, int fd, size_t *restrict len); + +/** + * dump the list to a file name. + * + * This function creates a filename and dumps the current content of the list + * to it. If the file exists it is overwritten. The number of bytes written to + * the file can be returned in a specified argument. + * + * @param l list to operate + * @param filename filename to write to + * @param len location to store the resulting length of the dump (bytes), or NULL + * + * @return 0 if successful; -1 otherwise + * + * @see list_attributes_copy() + * @see element_serializer() + * @see list_attributes_serializer() + * @see list_dump_filedescriptor() + * @see list_restore_file() + * + * This function stores a representation of the list + */ +int list_dump_file(const list_t *restrict l, const char *restrict filename, size_t *restrict len); + +/** + * restore the list from an open, readable file descriptor to memory. + * + * This function is the "inverse" of list_dump_filedescriptor(). It restores + * the list content from a (open, read-ready) file descriptor to memory. An + * unserializer might be needed to restore elements from the persistent + * representation back into memory-consistent format. List attributes can not + * be restored and must be set manually. + * + * @see list_dump_filedescriptor() + * @see list_attributes_serializer() + * @see list_attributes_unserializer() + * + * @param l list to restore to + * @param fd file descriptor to read from. + * @param len location to store the length of the dump read (bytes), or NULL + * @return 0 if successful; -1 otherwise + */ +int list_restore_filedescriptor(list_t *restrict l, int fd, size_t *restrict len); + +/** + * restore the list from a file name. + * + * This function restores the content of a list from a file into memory. It is + * the inverse of list_dump_file(). + * + * @see element_unserializer() + * @see list_attributes_unserializer() + * @see list_dump_file() + * @see list_restore_filedescriptor() + * + * @param l list to restore to + * @param filename filename to read data from + * @param len location to store the length of the dump read (bytes), or NULL + * @return 0 if successful; -1 otherwise + */ +int list_restore_file(list_t *restrict l, const char *restrict filename, size_t *len); +#endif + +/* ready-made comparators, meters and hash computers */ + /* comparator functions */ +/** + * ready-made comparator for int8_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_int8_t(const void *a, const void *b); + +/** + * ready-made comparator for int16_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_int16_t(const void *a, const void *b); + +/** + * ready-made comparator for int32_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_int32_t(const void *a, const void *b); + +/** + * ready-made comparator for int64_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_int64_t(const void *a, const void *b); + +/** + * ready-made comparator for uint8_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_uint8_t(const void *a, const void *b); + +/** + * ready-made comparator for uint16_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_uint16_t(const void *a, const void *b); + +/** + * ready-made comparator for uint32_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_uint32_t(const void *a, const void *b); + +/** + * ready-made comparator for uint64_t elements. + * @see list_attributes_comparator() + */ +int list_comparator_uint64_t(const void *a, const void *b); + +/** + * ready-made comparator for float elements. + * @see list_attributes_comparator() + */ +int list_comparator_float(const void *a, const void *b); + +/** + * ready-made comparator for double elements. + * @see list_attributes_comparator() + */ +int list_comparator_double(const void *a, const void *b); + +/** + * ready-made comparator for string elements. + * @see list_attributes_comparator() + */ +int list_comparator_string(const void *a, const void *b); + + /* metric functions */ +/** + * ready-made metric function for int8_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_int8_t(const void *el); + +/** + * ready-made metric function for int16_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_int16_t(const void *el); + +/** + * ready-made metric function for int32_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_int32_t(const void *el); + +/** + * ready-made metric function for int64_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_int64_t(const void *el); + +/** + * ready-made metric function for uint8_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_uint8_t(const void *el); + +/** + * ready-made metric function for uint16_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_uint16_t(const void *el); + +/** + * ready-made metric function for uint32_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_uint32_t(const void *el); + +/** + * ready-made metric function for uint64_t elements. + * @see list_attributes_copy() + */ +size_t list_meter_uint64_t(const void *el); + +/** + * ready-made metric function for float elements. + * @see list_attributes_copy() + */ +size_t list_meter_float(const void *el); + +/** + * ready-made metric function for double elements. + * @see list_attributes_copy() + */ +size_t list_meter_double(const void *el); + +/** + * ready-made metric function for string elements. + * @see list_attributes_copy() + */ +size_t list_meter_string(const void *el); + + /* hash functions */ +/** + * ready-made hash function for int8_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_int8_t(const void *el); + +/** + * ready-made hash function for int16_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_int16_t(const void *el); + +/** + * ready-made hash function for int32_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_int32_t(const void *el); + +/** + * ready-made hash function for int64_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_int64_t(const void *el); + +/** + * ready-made hash function for uint8_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_uint8_t(const void *el); + +/** + * ready-made hash function for uint16_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_uint16_t(const void *el); + +/** + * ready-made hash function for uint32_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_uint32_t(const void *el); + +/** + * ready-made hash function for uint64_t elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_uint64_t(const void *el); + +/** + * ready-made hash function for float elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_float(const void *el); + +/** + * ready-made hash function for double elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_double(const void *el); + +/** + * ready-made hash function for string elements. + * @see list_attributes_hash_computer() + */ +list_hash_t list_hashcomputer_string(const void *el); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/ccid/ccid/src/strlcpycat.h b/ccid/ccid/src/strlcpycat.h index a0f2a6d..d21f1e9 100644 --- a/ccid/ccid/src/strlcpycat.h +++ b/ccid/ccid/src/strlcpycat.h @@ -1,10 +1,10 @@ /* * MUSCLE SmartCard Development ( http://www.linuxnet.com ) * - * Copyright (C) 2004 + * Copyright (C) 2004-2010 * Ludovic Rousseau * - * $Id: strlcpycat.h 1421 2005-04-12 12:09:21Z rousseau $ + * $Id: strlcpycat.h 4974 2010-06-01 09:43:47Z rousseau $ */ /** @@ -12,7 +12,9 @@ * @brief prototypes of strlcpy()/strlcat() imported from OpenBSD */ -#ifndef HAVE_STRLCPY +#ifdef HAVE_STRLCPY +#include +#else size_t strlcpy(char *dst, const char *src, size_t siz); #endif diff --git a/ccid/ccid/src/tokenparser.c b/ccid/ccid/src/tokenparser.c index 92d6a58..cad17f2 100644 --- a/ccid/ccid/src/tokenparser.c +++ b/ccid/ccid/src/tokenparser.c @@ -395,11 +395,11 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 4, 1, 8, + 7, 7, 7, 7, 7, 7, 7, 4, 4, 8, 4, 9, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 1, 1, 1, 4, 4, 1, 11, 11, 11, 11, + 4, 1, 4, 4, 4, 1, 11, 11, 11, 11, 12, 11, 13, 11, 14, 11, 15, 11, 11, 16, 11, 11, 11, 17, 18, 19, 11, 11, 11, 11, @@ -488,38 +488,38 @@ char *yytext; * * Copyright (C) 2001-2003 * David Corcoran + * Copyright (C) 2003-2010 * Ludovic Rousseau * - * $Id: tokenparser.l 4294 2009-07-03 09:55:05Z rousseau $ + * $Id: tokenparser.l 6712 2013-08-05 19:11:47Z rousseau $ */ /** * @file - * @brief provides LTPBundleFindValueWithKey() function on non-MacOS X + * @brief provides parsing functions for Info.plist files * platforms */ -#line 20 "tokenparser.l" +#line 21 "tokenparser.l" #include "config.h" #include #include #include +#define NDEBUG +#include -#include "misc.h" -#include "debug.h" +#include "simclist.h" +#include "debuglog.h" #include "parser.h" #include "strlcpycat.h" -void tpevalToken(char *pcToken, int tokType); - -static const char *pcDesiredKey = NULL; -static char pcKey[TOKEN_MAX_KEY_SIZE]; -static char pcValue[TOKEN_MAX_VALUE_SIZE]; -static char pcFinValue[TOKEN_MAX_VALUE_SIZE]; -static int valueIndex = 0; -static int desiredIndex = 0; - +static void eval_key(char *pcToken, list_t *list_key); +static void eval_value(char *pcToken, list_t *list_values); void tperrorCheck (char *pcToken_error); +static list_t *ListKeys; +static list_t *ListValues; + +#define YY_NO_INPUT 1 #line 524 "tokenparser.c" #define INITIAL 0 @@ -805,7 +805,7 @@ YY_RULE_SETUP case 3: YY_RULE_SETUP #line 51 "tokenparser.l" -{ valueIndex = 0; tpevalToken(yytext, TOKEN_TYPE_KEY); } +{ eval_key(yytext, ListKeys); } YY_BREAK case 4: YY_RULE_SETUP @@ -815,7 +815,7 @@ YY_RULE_SETUP case 5: YY_RULE_SETUP #line 53 "tokenparser.l" -{tpevalToken(yytext, TOKEN_TYPE_STRING); valueIndex += 1;} +{ eval_value(yytext, ListValues); } YY_BREAK case 6: YY_RULE_SETUP @@ -1793,125 +1793,207 @@ void yyfree (void * ptr ) -void tpevalToken(char *pcToken, int tokType) +static void eval_key(char *pcToken, list_t *list_key) { - unsigned int len; - len = 0; + struct bundleElt *elt; + int r; + size_t len; - if (tokType == TOKEN_TYPE_KEY) - { - /* foobar - * 012345 : 5 is the first key character index */ + /* create a new list element */ + elt = malloc(sizeof(*elt)); + assert(elt); - /* calculate the argument length */ - for (len=0; pcToken[len+5] != '<'; len++) - ; - len++; /* final NULL byte */ + /* foobar + * 012345 : 5 is the first key character index */ - if (len > sizeof(pcKey)) - (void)strlcpy(pcKey, &pcToken[5], sizeof(pcKey)); - else - (void)strlcpy(pcKey, &pcToken[5], len); - } + /* calculate the argument length */ + for (len=0; pcToken[len+5] != '<'; len++) + ; + len++; /* final NULL byte */ - if (tokType == TOKEN_TYPE_STRING) - { - /* foobar - * 012345678 : 8 is the first string character index */ + elt->key = malloc(len); + (void)strlcpy(elt->key, &pcToken[5], len); - /* calculate the argument length */ - for (len=0; pcToken[len+8] != '<'; len++) - ; - len++; /* final NULL byte */ + r = list_init(&elt->values); + assert(r >= 0); + (void)r; - if (len > sizeof(pcValue)) - (void)strlcpy(pcValue, &pcToken[8], sizeof(pcValue)); - else - (void)strlcpy(pcValue, &pcToken[8], len); + /* add the key/values */ + list_append(list_key, elt); + + /* set the list to store the values */ + ListValues = &elt->values; +} + +static void eval_value(char *pcToken, list_t *list_values) +{ + int r; + size_t len; + char *value; + char *amp; + + /* foobar + * 012345678 : 8 is the first string character index */ + + /* calculate the argument length */ + for (len=0; pcToken[len+8] != '<'; len++) + ; + len++; /* final NULL byte */ + + value = malloc(len); + assert(value); + + (void)strlcpy(value, &pcToken[8], len); + + /* for all & in the string */ + amp = value; + while ((amp = strstr(amp, "&")) != NULL) + { + char *p; - if (strcmp(pcKey, pcDesiredKey) == 0) - if (desiredIndex == valueIndex) - (void)strlcpy(pcFinValue, pcValue, sizeof(pcFinValue)); + /* just skip "amp;" substring (4 letters) */ + for (p = amp+1; *(p+4); p++) + { + *p = *(p+4); + } + /* terminate the now shorter string */ + *p = '\0'; + + /* skip the & and continue */ + amp++; } + + r = list_append(list_values, value); + assert(r >= 0); + (void)r; } void tperrorCheck (char *token_error) { + (void)token_error; } /** * Find an optional key in a configuration file * No error is logged if the key is not found * + * @param l list generated by bundleParse() + * @param key searched key + * @param[out] values list of token value (if key found) + * @retval 0 OK + * @retval 1 key not found + */ +int LTPBundleFindValueWithKey(list_t *l, const char *key, list_t **values) +{ + unsigned int i; + int ret = 1; + + for (i=0; i < list_size(l); i++) + { + struct bundleElt *elt; + + elt = list_get_at(l, i); + assert(elt); + + if (0 == strcmp(elt->key, key)) + { + *values = &elt->values; + ret = 0; + } + } + + return ret; +} + + +/** + * Parse a Info.plist file and file a list + * * @param fileName file name - * @param tokenKey key value - * @param[out] tokenValue token value (if key found) - * @param tokenIndice indice of the desired key + * @param l list containing the results * @retval -1 configuration file not found * @retval 0 OK - * @retval 1 key not found */ -int LTPBundleFindOptionalValueWithKey(const char *fileName, - const char *tokenKey, char *tokenValue, int tokenIndice) +int bundleParse(const char *fileName, list_t *l) { FILE *file = NULL; - int ret = 0; - - desiredIndex = tokenIndice; - pcDesiredKey = tokenKey; - pcFinValue[0] = '\0'; + int r; +#ifndef NDEBUG + int i; +#endif file = fopen(fileName, "r"); - if (!file) + { + Log3(PCSC_LOG_CRITICAL, "Could not open bundle file %s: %s", + fileName, strerror(errno)); return 1; + } + r = list_init(l); + assert(r >= 0); + (void)r; + + ListKeys = l; yyin = file; do { (void)yylex(); } while (!feof(file)); - - if ('\0' == pcFinValue[0]) - ret = -1; - else - (void)strlcpy(tokenValue, pcFinValue, TOKEN_MAX_VALUE_SIZE); + yylex_destroy(); (void)fclose(file); - return ret; -} +#ifndef NDEBUG + printf("size: %d\n", list_size(l)); + for (i=0; i < list_size(l); i++) + { + struct bundleElt *elt; + unsigned int j; + + elt = list_get_at(l, i); + assert(elt); + printf("Key: %s\n", elt->key); + + for (j=0; jvalues); j++) + { + char *v = list_get_at(&elt->values, j); + printf(" value: %s\n", v); + } + } +#endif + + return 0; +} /** - * Find a key in a configuration file + * Free the list created by bundleParse() * - * @param fileName file name - * @param tokenKey key value - * @param[out] tokenValue token value (if key found) - * @param tokenIndice indice of the desired key - * @retval -1 configuration file not found - * @retval 0 OK - * @retval 1 key not found + * @param l list containing the results */ -int LTPBundleFindValueWithKey(const char *fileName, const char *tokenKey, - char *tokenValue, int tokenIndice) +void bundleRelease(list_t *l) { - int ret = 0; + unsigned int i; - ret = LTPBundleFindOptionalValueWithKey(fileName, tokenKey, tokenValue, - tokenIndice); + for (i=0; i < list_size(l); i++) + { + struct bundleElt *elt; + unsigned int j; - if (1 == ret) - Log3(PCSC_LOG_CRITICAL, "Could not open bundle file %s: %s", - fileName, strerror(errno)); + elt = list_get_at(l, i); + assert(elt); - if ((-1 == ret) && (0 == tokenIndice)) - /* Not defined at all */ - Log3(PCSC_LOG_CRITICAL, "Value/Key not defined for: %s in %s", - tokenKey, fileName); + /* free all the values */ + for (j=0; jvalues); j++) + free(list_get_at(&elt->values, j)); + list_destroy(&elt->values); - return ret; -} + /* free the key */ + free(elt->key); + free(elt); + } + list_destroy(l); +} diff --git a/ccid/ccid/src/tokenparser.l b/ccid/ccid/src/tokenparser.l index 4241ccc..c8d74c2 100644 --- a/ccid/ccid/src/tokenparser.l +++ b/ccid/ccid/src/tokenparser.l @@ -5,14 +5,15 @@ * * Copyright (C) 2001-2003 * David Corcoran + * Copyright (C) 2003-2010 * Ludovic Rousseau * - * $Id: tokenparser.l 4294 2009-07-03 09:55:05Z rousseau $ + * $Id: tokenparser.l 6712 2013-08-05 19:11:47Z rousseau $ */ /** * @file - * @brief provides LTPBundleFindValueWithKey() function on non-MacOS X + * @brief provides parsing functions for Info.plist files * platforms */ @@ -22,157 +23,238 @@ #include #include #include +#define NDEBUG +#include -#include "misc.h" -#include "debug.h" +#include "simclist.h" +#include "debuglog.h" #include "parser.h" #include "strlcpycat.h" -void tpevalToken(char *pcToken, int tokType); - -static const char *pcDesiredKey = NULL; -static char pcKey[TOKEN_MAX_KEY_SIZE]; -static char pcValue[TOKEN_MAX_VALUE_SIZE]; -static char pcFinValue[TOKEN_MAX_VALUE_SIZE]; -static int valueIndex = 0; -static int desiredIndex = 0; - +static void eval_key(char *pcToken, list_t *list_key); +static void eval_value(char *pcToken, list_t *list_values); void tperrorCheck (char *pcToken_error); +static list_t *ListKeys; +static list_t *ListValues; + %} %option nounput +%option noinput %option noyywrap %% #.* {} "\n" {} -\([A-Z]|[a-z]|[0-9]|[ \t])+\<\/key\> { valueIndex = 0; tpevalToken(yytext, TOKEN_TYPE_KEY); } +\([A-Z]|[a-z]|[0-9]|[ \t])+\<\/key\> { eval_key(yytext, ListKeys); } [ \t] {} -\([A-Z]|[a-z]|[0-9]|[ \t]|[!@#$%^&*()\-+/_\:?.,=~'"])+\<\/string\> {tpevalToken(yytext, TOKEN_TYPE_STRING); valueIndex += 1;} +\([A-Z]|[a-z]|[0-9]|[ \t]|[!@#$%^&*()\-+/_\:?.,=~'";\[\]])+\<\/string\> { eval_value(yytext, ListValues); } . { tperrorCheck(yytext); } %% -void tpevalToken(char *pcToken, int tokType) +static void eval_key(char *pcToken, list_t *list_key) { - unsigned int len; - len = 0; + struct bundleElt *elt; + int r; + size_t len; - if (tokType == TOKEN_TYPE_KEY) - { - /* foobar - * 012345 : 5 is the first key character index */ - - /* calculate the argument length */ - for (len=0; pcToken[len+5] != '<'; len++) - ; - len++; /* final NULL byte */ - - if (len > sizeof(pcKey)) - (void)strlcpy(pcKey, &pcToken[5], sizeof(pcKey)); - else - (void)strlcpy(pcKey, &pcToken[5], len); - } + /* create a new list element */ + elt = malloc(sizeof(*elt)); + assert(elt); + + /* foobar + * 012345 : 5 is the first key character index */ + + /* calculate the argument length */ + for (len=0; pcToken[len+5] != '<'; len++) + ; + len++; /* final NULL byte */ + + elt->key = malloc(len); + (void)strlcpy(elt->key, &pcToken[5], len); + + r = list_init(&elt->values); + assert(r >= 0); + (void)r; + + /* add the key/values */ + list_append(list_key, elt); + + /* set the list to store the values */ + ListValues = &elt->values; +} + +static void eval_value(char *pcToken, list_t *list_values) +{ + int r; + size_t len; + char *value; + char *amp; + + /* foobar + * 012345678 : 8 is the first string character index */ + + /* calculate the argument length */ + for (len=0; pcToken[len+8] != '<'; len++) + ; + len++; /* final NULL byte */ - if (tokType == TOKEN_TYPE_STRING) + value = malloc(len); + assert(value); + + (void)strlcpy(value, &pcToken[8], len); + + /* for all & in the string */ + amp = value; + while ((amp = strstr(amp, "&")) != NULL) { - /* foobar - * 012345678 : 8 is the first string character index */ - - /* calculate the argument length */ - for (len=0; pcToken[len+8] != '<'; len++) - ; - len++; /* final NULL byte */ - - if (len > sizeof(pcValue)) - (void)strlcpy(pcValue, &pcToken[8], sizeof(pcValue)); - else - (void)strlcpy(pcValue, &pcToken[8], len); - - if (strcmp(pcKey, pcDesiredKey) == 0) - if (desiredIndex == valueIndex) - (void)strlcpy(pcFinValue, pcValue, sizeof(pcFinValue)); + char *p; + + /* just skip "amp;" substring (4 letters) */ + for (p = amp+1; *(p+4); p++) + { + *p = *(p+4); + } + /* terminate the now shorter string */ + *p = '\0'; + + /* skip the & and continue */ + amp++; } + + r = list_append(list_values, value); + assert(r >= 0); + (void)r; } void tperrorCheck (char *token_error) { + (void)token_error; } /** * Find an optional key in a configuration file * No error is logged if the key is not found * + * @param l list generated by bundleParse() + * @param key searched key + * @param[out] values list of token value (if key found) + * @retval 0 OK + * @retval 1 key not found + */ +int LTPBundleFindValueWithKey(list_t *l, const char *key, list_t **values) +{ + unsigned int i; + int ret = 1; + + for (i=0; i < list_size(l); i++) + { + struct bundleElt *elt; + + elt = list_get_at(l, i); + assert(elt); + + if (0 == strcmp(elt->key, key)) + { + *values = &elt->values; + ret = 0; + } + } + + return ret; +} + + +/** + * Parse a Info.plist file and file a list + * * @param fileName file name - * @param tokenKey key value - * @param[out] tokenValue token value (if key found) - * @param tokenIndice indice of the desired key + * @param l list containing the results * @retval -1 configuration file not found * @retval 0 OK - * @retval 1 key not found */ -int LTPBundleFindOptionalValueWithKey(const char *fileName, - const char *tokenKey, char *tokenValue, int tokenIndice) +int bundleParse(const char *fileName, list_t *l) { FILE *file = NULL; - int ret = 0; - - desiredIndex = tokenIndice; - pcDesiredKey = tokenKey; - pcFinValue[0] = '\0'; + int r; +#ifndef NDEBUG + int i; +#endif file = fopen(fileName, "r"); - if (!file) + { + Log3(PCSC_LOG_CRITICAL, "Could not open bundle file %s: %s", + fileName, strerror(errno)); return 1; + } + + r = list_init(l); + assert(r >= 0); + (void)r; + ListKeys = l; yyin = file; do { (void)yylex(); } while (!feof(file)); - - if ('\0' == pcFinValue[0]) - ret = -1; - else - (void)strlcpy(tokenValue, pcFinValue, TOKEN_MAX_VALUE_SIZE); + yylex_destroy(); (void)fclose(file); - return ret; -} +#ifndef NDEBUG + printf("size: %d\n", list_size(l)); + for (i=0; i < list_size(l); i++) + { + struct bundleElt *elt; + unsigned int j; + + elt = list_get_at(l, i); + assert(elt); + printf("Key: %s\n", elt->key); + + for (j=0; jvalues); j++) + { + char *v = list_get_at(&elt->values, j); + printf(" value: %s\n", v); + } + } +#endif + + return 0; +} /** - * Find a key in a configuration file + * Free the list created by bundleParse() * - * @param fileName file name - * @param tokenKey key value - * @param[out] tokenValue token value (if key found) - * @param tokenIndice indice of the desired key - * @retval -1 configuration file not found - * @retval 0 OK - * @retval 1 key not found + * @param l list containing the results */ -int LTPBundleFindValueWithKey(const char *fileName, const char *tokenKey, - char *tokenValue, int tokenIndice) +void bundleRelease(list_t *l) { - int ret = 0; + unsigned int i; - ret = LTPBundleFindOptionalValueWithKey(fileName, tokenKey, tokenValue, - tokenIndice); + for (i=0; i < list_size(l); i++) + { + struct bundleElt *elt; + unsigned int j; - if (1 == ret) - Log3(PCSC_LOG_CRITICAL, "Could not open bundle file %s: %s", - fileName, strerror(errno)); + elt = list_get_at(l, i); + assert(elt); - if ((-1 == ret) && (0 == tokenIndice)) - /* Not defined at all */ - Log3(PCSC_LOG_CRITICAL, "Value/Key not defined for: %s in %s", - tokenKey, fileName); + /* free all the values */ + for (j=0; jvalues); j++) + free(list_get_at(&elt->values, j)); + list_destroy(&elt->values); - return ret; -} + /* free the key */ + free(elt->key); + free(elt); + } + list_destroy(l); +} diff --git a/ccid/ccid/src/towitoko/atr.c b/ccid/ccid/src/towitoko/atr.c index 25ffa85..73fe52a 100644 --- a/ccid/ccid/src/towitoko/atr.c +++ b/ccid/ccid/src/towitoko/atr.c @@ -127,9 +127,9 @@ ATR_InitFromArray (ATR_t * atr, const BYTE atr_buffer[ATR_MAX_SIZE], unsigned le TDi = atr->ib[pn][ATR_INTERFACE_BYTE_TD].value = atr_buffer[pointer]; atr->ib[pn][ATR_INTERFACE_BYTE_TD].present = TRUE; (atr->TCK).present = ((TDi & 0x0F) != ATR_PROTOCOL_TYPE_T0); + pn++; if (pn >= ATR_MAX_PROTOCOLS) return (ATR_MALFORMED); - pn++; } else { diff --git a/ccid/ccid/src/utils.c b/ccid/ccid/src/utils.c index aaa64f2..bfa0a43 100644 --- a/ccid/ccid/src/utils.c +++ b/ccid/ccid/src/utils.c @@ -1,6 +1,6 @@ /* utils.c: - Copyright (C) 2003-2004 Ludovic Rousseau + Copyright (C) 2003-2008 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,11 +18,12 @@ */ /* - * $Id: utils.c 2974 2008-05-28 18:32:52Z rousseau $ + * $Id: utils.c 5185 2010-08-26 08:58:06Z rousseau $ */ #include +#include "config.h" #include "ccid.h" #include "defs.h" #include "ccid_ifdhandler.h" diff --git a/ccid/ccid/src/utils.h b/ccid/ccid/src/utils.h index 78bf68c..3f21302 100644 --- a/ccid/ccid/src/utils.h +++ b/ccid/ccid/src/utils.h @@ -1,6 +1,6 @@ /* utils.c: - Copyright (C) 2003-2004 Ludovic Rousseau + Copyright (C) 2003-2009 Ludovic Rousseau This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,7 +18,7 @@ */ /* - * $Id: utils.h 4256 2009-06-14 11:17:00Z rousseau $ + * $Id: utils.h 4973 2010-06-01 09:43:29Z rousseau $ */ #ifndef TRUE diff --git a/ccid/ccid/ylwrap b/ccid/ccid/ylwrap index 7278b6a..8f072a8 100755 --- a/ccid/ccid/ylwrap +++ b/ccid/ccid/ylwrap @@ -1,10 +1,9 @@ #! /bin/sh # ylwrap - wrapper for lex/yacc invocations. -scriptversion=2007-11-22.22 +scriptversion=2013-01-12.17; # UTC -# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, -# 2007 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # Written by Tom Tromey . # @@ -19,9 +18,7 @@ scriptversion=2007-11-22.22 # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -32,9 +29,41 @@ scriptversion=2007-11-22.22 # bugs to or send patches to # . +get_dirname () +{ + case $1 in + */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; + # Otherwise, we want the empty string (not "."). + esac +} + +# guard FILE +# ---------- +# The CPP macro used to guard inclusion of FILE. +guard () +{ + printf '%s\n' "$1" \ + | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ + -e 's/__*/_/g' +} + +# quote_for_sed [STRING] +# ---------------------- +# Return STRING (or stdin) quoted to be used as a sed pattern. +quote_for_sed () +{ + case $# in + 0) cat;; + 1) printf '%s\n' "$1";; + esac \ + | sed -e 's|[][\\.*]|\\&|g' +} + case "$1" in '') - echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 + echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) @@ -67,41 +96,77 @@ esac # The input. -input="$1" +input=$1 shift -case "$input" in +# We'll later need for a correct munging of "#line" directives. +input_sub_rx=`get_dirname "$input" | quote_for_sed` +case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. - input="`pwd`/$input" + input=`pwd`/$input ;; esac +input_rx=`get_dirname "$input" | quote_for_sed` + +# Since DOS filename conventions don't allow two dots, +# the DOS version of Bison writes out y_tab.c instead of y.tab.c +# and y_tab.h instead of y.tab.h. Test to see if this is the case. +y_tab_nodot=false +if test -f y_tab.c || test -f y_tab.h; then + y_tab_nodot=true +fi + +# The parser itself, the first file, is the destination of the .y.c +# rule in the Makefile. +parser=$1 + +# A sed program to s/FROM/TO/g for all the FROM/TO so that, for +# instance, we rename #include "y.tab.h" into #include "parse.h" +# during the conversion from y.tab.c to parse.c. +sed_fix_filenames= -pairlist= -while test "$#" -ne 0; do - if test "$1" = "--"; then +# Also rename header guards, as Bison 2.7 for instance uses its header +# guard in its implementation file. +sed_fix_header_guards= + +while test $# -ne 0; do + if test x"$1" = x"--"; then shift break fi - pairlist="$pairlist $1" + from=$1 + # Handle y_tab.c and y_tab.h output by DOS + if $y_tab_nodot; then + case $from in + "y.tab.c") from=y_tab.c;; + "y.tab.h") from=y_tab.h;; + esac + fi shift + to=$1 + shift + sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" + sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. -prog="$1" +prog=$1 shift # Make any relative path in $prog absolute. -case "$prog" in +case $prog in [\\/]* | ?:[\\/]*) ;; - *[\\/]*) prog="`pwd`/$prog" ;; + *[\\/]*) prog=`pwd`/$prog ;; esac -# FIXME: add hostname here for parallel makes that run commands on -# other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ -trap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 +do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' +trap "ret=129; $do_exit" 1 +trap "ret=130; $do_exit" 2 +trap "ret=141; $do_exit" 13 +trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname @@ -113,98 +178,56 @@ esac ret=$? if test $ret -eq 0; then - set X $pairlist - shift - first=yes - # Since DOS filename conventions don't allow two dots, - # the DOS version of Bison writes out y_tab.c instead of y.tab.c - # and y_tab.h instead of y.tab.h. Test to see if this is the case. - y_tab_nodot="no" - if test -f y_tab.c || test -f y_tab.h; then - y_tab_nodot="yes" - fi - - # The directory holding the input. - input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` - # Quote $INPUT_DIR so we can use it in a regexp. - # FIXME: really we should care about more than `.' and `\'. - input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` - - while test "$#" -ne 0; do - from="$1" - # Handle y_tab.c and y_tab.h output by DOS - if test $y_tab_nodot = "yes"; then - if test $from = "y.tab.c"; then - from="y_tab.c" - else - if test $from = "y.tab.h"; then - from="y_tab.h" - fi - fi - fi + for from in * + do + to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, - # otherwise prepend `../'. - case "$2" in - [\\/]* | ?:[\\/]*) target="$2";; - *) target="../$2";; + # otherwise prepend '../'. + case $to in + [\\/]* | ?:[\\/]*) target=$to;; + *) target=../$to;; esac - # We do not want to overwrite a header file if it hasn't - # changed. This avoid useless recompilations. However the - # parser itself (the first file) should always be updated, - # because it is the destination of the .y.c rule in the - # Makefile. Divert the output of all other files to a temporary - # file so we can compare them to existing versions. - if test $first = no; then - realtarget="$target" - target="tmp-`echo $target | sed s/.*[\\/]//g`" + # Do not overwrite unchanged header files to avoid useless + # recompilations. Always update the parser itself: it is the + # destination of the .y.c rule in the Makefile. Divert the + # output of all other files to a temporary file so we can + # compare them to existing versions. + if test $from != $parser; then + realtarget=$target + target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi - # Edit out `#line' or `#' directives. - # - # We don't want the resulting debug information to point at - # an absolute srcdir; it is better for it to just mention the - # .y file with no path. - # - # We want to use the real output file name, not yy.lex.c for - # instance. - # - # We want the include guards to be adjusted too. - FROM=`echo "$from" | sed \ - -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ - -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` - TARGET=`echo "$2" | sed \ - -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ - -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` - - sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ - -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? - - # Check whether header files must be updated. - if test $first = no; then - if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then - echo "$2" is unchanged - rm -f "$target" - else - echo updating "$2" + + # Munge "#line" or "#" directives. Don't let the resulting + # debug information point at an absolute srcdir. Use the real + # output file name, not yy.lex.c for instance. Adjust the + # include guards too. + sed -e "/^#/!b" \ + -e "s|$input_rx|$input_sub_rx|" \ + -e "$sed_fix_filenames" \ + -e "$sed_fix_header_guards" \ + "$from" >"$target" || ret=$? + + # Check whether files must be updated. + if test "$from" != "$parser"; then + if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then + echo "$to is unchanged" + rm -f "$target" + else + echo "updating $to" mv -f "$target" "$realtarget" fi fi else - # A missing file is only an error for the first file. This - # is a blatant hack to let us support using "yacc -d". If -d - # is not specified, we don't want an error when the header - # file is "missing". - if test $first = yes; then + # A missing file is only an error for the parser. This is a + # blatant hack to let us support using "yacc -d". If -d is not + # specified, don't fail when the header file is "missing". + if test "$from" = "$parser"; then ret=1 fi fi - shift - shift - first=no done -else - ret=$? fi # Remove the directory. @@ -219,5 +242,6 @@ exit $ret # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: diff --git a/ccid/files/ForceWithoutPcsc.patch b/ccid/files/ForceWithoutPcsc.patch index cb49e4b..608d264 100644 --- a/ccid/files/ForceWithoutPcsc.patch +++ b/ccid/files/ForceWithoutPcsc.patch @@ -1,10 +1,8 @@ -diff --git src/Makefile.am src/Makefile.am -index a123374..11097de 100644 ---- src/Makefile.am -+++ src/Makefile.am -@@ -46,9 +46,7 @@ - misc.h \ - strlcpycat.h +--- src/Makefile.am 2013-10-06 12:25:18.000000000 +0200 ++++ src/Makefile.am 2013-12-09 11:06:03.000000000 +0100 +@@ -51,9 +51,7 @@ + simclist.c \ + simclist.h -if WITHOUT_PCSC PROVIDED_BY_PCSC = debug.c @@ -12,35 +10,32 @@ index a123374..11097de 100644 libccid_la_SOURCES = $(COMMON) $(USB) $(TOKEN_PARSER) $(PROVIDED_BY_PCSC) $(T1) libccid_la_LIBADD = $(LEXLIB) $(LIBUSB_LIBS) $(PTHREAD_LIBS) -diff --git src/Makefile.in src/Makefile.in -index da1333e..0595463 100644 ---- src/Makefile.in -+++ src/Makefile.in -@@ -76,7 +76,7 @@ - libccid_la-ifdhandler.lo libccid_la-utils.lo +--- src/Makefile.in 2013-11-25 19:15:26.000000000 +0100 ++++ src/Makefile.in 2013-12-09 12:19:59.000000000 +0100 +@@ -148,7 +148,7 @@ am__objects_2 = libccid_la-ccid_usb.lo - am__objects_3 = libccid_la-tokenparser.lo libccid_la-strlcpy.lo + am__objects_3 = libccid_la-tokenparser.lo libccid_la-strlcpy.lo \ + libccid_la-simclist.lo -@WITHOUT_PCSC_TRUE@am__objects_4 = libccid_la-debug.lo +am__objects_4 = libccid_la-debug.lo - am__objects_5 = libccid_la-atr.lo libccid_la-pps.lo \ - libccid_la-buffer.lo libccid_la-checksum.lo \ - libccid_la-proto-t1.lo -@@ -101,7 +101,7 @@ + am__dirstamp = $(am__leading_dot)dirstamp + am__objects_5 = towitoko/libccid_la-atr.lo towitoko/libccid_la-pps.lo \ + openct/libccid_la-buffer.lo openct/libccid_la-checksum.lo \ +@@ -178,7 +178,7 @@ am__objects_7 = libccidtwin_la-ccid_serial.lo am__objects_8 = libccidtwin_la-tokenparser.lo \ - libccidtwin_la-strlcpy.lo + libccidtwin_la-strlcpy.lo libccidtwin_la-simclist.lo -@WITHOUT_PCSC_TRUE@am__objects_9 = libccidtwin_la-debug.lo +am__objects_9 = libccidtwin_la-debug.lo - am__objects_10 = libccidtwin_la-atr.lo libccidtwin_la-pps.lo \ - libccidtwin_la-buffer.lo libccidtwin_la-checksum.lo \ - libccidtwin_la-proto-t1.lo -@@ -313,7 +313,7 @@ - misc.h \ - strlcpycat.h + am__objects_10 = towitoko/libccidtwin_la-atr.lo \ + towitoko/libccidtwin_la-pps.lo openct/libccidtwin_la-buffer.lo \ + openct/libccidtwin_la-checksum.lo \ +@@ -453,7 +453,7 @@ + simclist.c \ + simclist.h -@WITHOUT_PCSC_TRUE@PROVIDED_BY_PCSC = debug.c +PROVIDED_BY_PCSC = debug.c libccid_la_SOURCES = $(COMMON) $(USB) $(TOKEN_PARSER) $(PROVIDED_BY_PCSC) $(T1) libccid_la_LIBADD = $(LEXLIB) $(LIBUSB_LIBS) $(PTHREAD_LIBS) libccid_la_CFLAGS = $(PCSC_CFLAGS) $(LIBUSB_CFLAGS) $(PTHREAD_CFLAGS) \ - diff --git a/ccid/files/RSA_SecurID_getpasswd.c.patch b/ccid/files/RSA_SecurID_getpasswd.c.patch new file mode 100644 index 0000000..7cd4dfe --- /dev/null +++ b/ccid/files/RSA_SecurID_getpasswd.c.patch @@ -0,0 +1,65 @@ +--- ./contrib/RSA_SecurID/RSA_SecurID_getpasswd.c 2011-01-29 14:59:41.000000000 +0100 ++++ ./contrib/RSA_SecurID/RSA_SecurID_getpasswd.c 2013-12-10 09:51:48.000000000 +0100 +@@ -26,7 +26,7 @@ + #define PCSC_ERROR_EXIT(rv, text) \ + if (rv != SCARD_S_SUCCESS) \ + { \ +- printf(text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \ ++ printf(text ": %s (0x%ulX)\n", pcsc_stringify_error(rv), rv); \ + goto end; \ + } + +@@ -51,7 +51,7 @@ + rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); + if (rv != SCARD_S_SUCCESS) + { +- printf("SCardEstablishContext: Cannot Connect to Resource Manager %lX\n", rv); ++ printf("SCardEstablishContext: Cannot Connect to Resource Manager %ulX\n", rv); + return 1; + } + +@@ -101,7 +101,7 @@ + PCSC_ERROR_EXIT(rv, "SCardTransmit") + if ((length != 2) || (bRecvBuffer[0] != 0x90) || (bRecvBuffer[1] != 0x00)) + { +- printf("cmd1 failed (%ld): %02X%02X\n", length, bRecvBuffer[length-2], ++ printf("cmd1 failed (%uld): %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); + goto end; + } +@@ -113,7 +113,7 @@ + PCSC_ERROR_EXIT(rv, "SCardTransmit") + if ((length != 6) || (bRecvBuffer[4] != 0x90) || (bRecvBuffer[5] != 0x00)) + { +- printf("cmd2 failed (%ld) : %02X%02X\n", length, bRecvBuffer[length-2], ++ printf("cmd2 failed (%uld) : %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); + goto end; + } +@@ -128,7 +128,7 @@ + PCSC_ERROR_EXIT(rv, "SCardTransmit") + if ((length != 2) || (bRecvBuffer[0] != 0x90) || (bRecvBuffer[1] != 0x00)) + { +- printf("cmd3 failed (%ld): %02X%02X\n", length, bRecvBuffer[length-2], ++ printf("cmd3 failed (%uld): %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); + goto end; + } +@@ -140,7 +140,7 @@ + PCSC_ERROR_EXIT(rv, "SCardTransmit") + if ((length != 7) || (bRecvBuffer[5] != 0x90) || (bRecvBuffer[6] != 0x00)) + { +- printf("cmd4 failed (%ld): %02X%02X\n", length, bRecvBuffer[length-2], ++ printf("cmd4 failed (%uld): %02X%02X\n", length, bRecvBuffer[length-2], + bRecvBuffer[length-1]); + goto end; + } +@@ -151,7 +151,7 @@ + /* We try to leave things as clean as possible */ + rv = SCardReleaseContext(hContext); + if (rv != SCARD_S_SUCCESS) +- printf("SCardReleaseContext: %s (0x%lX)\n", pcsc_stringify_error(rv), ++ printf("SCardReleaseContext: %s (0x%ulX)\n", pcsc_stringify_error(rv), + rv); + + /* free allocated memory */ diff --git a/ccid/files/ccid-info-plist.patch b/ccid/files/ccid-info-plist.patch index dc7e448..307038a 100644 --- a/ccid/files/ccid-info-plist.patch +++ b/ccid/files/ccid-info-plist.patch @@ -1,5 +1,5 @@ ---- src/Info.plist.src 2009-07-17 09:15:52.000000000 -0700 -+++ src/Info.plist.src 2010-04-14 17:38:14.000000000 -0700 +--- src/Info.plist.src 2013-01-27 11:53:40.000000000 +0100 ++++ src/Info.plist.src 2013-08-20 12:22:41.000000000 +0200 @@ -35,7 +35,7 @@ 0x00000001 @@ -9,4 +9,3 @@ - - API - - This is the external API for applications to use. - The API is relatively lean and designed to have close analogies to the USB specification. The v0.1 API was mostly hacked together and kludged together without much forethought and as a result, it's missing quite a few features. v1.0 is intended to rectify this. - - - - Devices and interfaces - - The libusb API ties an open device to a specific interface. This means that if you want to claim multiple interfaces on a device, you should open the device multiple times to receive one usb_dev_handle for each interface you want to communicate with. Don't forget to call . - - - - Timeouts - - Timeout's in libusb are always specified in milliseconds. - - - - Data Types - - libusb uses both abstracted and non abstracted structures to maintain portability. - - - - Synchronous - - All functions in libusb v0.1 are synchronous, meaning the functions block and wait for the operation to finish or timeout before returning execution to the calling application. Asynchronous operation will be supported in v1.0, but not v0.1. - - - - Return values - - There are two types of return values used in libusb v0.1. The first is a handle returned by . The second is an int. In all cases where an int is returned, >= 0 is a success and < 0 is an error condition. - - diff --git a/libusb/libusb/Doxyfile.in b/libusb/libusb/doc/doxygen.cfg.in similarity index 71% rename from libusb/libusb/Doxyfile.in rename to libusb/libusb/doc/doxygen.cfg.in index e5d14be..128e1de 100644 --- a/libusb/libusb/Doxyfile.in +++ b/libusb/libusb/doc/doxygen.cfg.in @@ -1,4 +1,4 @@ -# Doxyfile 1.3.4 +# Doxyfile 1.5.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project @@ -14,10 +14,18 @@ # Project related configuration options #--------------------------------------------------------------------------- +# This tag specifies the encoding used for all characters in the config file that +# follow. The default is UTF-8 which is also the encoding used for all text before +# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into +# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of +# possible encodings. + +DOXYFILE_ENCODING = UTF-8 + # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. -PROJECT_NAME = libusb++ +PROJECT_NAME = libusb # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or @@ -30,29 +38,29 @@ PROJECT_NUMBER = # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = ./apidocs/ +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). @@ -67,16 +75,28 @@ BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. -ALWAYS_DETAILED_SEC = YES +ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO @@ -89,10 +109,21 @@ FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. STRIP_FROM_PATH = +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. @@ -102,11 +133,19 @@ SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explict @brief command for a brief description. +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. @@ -124,16 +163,15 @@ DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it -# reimplements. +# re-implements. INHERIT_DOCS = YES -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. -DISTRIBUTE_GROUP_DOC = NO +SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. @@ -149,20 +187,41 @@ TAB_SIZE = 4 ALIASES = -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. -OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_FOR_C = YES -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to @@ -196,7 +255,21 @@ EXTRACT_STATIC = YES # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. -EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be extracted +# and appear in the documentation as a namespace called 'anonymous_namespace{file}', +# where file will be replaced with the base name of the file that contains the anonymous +# namespace. By default anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. @@ -211,7 +284,7 @@ HIDE_UNDOC_MEMBERS = NO # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. -HIDE_UNDOC_CLASSES = YES +HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. @@ -238,7 +311,7 @@ INTERNAL_DOCS = NO # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. +# and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES @@ -266,17 +339,34 @@ INLINE_INFO = YES SORT_MEMBER_DOCS = NO +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. -GENERATE_TODOLIST = NO +GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. -GENERATE_TESTLIST = NO +GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug @@ -311,6 +401,22 @@ MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -318,7 +424,7 @@ SHOW_USED_FILES = YES # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. -QUIET = YES +QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank @@ -339,12 +445,22 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) -WARN_FORMAT = +WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written @@ -361,52 +477,56 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = @top_srcdir@/usbpp.cpp @top_srcdir@/usbpp.h +INPUT = @top_srcdir@/libusb + +# This tag can be used to specify the character encoding of the source files that +# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default +# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. +# See http://www.gnu.org/software/libiconv for the list of possible encodings. + +INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc - -FILE_PATTERNS = *.h \ - *.cpp \ - *.cc \ - *.hpp \ - *.dox \ - *.c++ \ - *.cxx \ - *.h++ \ - *.hh +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = YES +RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = +EXCLUDE = @top_srcdir@/libusb/libusbi.h -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. -EXCLUDE_SYMLINKS = YES +EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the output. +# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, +# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test -EXCLUDE_PATTERNS = *.moc.* \ - moc* \ - *.all_cpp.* \ - *unload.* \ - */test/* \ - */tests/* +EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see @@ -439,10 +559,20 @@ IMAGE_PATH = # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes -# to standard output. +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. INPUT_FILTER = +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). @@ -454,9 +584,13 @@ FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH +# then you must also enable this option. If you don't then doxygen will produce +# a warning and turn it on anyway -SOURCE_BROWSER = YES +SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. @@ -473,13 +607,28 @@ STRIP_CODE_COMMENTS = YES # then for each documented function all documented # functions referencing it will be listed. -REFERENCED_BY_RELATION = YES +REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. -REFERENCES_RELATION = YES +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for @@ -501,14 +650,14 @@ ALPHABETICAL_INDEX = YES # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) -COLS_IN_ALPHA_INDEX = 3 +COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. -IGNORE_PREFIX = K +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output @@ -523,7 +672,7 @@ GENERATE_HTML = YES # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. -HTML_OUTPUT = ./html/ +HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank @@ -535,20 +684,22 @@ HTML_FILE_EXTENSION = .html # each generated HTML page. If it is left blank doxygen will generate a # standard header. -HTML_HEADER = @top_srcdir@/apidocs/header.html +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. -HTML_FOOTER = @top_srcdir@/apidocs/footer.html +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! -HTML_STYLESHEET = @top_srcdir@/apidocs/doxygen.css +HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to @@ -563,10 +714,18 @@ HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = YES + # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be -# written to the html output dir. +# written to the html output directory. CHM_FILE = @@ -633,7 +792,7 @@ GENERATE_LATEX = NO # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. -LATEX_OUTPUT = +LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. @@ -701,7 +860,7 @@ LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimised for Word 97 and may not look very pretty with +# The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO @@ -710,7 +869,7 @@ GENERATE_RTF = NO # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. -RTF_OUTPUT = +RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to @@ -728,7 +887,7 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assigments. You only have to provide +# config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = @@ -751,12 +910,12 @@ GENERATE_MAN = NO # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. -MAN_OUTPUT = +MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) -MAN_EXTENSION = .kde3 +MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity @@ -764,7 +923,7 @@ MAN_EXTENSION = .kde3 # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. -MAN_LINKS = YES +MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output @@ -772,9 +931,7 @@ MAN_LINKS = YES # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. +# the code including all documentation. GENERATE_XML = NO @@ -796,6 +953,13 @@ XML_SCHEMA = XML_DTD = +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -856,13 +1020,13 @@ ENABLE_PREPROCESSING = YES # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. -MACRO_EXPANSION = NO +MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. +# PREDEFINED and EXPAND_AS_DEFINED tags. -EXPAND_ONLY_PREDEF = NO +EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. @@ -886,9 +1050,11 @@ INCLUDE_FILE_PATTERNS = # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. -PREDEFINED = __cplusplus +PREDEFINED = API_EXPORTED= LIBUSB_CALL= DEFAULT_VISIBILITY= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. @@ -900,13 +1066,13 @@ EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. @@ -941,37 +1107,46 @@ ALLEXTERNALS = NO # in the modules index. If set to NO, only the current project's groups will # be listed. -EXTERNAL_GROUPS = NO +EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). -PERL_PATH = +PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superceded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. CLASS_DIAGRAMS = YES +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to +# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to +# specify the directory where the mscgen tool resides. If left empty the tool is assumed to +# be found in the default search path. + +MSCGEN_PATH = + # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. -HIDE_UNDOC_RELATIONS = NO +HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) -HAVE_DOT = YES +HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and @@ -987,8 +1162,13 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + # If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similiar to the OMG's Unified Modeling +# collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO @@ -996,7 +1176,7 @@ UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. -TEMPLATE_RELATIONS = YES +TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented @@ -1012,7 +1192,7 @@ INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected @@ -1020,11 +1200,26 @@ INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO +# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. @@ -1032,7 +1227,7 @@ GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. +# found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = @@ -1042,33 +1237,41 @@ DOT_PATH = DOTFILE_DIRS = -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 800 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the number +# of direct children of the root node in a graph is already larger than +# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -MAX_DOT_GRAPH_HEIGHT = 1024 +DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. @@ -1082,7 +1285,7 @@ GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine +# Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be diff --git a/libusb/libusb/doc/examples.sgml b/libusb/libusb/doc/examples.sgml deleted file mode 100644 index 5cd778c..0000000 --- a/libusb/libusb/doc/examples.sgml +++ /dev/null @@ -1,71 +0,0 @@ - Examples - - There are some nonintuitive parts of libusb v0.1 that aren't difficult, but are probably easier to understand with some examples. - - - - Basic Examples - Before any communication can occur with a device, it needs to be found. This is accomplished by finding all of the busses and then finding all of the devices on all of the busses: - - - - After this, the application should manually loop through all of the busess and all of the devices and matching the device by whatever criteria is needed: - -next) { - struct usb_device *dev; - - for (dev = bus->devices; dev; dev = dev->next) { - /* Check if this device is a printer */ - if (dev->descriptor.bDeviceClass == 7) { - /* Open the device, claim the interface and do your processing */ - ... - } - - /* Loop through all of the configurations */ - for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { - /* Loop through all of the interfaces */ - for (i = 0; i < dev->config[c].bNumInterfaces; i++) { - /* Loop through all of the alternate settings */ - for (a = 0; a < dev->config[c].interface[i].num_altsetting; a++) { - /* Check if this interface is a printer */ - if (dev->config[c].interface[i].altsetting[a].bInterfaceClass == 7) { - /* Open the device, set the alternate setting, claim the interface and do your processing */ - ... - } - } - } - } - } - } -]]> - - - - - Examples in the source distribution - The tests directory has a program called testlibusb.c. It simply calls libusb to find all of the devices, then iterates through all of the devices and prints out the descriptor dump. It's very simple and as a result, it's of limited usefulness in itself. However, it could serve as a starting point for a new program. - - - - Other Applications - Another source of examples can be obtained from other applications. - - gPhoto uses libusb to communicate with digital still cameras. - rio500 utils uses libusb to communicate with SONICblue Rio 500 Digital Audio Player. - - - diff --git a/libusb/libusb/doc/functions.sgml b/libusb/libusb/doc/functions.sgml deleted file mode 100644 index 3ba2e7c..0000000 --- a/libusb/libusb/doc/functions.sgml +++ /dev/null @@ -1,540 +0,0 @@ - Functions - - - Core - - - These functions comprise the core of libusb. They are used by all applications that utilize libusb. - - - - - usb_init - Initialize libusb - - - Description - - - void usb_init - - - - Just like the name implies, usb_init sets up some internal structures. usb_init must be called before any other libusb functions. - - - - - - usb_find_busses - Finds all USB busses on system - - - Description - - - int usb_find_busses - - - - usb_find_busses will find all of the busses on the system. Returns the number of changes since previous call to this function (total of new busses and busses removed). - - - - - - usb_find_devices - Find all devices on all USB devices - - - Description - - - int usb_find_devices - - - - usb_find_devices will find all of the devices on each bus. This should be called after . Returns the number of changes since the previous call to this function (total of new device and devices removed). - - - - - - usb_get_busses - Return the list of USB busses found - - - Description - - - struct usb_bus *usb_get_busses - - - - usb_get_busses simply returns the value of the global variable usb_busses. This was implemented for those languages that support C calling convention and can use shared libraries, but don't support C global variables (like Delphi). - - - - - - Device operations - - This group of functions deal with the device. It allows you to open and close the device as well standard USB operations like setting the configuration, alternate settings, clearing halts and resetting the device. It also provides OS level operations such as claiming and releasing interfaces. - - - - - usb_open - Opens a USB device - - - Description - - - usb_dev_handle *usb_open - struct *usb_device dev - - - usb_open is to be used to open up a device for use. usb_open must be called before attempting to perform any operations to the device. Returns a handle used in future communication with the device. - - - - - - usb_close - Closes a USB device - - - Description - - - int usb_close - usb_dev_handle *dev - - - usb_close closes a device opened with . No further operations may be performed on the handle after usb_close is called. Returns 0 on success or < 0 on error. - - - - - - usb_set_configuration - Sets the active configuration of a device - - - Description - - - int usb_set_configuration - usb_dev_handle *dev - int configuration - - - usb_set_configuration sets the active configuration of a device. The configuration parameter is the value as specified in the descriptor field bConfigurationValue. Returns 0 on success or < 0 on error. - - - - - - usb_set_altinterface - Sets the active alternate setting of the current interface - - - Description - - - int usb_set_altinterface - usb_dev_handle *dev - int alternate - - - usb_set_altinterface sets the active alternate setting of the current interface. The alternate parameter is the value as specified in the descriptor field bAlternateSetting. Returns 0 on success or < 0 on error. - - - - - - usb_resetep - Resets state for an endpoint - - - Description - - - int usb_resetep - usb_dev_handle *dev - unsigned int ep - - - usb_resetep resets all state (like toggles) for the specified endpoint. The ep parameter is the value specified in the descriptor field bEndpointAddress. Returns 0 on success or < 0 on error. - - Deprecated - usb_resetep is deprecated. You probably want to use . - - - - - - - usb_clear_halt - Clears any halt status on an endpoint - - - Description - - - int usb_clear_halt - usb_dev_handle *dev - unsigned int ep - - - usb_clear_halt clears any halt status on the specified endpoint. The ep parameter is the value specified in the descriptor field bEndpointAddress. Returns 0 on success or < 0 on error. - - - - - - usb_reset - Resets a device - - - Description - - - int usb_reset - usb_dev_handle *dev - - - usb_reset resets the specified device by sending a RESET down the port it is connected to. Returns 0 on success or < 0 on error. - - Causes re-enumeration - After calling usb_reset, the device will need to re-enumerate and thusly, requires you to find the new device and open a new handle. The handle used to call usb_reset will no longer work. - - - - - - - usb_claim_interface - Claim an interface of a device - - - Description - - - int usb_claim_interface - usb_dev_handle *dev - int interface - - - usb_claim_interface claims the interface with the Operating System. The interface parameter is the value as specified in the descriptor field bInterfaceNumber. Returns 0 on success or < 0 on error. - - Must be called! - usb_claim_interface must be called before you perform any operations related to this interface (like , , etc). - - - - Return Codes - - - - code - description - - - - - -EBUSY - Interface is not available to be claimed - - - -ENOMEM - Insufficient memory - - - -
-
-
- - - - usb_release_interface - Releases a previously claimed interface - - - Description - - - int usb_release_interface - usb_dev_handle *dev - int interface - - - usb_release_interface releases an interface previously claimed with . The interface parameter is the value as specified in the descriptor field bInterfaceNumber. Returns 0 on success or < 0 on error. - - -
- - - Control Transfers - - This group of functions allow applications to send messages to the default control pipe. - - - - - usb_control_msg - Send a control message to a device - - - Description - - - int usb_control_msg - usb_dev_handle *dev - int requesttype - int request - int value - int index - char *bytes - int size - int timeout - - - usb_control_msg performs a control request to the default control pipe on a device. The parameters mirror the types of the same name in the USB specification. Returns number of bytes written/read or < 0 on error. - - - - - - usb_get_string - Retrieves a string descriptor from a device - - - Description - - - int usb_get_string - usb_dev_handle *dev - int index - int langid - char *buf - size_t buflen - - - usb_get_string retrieves the string descriptor specified by index and langid from a device. The string will be returned in Unicode as specified by the USB specification. Returns the number of bytes returned in buf or < 0 on error. - - - - - - usb_get_string_simple - Retrieves a string descriptor from a device using the first language - - - Description - - - int usb_get_string_simple - usb_dev_handle *dev - int index - char *buf - size_t buflen - - - usb_get_string_simple is a wrapper around usb_get_string that retrieves the string description specified by index in the first language for the descriptor and converts it into C style ASCII. Returns number of bytes returned in buf or < 0 on error. - - - - - - usb_get_descriptor - Retrieves a descriptor from a device's default control pipe - - - Description - - - int usb_get_descriptor - usb_dev_handle *dev - unsigned char type - unsigned char index - void *buf - int size - - - usb_get_descriptor retrieves a descriptor from the device identified by the type and index of the descriptor from the default control pipe. Returns number of bytes read for the descriptor or < 0 on error. - See for a function that allows the control endpoint to be specified. - - - - - - usb_get_descriptor_by_endpoint - Retrieves a descriptor from a device - - - Description - - - int usb_get_descriptor_by_endpoint - usb_dev_handle *dev - int ep - unsigned char type - unsigned char index - void *buf - int size - - - usb_get_descriptor_by_endpoint retrieves a descriptor from the device identified by the type and index of the descriptor from the control pipe identified by ep. Returns number of bytes read for the descriptor or < 0 on error. - - - - - - Bulk Transfers - - This group of functions allow applications to send and receive data via bulk pipes. - - - - - usb_bulk_write - Write data to a bulk endpoint - - - Description - - - int usb_bulk_write - usb_dev_handle *dev - int ep - char *bytes - int size - int timeout - - - usb_bulk_write performs a bulk write request to the endpoint specified by ep. Returns number of bytes written on success or < 0 on error. - - - - - - usb_bulk_read - Read data from a bulk endpoint - - - Description - - - int usb_bulk_read - usb_dev_handle *dev - int ep - char *bytes - int size - int timeout - - - usb_bulk_read performs a bulk read request to the endpoint specified by ep. Returns number of bytes read on success or < 0 on error. - - - - - - Interrupt Transfers - - This group of functions allow applications to send and receive data via interrupt pipes. - - - - - usb_interrupt_write - Write data to an interrupt endpoint - - - Description - - - int usb_interrupt_write - usb_dev_handle *dev - int ep - char *bytes - int size - int timeout - - - usb_interrupt_write performs an interrupt write request to the endpoint specified by ep. Returns number of bytes written on success or < 0 on error. - - - - - - usb_interrupt_read - Read data from a interrupt endpoint - - - Description - - - int usb_interrupt_read - usb_dev_handle *dev - int ep - char *bytes - int size - int timeout - - - usb_interrupt_read performs a interrupt read request to the endpoint specified by ep. Returns number of bytes read on success or < 0 on error. - - - - - - Non Portable - - These functions are non portable. They may expose some part of the USB API on one OS or perhaps a couple, but not all. They are all marked with the string _np at the end of the function name. - A C preprocessor macro will be defined if the function is implemented. The form is LIBUSB_HAS_ prepended to the function name, without the leading "usb_", in all caps. For example, if usb_get_driver_np is implemented, LIBUSB_HAS_GET_DRIVER_NP will be defined. - - - - - usb_get_driver_np - Get driver name bound to interface - - - Description - - - int usb_get_driver_np - usb_dev_handle *dev - int interface - char *name - int namelen - - - This function will obtain the name of the driver bound to the interface specified by the parameter interface and place it into the buffer named name limited to namelen characters. Returns 0 on success or < 0 on error. - Implemented on Linux only. - - - - - - usb_detach_kernel_driver_np - Detach kernel driver from interface - - - Description - - - int usb_detach_kernel_driver_np - usb_dev_handle *dev - int interface - - - This function will detach a kernel driver from the interface specified by parameter interface. Applications using libusb can then try claiming the interface. Returns 0 on success or < 0 on error. - Implemented on Linux only. - - - - diff --git a/libusb/libusb/doc/intro.sgml b/libusb/libusb/doc/intro.sgml deleted file mode 100644 index f7d547a..0000000 --- a/libusb/libusb/doc/intro.sgml +++ /dev/null @@ -1,17 +0,0 @@ - Introduction - - Overview - This documentation will give an overview of how the v0.1 libusb API works and relates to &usb;. Work is rapidly progressing on a newer version of libusb, to be v1.0, which will be a redesigned API and is intended to obsolete v0.1. You may want to check the libusb website to see if it is stable and recommended. - This documentation assumes that you have a good understanding of &usb; and how it works. If you don't have a good understanding of USB, it is recommended you obtain the USB v1.1 and/or v2.0 specs and read them. - libusb is geared towards &usb; 1.1, however from the perspective of libusb, &usb; 2.0 won't be a significant change for libusb - - - - Current OS support - - Linux (2.2, 2.4 and on) - FreeBSD, NetBSD and OpenBSD - Darwin/MacOS X - - - diff --git a/libusb/libusb/doc/manual.sgml b/libusb/libusb/doc/manual.sgml deleted file mode 100644 index dd51d66..0000000 --- a/libusb/libusb/doc/manual.sgml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - -USB"> -]> - - - libusb Developers Guide - - - Johannes - Erdfelt - - -