New upstream version 1.9.5
This commit is contained in:
parent
5e7e63335c
commit
8360e0e1aa
|
@ -1,3 +1,11 @@
|
||||||
|
1.9.5: Ludovic Rousseau
|
||||||
|
4 December 2021
|
||||||
|
- pcscd: autoexit even if no client connects
|
||||||
|
- Fix variable substitution in systemd units
|
||||||
|
- fix potential race conditions with powerState handling
|
||||||
|
- Add and use tag TAG_IFD_DEVICE_REMOVED
|
||||||
|
- UnitaryTests: port code to Python 3
|
||||||
|
|
||||||
1.9.4: Ludovic Rousseau
|
1.9.4: Ludovic Rousseau
|
||||||
1 October 2021
|
1 October 2021
|
||||||
- fix a memory leak when libusb is used for hotplug (i.e. non-Linux
|
- fix a memory leak when libusb is used for hotplug (i.e. non-Linux
|
||||||
|
|
503
ChangeLog.git
503
ChangeLog.git
|
@ -1,4 +1,503 @@
|
||||||
commit baa02edd1fb47c18b6bb7dfe79b2b38390271ce6 (HEAD -> master, zotac/master)
|
commit d92b5d4fad5dea95ce8d12fac07fe1eec2150ad1 (HEAD -> master)
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Dec 4 13:16:36 2021 +0100
|
||||||
|
|
||||||
|
Release 1.9.5
|
||||||
|
|
||||||
|
Signed-off-by: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
|
||||||
|
ChangeLog | 8 ++++++++
|
||||||
|
configure.ac | 2 +-
|
||||||
|
2 files changed, 9 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit e098afc1bfe46acc74102a5e8d2b2cd14c785445
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Dec 4 13:26:26 2021 +0100
|
||||||
|
|
||||||
|
etc/: remove systemd unit files on clean
|
||||||
|
|
||||||
|
Fix 'make distcheck'
|
||||||
|
ERROR: files left in build directory after distclean:
|
||||||
|
./etc/pcscd.socket
|
||||||
|
./etc/pcscd.service
|
||||||
|
make[1]: *** [Makefile:732 : distcleancheck] Erreur 1
|
||||||
|
|
||||||
|
etc/Makefile.am | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
commit 2f970328ec14b20fdef01e3816df6c88d00e3a90
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Dec 4 13:23:53 2021 +0100
|
||||||
|
|
||||||
|
etc/: add pcscd.{service,socket}.in in archive
|
||||||
|
|
||||||
|
We must distribute the *.in files
|
||||||
|
|
||||||
|
etc/Makefile.am | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
commit 4b39499ac201116a90dee5151dcc7b5af6ac153d (origin/master, origin/HEAD, github/master)
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Dec 4 12:46:18 2021 +0100
|
||||||
|
|
||||||
|
Improve handling of files etc/pcscd.{service,socket}.in
|
||||||
|
|
||||||
|
Use the same code template from https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.70/html_node/Installation-Directory-Variables.html#index-sysconfdir-1
|
||||||
|
|
||||||
|
The substitution now also works if ./configure is called again with a
|
||||||
|
different --prefix= value.
|
||||||
|
|
||||||
|
Thanks to Kirill Elagin for the initial patch
|
||||||
|
" [Pcsclite-muscle] Incorrect use of Autoconf to expand variables in
|
||||||
|
plaintext files "
|
||||||
|
http://lists.infradead.org/pipermail/pcsclite-muscle/2021-December/001215.html
|
||||||
|
|
||||||
|
Hello,
|
||||||
|
|
||||||
|
First, here is a concrete instance of this issue. In pcsclite 1.9.2
|
||||||
|
`EnvironmentFile=` was added to the `etc/pcscd.service.in` file. If
|
||||||
|
you look at a machine that has this (or newer) version installed, you
|
||||||
|
will find in `/etc/systemd/system/pcscd.service` this line:
|
||||||
|
|
||||||
|
```
|
||||||
|
EnvironmentFile=-${prefix}/etc/default/pcscd
|
||||||
|
```
|
||||||
|
|
||||||
|
It results in the following error reported to the system journal:
|
||||||
|
|
||||||
|
```
|
||||||
|
systemd[1]: /etc/systemd/system/pcscd.service:9: EnvironmentFile= path
|
||||||
|
is not absolute, ignoring: ${prefix}/etc/default/pcscd
|
||||||
|
```
|
||||||
|
|
||||||
|
The root cause is that `AC_CONFIG_FILES` is used, arguably somewhat
|
||||||
|
incorrectly, to replace all kinds of variables in all kinds of files,
|
||||||
|
while it is meant to only list makefiles. Quite often, this is not a
|
||||||
|
problem, since those variables just get replaced by correct values and
|
||||||
|
that’s it, however some variables do not get expanded fully, for
|
||||||
|
example, the @sysconfdir@ variable used in `pcscd.service.in` is
|
||||||
|
replaced with literal `${prefix}/etc` by default as can be seen above.
|
||||||
|
|
||||||
|
As [Autoconf documentation](https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.70/html_node/Installation-Directory-Variables.html#Installation-Directory-Variables)
|
||||||
|
explains, this is done intentionally – literal `${prefix}` is used as
|
||||||
|
part of the replacement value since @sysconfdir@ is supposed to be
|
||||||
|
used only in makefiles where it will be processed by Make. The
|
||||||
|
documentation explicitly calls out this practice:
|
||||||
|
|
||||||
|
“A corollary is that you should not use these variables except in makefiles.”
|
||||||
|
|
||||||
|
“Similarly, you should not rely on AC_CONFIG_FILES to replace bindir
|
||||||
|
and friends in your shell scripts and other files.”
|
||||||
|
|
||||||
|
Then it goes on to give an example of how a full replacement can be
|
||||||
|
achieved with the help of Make and sed, however I am not exactly sure
|
||||||
|
if this is a standard practice or if there is a better solution these
|
||||||
|
days.
|
||||||
|
|
||||||
|
In addition to that, pcsc-lite (ab)uses `AC_CONFIG_FILES` to replace
|
||||||
|
variables in some other files too, however this does not cause
|
||||||
|
problems since, as far as I can tell, all of those variables are of
|
||||||
|
the kind that gets expanded fully – with one notable exception: the
|
||||||
|
variables used in `src/libpcsclite.pc.in` are also not being expanded
|
||||||
|
fully, so they remain in the generated file, however, luckily, .pc
|
||||||
|
files allow references to other variables defined in the same file and
|
||||||
|
due to a convenient coincidence the names of the variables used by
|
||||||
|
`./configure` and defined in the `libpcsclite.pc` match. I don’t know,
|
||||||
|
I mean, this still sounds a little fragile to me and I think it would
|
||||||
|
be better to switch to some more robust solution.
|
||||||
|
|
||||||
|
Cheers,
|
||||||
|
Kirill
|
||||||
|
|
||||||
|
etc/Makefile.am | 14 ++++++++++++--
|
||||||
|
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
commit 88ec131029ba9648a63ca072004e90414d10647e
|
||||||
|
Author: Kirill Elagin <kirelagin@gmail.com>
|
||||||
|
Date: Fri Dec 3 22:55:10 2021 -0500
|
||||||
|
|
||||||
|
Fix variable substitution in systemd units
|
||||||
|
|
||||||
|
Before this change, Autoconf was used to subsitute variables, including
|
||||||
|
@sysconfdir@, in systemd unit files. This is not how Autoconf should be
|
||||||
|
used and had an unintended negative consequence: the @sysconfdir@
|
||||||
|
variable was not fully expanded, so literal `${prefix}/etc` was ending up
|
||||||
|
in the pcscd.service file, where it was invalid.
|
||||||
|
|
||||||
|
Use sed to perform the subsitution from within the makefile where the
|
||||||
|
variables get expanded fully. This seems to be the standard approach
|
||||||
|
recommended by Autoconf documentation and used in various projects.
|
||||||
|
|
||||||
|
Also, remove the `SCRIPT_IN_FILES` variable from the makefile, which was
|
||||||
|
not used and seems to be a copy-paste from some other project.
|
||||||
|
|
||||||
|
configure.ac | 2 --
|
||||||
|
etc/Makefile.am | 12 ++++++++----
|
||||||
|
2 files changed, 8 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
commit e1b1590c7f32e0353404967f457643d122367772
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 27 16:32:31 2021 +0100
|
||||||
|
|
||||||
|
SCardDisconnect: Use RFGetPowerState
|
||||||
|
|
||||||
|
The fix in 0cf804f99c588e7abc5cd42f42b9582df5e8fb17 was not complete.
|
||||||
|
|
||||||
|
src/winscard.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 0cf804f99c588e7abc5cd42f42b9582df5e8fb17
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 27 15:28:10 2021 +0100
|
||||||
|
|
||||||
|
Use RFGetPowerState & RFSetPowerState
|
||||||
|
|
||||||
|
This will help fix potential race conditions.
|
||||||
|
|
||||||
|
I was not able to generate a problem using ThreadSanitizer but that is
|
||||||
|
not a proof that the code is correct
|
||||||
|
https://clang.llvm.org/docs/ThreadSanitizer.html
|
||||||
|
|
||||||
|
Thanks to andrei-datcu for the patch
|
||||||
|
"No data races in EHStatusHandlerThread #112"
|
||||||
|
https://github.com/LudovicRousseau/PCSC/pull/112
|
||||||
|
|
||||||
|
src/eventhandler.c | 12 ++++++------
|
||||||
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
commit c6aba284be54b5d166f638511f916ad3f8f2f897
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 27 15:16:02 2021 +0100
|
||||||
|
|
||||||
|
SCardReconnect: use RFSetPowerState() and factorize code
|
||||||
|
|
||||||
|
src/winscard.c | 4 +---
|
||||||
|
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||||
|
|
||||||
|
commit 46ded0cf6afb0030cd83dae6cf071a48daee6a0f
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 27 15:05:16 2021 +0100
|
||||||
|
|
||||||
|
Add RFGetPowerState() & RFSetPowerState() functions
|
||||||
|
|
||||||
|
These 2 functions get & set the card power state and guard the operation
|
||||||
|
between lock/unlock of the powerState_lock mutex.
|
||||||
|
|
||||||
|
This will help fix potential race conditions
|
||||||
|
|
||||||
|
Thanks to andrei-datcu for the patch
|
||||||
|
"No data races in EHStatusHandlerThread #112"
|
||||||
|
https://github.com/LudovicRousseau/PCSC/pull/112
|
||||||
|
|
||||||
|
src/readerfactory.c | 15 +++++++++++++++
|
||||||
|
src/readerfactory.h | 2 ++
|
||||||
|
2 files changed, 17 insertions(+)
|
||||||
|
|
||||||
|
commit 9b6b667260228b797ac5af5479bdf7a3045ae389
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 13 18:18:29 2021 +0100
|
||||||
|
|
||||||
|
Fix typo in comment
|
||||||
|
|
||||||
|
src/pcscdaemon.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 6f55e47728bbe96100aee0cb4d405d1d32dbf14c
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 13 18:13:15 2021 +0100
|
||||||
|
|
||||||
|
pcscdaemon: autoexit even if no client connects
|
||||||
|
|
||||||
|
pcscd will now auto exit even if no PC/SC client has connected.
|
||||||
|
The idea is to auto exit if pcscd is restarted after an upgrade or a new
|
||||||
|
driver installation. In that case pcscd is NOT strated by a new client
|
||||||
|
so the alarm is not set the client disconnect.
|
||||||
|
|
||||||
|
If you use something like "service pcscd restart" to restart pcscd then
|
||||||
|
it will exit after 60 seconds (if no client uses it).
|
||||||
|
|
||||||
|
src/pcscdaemon.c | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
commit 7d3379ed4ed51b3fb7f5237bba6c26e2705995fa
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 13 17:58:07 2021 +0100
|
||||||
|
|
||||||
|
Fix typo in comment
|
||||||
|
|
||||||
|
src/pcscdaemon.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit acd76b194b16776dcd3bb447ccfbbd4e0ce703c8
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sat Nov 13 17:57:19 2021 +0100
|
||||||
|
|
||||||
|
Fix typo in comment
|
||||||
|
|
||||||
|
src/pcscdaemon.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit d81489a7b2f34d368e99b687466b01ad5939b50a
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Fri Nov 12 17:04:40 2021 +0100
|
||||||
|
|
||||||
|
c.sh: /lib is now a symbolic link to /usr/lib on GNU/Linux
|
||||||
|
|
||||||
|
See https://www.freedesktop.org/wiki/Software/systemd/TheCaseForTheUsrMerge/
|
||||||
|
|
||||||
|
c.sh | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 76d2f91b88857dc955c888da965ccda4145d236e
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 21:17:04 2021 +0100
|
||||||
|
|
||||||
|
transmit_card_removed: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'sleep' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/transmit_card_removed.py | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 21792d6d83e1f1d62f8554aa715265909d63ce53
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:40:11 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange: port to Python 3
|
||||||
|
|
||||||
|
.../SCardGetStatusChange/SCardGetStatusChange.py | 32 +++++++++++-----------
|
||||||
|
1 file changed, 16 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
commit 5d253fb86a5f096e9885d06b2a1de3ce13fe9ef2
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:38:35 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'sys' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/SCardGetStatusChange/SCardGetStatusChange.py | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
commit 1dd791ea98c38636208c4cc4222f1025fc9f92ac
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:37:54 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange_PnP: port to Python 3
|
||||||
|
|
||||||
|
.../SCardGetStatusChange_PnP.py | 36 +++++++++++-----------
|
||||||
|
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
commit 9be58fdca0cf6e173ebb68717d690ca05a983e01
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:09:34 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange_PnP: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'sys' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/SCardGetStatusChange/SCardGetStatusChange_PnP.py | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
commit 68cc8fb154d9c515b07b0ab0b3766d6a34b28211
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:08:33 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange_loop: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'sys' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/SCardGetStatusChange/SCardGetStatusChange_loop.py | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
commit 650bfac39f43e5608618919a8f03b49b6da4e9a9
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:05:43 2021 +0100
|
||||||
|
|
||||||
|
ThreadSafeConnect: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'SCardGetErrorMessage' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/ThreadSafeConnect.py | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 390d49b45207614c5682a44f452fae89ba4c56ea
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:03:48 2021 +0100
|
||||||
|
|
||||||
|
SCardBeginTransaction_Reset: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'sleep' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/SCardBeginTransaction_Reset.py | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
commit 2dd7849c489a349665ac4f66b6b98e3426fb6cdc
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 19:02:40 2021 +0100
|
||||||
|
|
||||||
|
FEATURE_CCID_ESC_COMMAND_Gemalto_features: remove unused import
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Import of 'PCSCv2_PART10_PROPERTY_wIdProduct' is not used.
|
||||||
|
Import of 'PCSCv2_PART10_PROPERTY_wIdVendor' is not used.
|
||||||
|
|
||||||
|
UnitaryTests/FEATURE_CCID_ESC_COMMAND_Gemalto_features.py | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
commit b0ba6757ff14d716bbff3eed1f08b674f456857e
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Nov 7 18:58:33 2021 +0100
|
||||||
|
|
||||||
|
control_switch_interface: catch a specific exception
|
||||||
|
|
||||||
|
Fix lgtm.com recommendation:
|
||||||
|
Except block directly handles BaseException.
|
||||||
|
|
||||||
|
UnitaryTests/control_switch_interface.py | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit abaab9636c4460fe3c82ac58881fee9e1a54b003
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Wed Nov 3 19:05:48 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange_loop: handle KeyboardInterrupt
|
||||||
|
|
||||||
|
Catch the KeyboardInterrupt exception and cleanly disconnect and exit
|
||||||
|
|
||||||
|
.../SCardGetStatusChange_loop.py | 37 +++++++++++-----------
|
||||||
|
1 file changed, 19 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
commit 9519ad6c89b260d6d4b0a7303da3186e7fd94566
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Wed Nov 3 19:04:20 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange_loop: make the code more explicit
|
||||||
|
|
||||||
|
Use True instead of 1
|
||||||
|
|
||||||
|
UnitaryTests/SCardGetStatusChange/SCardGetStatusChange_loop.py | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 2c613018f3d60c497593d8bc4a66d78e25990e47
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Wed Nov 3 18:22:42 2021 +0100
|
||||||
|
|
||||||
|
SCardGetStatusChange_loop: port to Python 3
|
||||||
|
|
||||||
|
.../SCardGetStatusChange_loop.py | 36 +++++++++++-----------
|
||||||
|
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
commit d47c15727c37e1b5e63a0d5b29394b41f84d791d
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Wed Nov 3 18:16:10 2021 +0100
|
||||||
|
|
||||||
|
transmit_loop: handle KeyboardInterrupt
|
||||||
|
|
||||||
|
Catch the KeyboardInterrupt exception and cleanly disconnect and exit
|
||||||
|
|
||||||
|
UnitaryTests/transmit_loop.py | 17 +++++++++--------
|
||||||
|
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
commit 61cd3872bb8aba49ffa357722e753caec80db117
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Wed Nov 3 18:14:16 2021 +0100
|
||||||
|
|
||||||
|
transmit_loop: make the code more explicit
|
||||||
|
|
||||||
|
Use True instead of 1
|
||||||
|
|
||||||
|
UnitaryTests/transmit_loop.py | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
commit 91da0d5dd94b08fd5840c5c04e5a8b3b9e3b019a
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Oct 10 17:11:23 2021 +0200
|
||||||
|
|
||||||
|
Update README_INTERNALS.txt
|
||||||
|
|
||||||
|
Remove now incorrect text.
|
||||||
|
|
||||||
|
src/README_INTERNALS.txt | 35 -----------------------------------
|
||||||
|
1 file changed, 35 deletions(-)
|
||||||
|
|
||||||
|
commit 6f8f170db3c88c59a5ddb5ae5319b921a901a6aa
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Oct 10 17:05:13 2021 +0200
|
||||||
|
|
||||||
|
Remove unmaintained hotplug_linux.c
|
||||||
|
|
||||||
|
This hotplug mechanism should not be used anymore.
|
||||||
|
For example the directory "/proc/bus/usb" used to scan the USB bus does
|
||||||
|
not exist anymore on my Debian Bullseye system.
|
||||||
|
|
||||||
|
src/Makefile.am | 1 -
|
||||||
|
src/README_INTERNALS.txt | 1 -
|
||||||
|
src/hotplug_linux.c | 472 -----------------------------------------------
|
||||||
|
3 files changed, 474 deletions(-)
|
||||||
|
|
||||||
|
commit ed97272cf2d5f5e45e4af9b1bd86d529cadabbf1
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Oct 10 16:57:47 2021 +0200
|
||||||
|
|
||||||
|
Use REMOVE_READER_FLAG_REMOVED for the other hotplug variants
|
||||||
|
|
||||||
|
- hotplug_libusb.c is used on non-Linux systems like *BSD
|
||||||
|
- hotplug_macosx.c is for macOS only but should not be used
|
||||||
|
|
||||||
|
src/hotplug_libusb.c | 2 +-
|
||||||
|
src/hotplug_macosx.c | 3 ++-
|
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
commit c5a47f7e713de9c70deb7382de13c91966684eed
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Oct 10 16:45:08 2021 +0200
|
||||||
|
|
||||||
|
Use TAG_IFD_DEVICE_REMOVED when the reader is removed
|
||||||
|
|
||||||
|
When a USB reader is removed then use the new IFD Handler tag
|
||||||
|
TAG_IFD_DEVICE_REMOVED to signal the fact to the driver.
|
||||||
|
|
||||||
|
RFRemoveReader() has a new "flags" parameter.
|
||||||
|
By default the value REMOVE_READER_NO_FLAG is used.
|
||||||
|
|
||||||
|
When the libudev hotplug mechanism detects that a USB device has been
|
||||||
|
removed then RFRemoveReader() is called with REMOVE_READER_FLAG_REMOVED.
|
||||||
|
RFRemoveReader() will then use TAG_IFD_DEVICE_REMOVED to tell the
|
||||||
|
driver that the device has been removed and that no communication with
|
||||||
|
the device should occur.
|
||||||
|
|
||||||
|
src/hotplug_libudev.c | 2 +-
|
||||||
|
src/readerfactory.c | 35 +++++++++++++++++++++++++++--------
|
||||||
|
src/readerfactory.h | 5 ++++-
|
||||||
|
3 files changed, 32 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
commit ba516815edbd838fa8d0dc45691c8fec0d8c4fc3
|
||||||
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
|
Date: Sun Oct 10 16:37:16 2021 +0200
|
||||||
|
|
||||||
|
Add tag TAG_IFD_DEVICE_REMOVED
|
||||||
|
|
||||||
|
This tag is used to tell the driver that the reader has been detected
|
||||||
|
removed. So the driver do not try to talk to the device since that will
|
||||||
|
fails.
|
||||||
|
|
||||||
|
The idea is to avoid error messages in the logs like:
|
||||||
|
00000000 [140611055253248] ccid_usb.c:871:WriteUSB() write failed (1/12): -4 LIBUSB_ERROR_NO_DEVICE
|
||||||
|
00000692 [140611271165696] ccid_usb.c:871:WriteUSB() write failed (1/12): -4 LIBUSB_ERROR_NO_DEVICE
|
||||||
|
when the device is removed and pcscd tells the driver to close the
|
||||||
|
connection.
|
||||||
|
|
||||||
|
src/PCSC/ifdhandler.h | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
commit baa02edd1fb47c18b6bb7dfe79b2b38390271ce6 (tag: 1.9.4)
|
||||||
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
Date: Fri Oct 1 17:40:31 2021 +0200
|
Date: Fri Oct 1 17:40:31 2021 +0200
|
||||||
|
|
||||||
|
@ -38,7 +537,7 @@ Date: Fri Oct 1 17:46:55 2021 +0200
|
||||||
configure.ac | 2 --
|
configure.ac | 2 --
|
||||||
1 file changed, 2 deletions(-)
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
commit a79e1d8409befc6ae0e6d77c0ff47a24f1bb31c3 (origin/master, origin/HEAD, github/master)
|
commit a79e1d8409befc6ae0e6d77c0ff47a24f1bb31c3
|
||||||
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
Date: Fri Oct 1 16:51:49 2021 +0200
|
Date: Fri Oct 1 16:51:49 2021 +0200
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Makefile.in generated by automake 1.16.4 from Makefile.am.
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# generated automatically by aclocal 1.16.4 -*- Autoconf -*-
|
# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2021 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
@ -891,7 +891,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||||
[am__api_version='1.16'
|
[am__api_version='1.16'
|
||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
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.
|
dnl require some minimum version. Point them to the right macro.
|
||||||
m4_if([$1], [1.16.4], [],
|
m4_if([$1], [1.16.5], [],
|
||||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -907,7 +907,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
|
||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||||
[AM_AUTOMAKE_VERSION([1.16.4])dnl
|
[AM_AUTOMAKE_VERSION([1.16.5])dnl
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||||
|
@ -1344,6 +1344,10 @@ m4_defn([AC_PROG_CC])
|
||||||
# release and drop the old call support.
|
# release and drop the old call support.
|
||||||
AC_DEFUN([AM_INIT_AUTOMAKE],
|
AC_DEFUN([AM_INIT_AUTOMAKE],
|
||||||
[AC_PREREQ([2.65])dnl
|
[AC_PREREQ([2.65])dnl
|
||||||
|
m4_ifdef([_$0_ALREADY_INIT],
|
||||||
|
[m4_fatal([$0 expanded multiple times
|
||||||
|
]m4_defn([_$0_ALREADY_INIT]))],
|
||||||
|
[m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
|
||||||
dnl Autoconf wants to disallow AM_ names. We explicitly allow
|
dnl Autoconf wants to disallow AM_ names. We explicitly allow
|
||||||
dnl the ones we care about.
|
dnl the ones we care about.
|
||||||
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
|
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.71 for pcsc-lite 1.9.4.
|
# Generated by GNU Autoconf 2.71 for pcsc-lite 1.9.5.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
|
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
|
||||||
|
@ -618,8 +618,8 @@ MAKEFLAGS=
|
||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='pcsc-lite'
|
PACKAGE_NAME='pcsc-lite'
|
||||||
PACKAGE_TARNAME='pcsc-lite'
|
PACKAGE_TARNAME='pcsc-lite'
|
||||||
PACKAGE_VERSION='1.9.4'
|
PACKAGE_VERSION='1.9.5'
|
||||||
PACKAGE_STRING='pcsc-lite 1.9.4'
|
PACKAGE_STRING='pcsc-lite 1.9.5'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL=''
|
PACKAGE_URL=''
|
||||||
|
|
||||||
|
@ -1422,7 +1422,7 @@ if test "$ac_init_help" = "long"; then
|
||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# 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.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures pcsc-lite 1.9.4 to adapt to many kinds of systems.
|
\`configure' configures pcsc-lite 1.9.5 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
@ -1493,7 +1493,7 @@ fi
|
||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of pcsc-lite 1.9.4:";;
|
short | recursive ) echo "Configuration of pcsc-lite 1.9.5:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
|
@ -1646,7 +1646,7 @@ fi
|
||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
pcsc-lite configure 1.9.4
|
pcsc-lite configure 1.9.5
|
||||||
generated by GNU Autoconf 2.71
|
generated by GNU Autoconf 2.71
|
||||||
|
|
||||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||||
|
@ -2062,7 +2062,7 @@ cat >config.log <<_ACEOF
|
||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by pcsc-lite $as_me 1.9.4, which was
|
It was created by pcsc-lite $as_me 1.9.5, which was
|
||||||
generated by GNU Autoconf 2.71. Invocation command line was
|
generated by GNU Autoconf 2.71. Invocation command line was
|
||||||
|
|
||||||
$ $0$ac_configure_args_raw
|
$ $0$ac_configure_args_raw
|
||||||
|
@ -3333,7 +3333,7 @@ fi
|
||||||
|
|
||||||
# Define the identity of the package.
|
# Define the identity of the package.
|
||||||
PACKAGE='pcsc-lite'
|
PACKAGE='pcsc-lite'
|
||||||
VERSION='1.9.4'
|
VERSION='1.9.5'
|
||||||
|
|
||||||
|
|
||||||
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
|
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
|
||||||
|
@ -16531,7 +16531,7 @@ PCSCLITE_FEATURES: ${PCSCLITE_FEATURES}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Write Makefiles
|
# Write Makefiles
|
||||||
ac_config_files="$ac_config_files Makefile doc/Makefile doc/doxygen.conf doc/pcscd.8 doc/reader.conf.5 doc/example/Makefile etc/Makefile etc/pcscd.service etc/pcscd.socket src/Makefile src/libpcsclite.pc src/pcscd.h src/PCSC/pcsclite.h src/spy/Makefile"
|
ac_config_files="$ac_config_files Makefile doc/Makefile doc/doxygen.conf doc/pcscd.8 doc/reader.conf.5 doc/example/Makefile etc/Makefile src/Makefile src/libpcsclite.pc src/pcscd.h src/PCSC/pcsclite.h src/spy/Makefile"
|
||||||
|
|
||||||
cat >confcache <<\_ACEOF
|
cat >confcache <<\_ACEOF
|
||||||
# This file is a shell script that caches the results of configure
|
# This file is a shell script that caches the results of configure
|
||||||
|
@ -17081,7 +17081,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by pcsc-lite $as_me 1.9.4, which was
|
This file was extended by pcsc-lite $as_me 1.9.5, which was
|
||||||
generated by GNU Autoconf 2.71. Invocation command line was
|
generated by GNU Autoconf 2.71. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
|
@ -17149,7 +17149,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config='$ac_cs_config_escaped'
|
ac_cs_config='$ac_cs_config_escaped'
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
pcsc-lite config.status 1.9.4
|
pcsc-lite config.status 1.9.5
|
||||||
configured by $0, generated by GNU Autoconf 2.71,
|
configured by $0, generated by GNU Autoconf 2.71,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
@ -17571,8 +17571,6 @@ do
|
||||||
"doc/reader.conf.5") CONFIG_FILES="$CONFIG_FILES doc/reader.conf.5" ;;
|
"doc/reader.conf.5") CONFIG_FILES="$CONFIG_FILES doc/reader.conf.5" ;;
|
||||||
"doc/example/Makefile") CONFIG_FILES="$CONFIG_FILES doc/example/Makefile" ;;
|
"doc/example/Makefile") CONFIG_FILES="$CONFIG_FILES doc/example/Makefile" ;;
|
||||||
"etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;;
|
"etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;;
|
||||||
"etc/pcscd.service") CONFIG_FILES="$CONFIG_FILES etc/pcscd.service" ;;
|
|
||||||
"etc/pcscd.socket") CONFIG_FILES="$CONFIG_FILES etc/pcscd.socket" ;;
|
|
||||||
"src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
|
"src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
|
||||||
"src/libpcsclite.pc") CONFIG_FILES="$CONFIG_FILES src/libpcsclite.pc" ;;
|
"src/libpcsclite.pc") CONFIG_FILES="$CONFIG_FILES src/libpcsclite.pc" ;;
|
||||||
"src/pcscd.h") CONFIG_FILES="$CONFIG_FILES src/pcscd.h" ;;
|
"src/pcscd.h") CONFIG_FILES="$CONFIG_FILES src/pcscd.h" ;;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
|
|
||||||
AC_INIT([pcsc-lite],[1.9.4])
|
AC_INIT([pcsc-lite],[1.9.5])
|
||||||
AC_CONFIG_SRCDIR(src/pcscdaemon.c)
|
AC_CONFIG_SRCDIR(src/pcscdaemon.c)
|
||||||
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
|
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
@ -461,8 +461,6 @@ doc/pcscd.8
|
||||||
doc/reader.conf.5
|
doc/reader.conf.5
|
||||||
doc/example/Makefile
|
doc/example/Makefile
|
||||||
etc/Makefile
|
etc/Makefile
|
||||||
etc/pcscd.service
|
|
||||||
etc/pcscd.socket
|
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libpcsclite.pc
|
src/libpcsclite.pc
|
||||||
src/pcscd.h
|
src/pcscd.h
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Makefile.in generated by automake 1.16.4 from Makefile.am.
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Makefile.in generated by automake 1.16.4 from Makefile.am.
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
|
|
@ -1,9 +1,29 @@
|
||||||
if HAVE_SYSTEMD
|
if HAVE_SYSTEMD
|
||||||
SCRIPT_IN_FILES = \
|
EXTRA_DIST = \
|
||||||
pcscd.service.in \
|
pcscd.service.in \
|
||||||
pcscd.socket.in
|
pcscd.socket.in
|
||||||
|
|
||||||
systemdsystemunit_DATA = \
|
systemdsystemunit_DATA = \
|
||||||
pcscd.service \
|
pcscd.service \
|
||||||
pcscd.socket
|
pcscd.socket
|
||||||
|
|
||||||
|
CLEANFILES = $(systemdsystemunit_DATA)
|
||||||
|
|
||||||
|
edit = sed \
|
||||||
|
-e 's|@sysconfdir[@]|$(sysconfdir)|g' \
|
||||||
|
-e 's|@sbindir_exp[@]|$(sbindir_exp)|g' \
|
||||||
|
-e 's|@ipcdir[@]|$(ipcdir)|g'
|
||||||
|
|
||||||
|
$(systemdsystemunit_DATA): Makefile
|
||||||
|
rm -f $@ $@.tmp
|
||||||
|
srcdir=''; \
|
||||||
|
test -f ./$@.in || srcdir=$(srcdir)/; \
|
||||||
|
$(edit) $${srcdir}$@.in >$@.tmp
|
||||||
|
chmod +x $@.tmp
|
||||||
|
chmod a-w $@.tmp
|
||||||
|
mv $@.tmp $@
|
||||||
|
|
||||||
|
pcscd.service: $(srcdir)/pcscd.service.in
|
||||||
|
pcscd.socket: $(srcdir)/pcscd.socket.in
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Makefile.in generated by automake 1.16.4 from Makefile.am.
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
@ -99,7 +99,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
CONFIG_CLEAN_FILES = pcscd.service pcscd.socket
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
@ -150,8 +150,7 @@ am__uninstall_files_from_dir = { \
|
||||||
am__installdirs = "$(DESTDIR)$(systemdsystemunitdir)"
|
am__installdirs = "$(DESTDIR)$(systemdsystemunitdir)"
|
||||||
DATA = $(systemdsystemunit_DATA)
|
DATA = $(systemdsystemunit_DATA)
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/pcscd.service.in \
|
am__DIST_COMMON = $(srcdir)/Makefile.in
|
||||||
$(srcdir)/pcscd.socket.in
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
ALLOCA = @ALLOCA@
|
ALLOCA = @ALLOCA@
|
||||||
|
@ -306,7 +305,7 @@ top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
usbdropdir = @usbdropdir@
|
usbdropdir = @usbdropdir@
|
||||||
@HAVE_SYSTEMD_TRUE@SCRIPT_IN_FILES = \
|
@HAVE_SYSTEMD_TRUE@EXTRA_DIST = \
|
||||||
@HAVE_SYSTEMD_TRUE@ pcscd.service.in \
|
@HAVE_SYSTEMD_TRUE@ pcscd.service.in \
|
||||||
@HAVE_SYSTEMD_TRUE@ pcscd.socket.in
|
@HAVE_SYSTEMD_TRUE@ pcscd.socket.in
|
||||||
|
|
||||||
|
@ -314,6 +313,12 @@ usbdropdir = @usbdropdir@
|
||||||
@HAVE_SYSTEMD_TRUE@ pcscd.service \
|
@HAVE_SYSTEMD_TRUE@ pcscd.service \
|
||||||
@HAVE_SYSTEMD_TRUE@ pcscd.socket
|
@HAVE_SYSTEMD_TRUE@ pcscd.socket
|
||||||
|
|
||||||
|
@HAVE_SYSTEMD_TRUE@CLEANFILES = $(systemdsystemunit_DATA)
|
||||||
|
@HAVE_SYSTEMD_TRUE@edit = sed \
|
||||||
|
@HAVE_SYSTEMD_TRUE@ -e 's|@sysconfdir[@]|$(sysconfdir)|g' \
|
||||||
|
@HAVE_SYSTEMD_TRUE@ -e 's|@sbindir_exp[@]|$(sbindir_exp)|g' \
|
||||||
|
@HAVE_SYSTEMD_TRUE@ -e 's|@ipcdir[@]|$(ipcdir)|g'
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -346,10 +351,6 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(am__aclocal_m4_deps):
|
$(am__aclocal_m4_deps):
|
||||||
pcscd.service: $(top_builddir)/config.status $(srcdir)/pcscd.service.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
|
||||||
pcscd.socket: $(top_builddir)/config.status $(srcdir)/pcscd.socket.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
|
||||||
|
|
||||||
mostlyclean-libtool:
|
mostlyclean-libtool:
|
||||||
-rm -f *.lo
|
-rm -f *.lo
|
||||||
|
@ -445,6 +446,7 @@ install-strip:
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
@ -537,6 +539,18 @@ uninstall-am: uninstall-systemdsystemunitDATA
|
||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
|
@HAVE_SYSTEMD_TRUE@$(systemdsystemunit_DATA): Makefile
|
||||||
|
@HAVE_SYSTEMD_TRUE@ rm -f $@ $@.tmp
|
||||||
|
@HAVE_SYSTEMD_TRUE@ srcdir=''; \
|
||||||
|
@HAVE_SYSTEMD_TRUE@ test -f ./$@.in || srcdir=$(srcdir)/; \
|
||||||
|
@HAVE_SYSTEMD_TRUE@ $(edit) $${srcdir}$@.in >$@.tmp
|
||||||
|
@HAVE_SYSTEMD_TRUE@ chmod +x $@.tmp
|
||||||
|
@HAVE_SYSTEMD_TRUE@ chmod a-w $@.tmp
|
||||||
|
@HAVE_SYSTEMD_TRUE@ mv $@.tmp $@
|
||||||
|
|
||||||
|
@HAVE_SYSTEMD_TRUE@pcscd.service: $(srcdir)/pcscd.service.in
|
||||||
|
@HAVE_SYSTEMD_TRUE@pcscd.socket: $(srcdir)/pcscd.socket.in
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
.NOEXPORT:
|
.NOEXPORT:
|
||||||
|
|
|
@ -16,7 +16,6 @@ if ENABLE_USB
|
||||||
USB_CONFIG = tokenparser.l \
|
USB_CONFIG = tokenparser.l \
|
||||||
hotplug_libudev.c \
|
hotplug_libudev.c \
|
||||||
hotplug_libusb.c \
|
hotplug_libusb.c \
|
||||||
hotplug_linux.c \
|
|
||||||
hotplug_macosx.c
|
hotplug_macosx.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Makefile.in generated by automake 1.16.4 from Makefile.am.
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
@ -172,14 +172,13 @@ am__pcscd_SOURCES_DIST = auth.c auth.h atrhandler.c atrhandler.h \
|
||||||
PCSC/wintypes.h prothandler.c prothandler.h readerfactory.c \
|
PCSC/wintypes.h prothandler.c prothandler.h readerfactory.c \
|
||||||
readerfactory.h simclist.c simclist.h sys_generic.h sys_unix.c \
|
readerfactory.h simclist.c simclist.h sys_generic.h sys_unix.c \
|
||||||
tokenparser.l hotplug_libudev.c hotplug_libusb.c \
|
tokenparser.l hotplug_libudev.c hotplug_libusb.c \
|
||||||
hotplug_linux.c hotplug_macosx.c utils.c utils.h winscard.c \
|
hotplug_macosx.c utils.c utils.h winscard.c winscard_msg.c \
|
||||||
winscard_msg.c winscard_msg.h winscard_msg_srv.c \
|
winscard_msg.h winscard_msg_srv.c winscard_svc.c \
|
||||||
winscard_svc.c winscard_svc.h
|
winscard_svc.h
|
||||||
@ENABLE_SERIAL_TRUE@am__objects_1 = pcscd-configfile.$(OBJEXT)
|
@ENABLE_SERIAL_TRUE@am__objects_1 = pcscd-configfile.$(OBJEXT)
|
||||||
@ENABLE_USB_TRUE@am__objects_2 = pcscd-tokenparser.$(OBJEXT) \
|
@ENABLE_USB_TRUE@am__objects_2 = pcscd-tokenparser.$(OBJEXT) \
|
||||||
@ENABLE_USB_TRUE@ pcscd-hotplug_libudev.$(OBJEXT) \
|
@ENABLE_USB_TRUE@ pcscd-hotplug_libudev.$(OBJEXT) \
|
||||||
@ENABLE_USB_TRUE@ pcscd-hotplug_libusb.$(OBJEXT) \
|
@ENABLE_USB_TRUE@ pcscd-hotplug_libusb.$(OBJEXT) \
|
||||||
@ENABLE_USB_TRUE@ pcscd-hotplug_linux.$(OBJEXT) \
|
|
||||||
@ENABLE_USB_TRUE@ pcscd-hotplug_macosx.$(OBJEXT)
|
@ENABLE_USB_TRUE@ pcscd-hotplug_macosx.$(OBJEXT)
|
||||||
am_pcscd_OBJECTS = pcscd-auth.$(OBJEXT) pcscd-atrhandler.$(OBJEXT) \
|
am_pcscd_OBJECTS = pcscd-auth.$(OBJEXT) pcscd-atrhandler.$(OBJEXT) \
|
||||||
$(am__objects_1) pcscd-debuglog.$(OBJEXT) \
|
$(am__objects_1) pcscd-debuglog.$(OBJEXT) \
|
||||||
|
@ -236,7 +235,6 @@ am__depfiles_remade = ./$(DEPDIR)/libpcsclite_la-debug.Plo \
|
||||||
./$(DEPDIR)/pcscd-hotplug_generic.Po \
|
./$(DEPDIR)/pcscd-hotplug_generic.Po \
|
||||||
./$(DEPDIR)/pcscd-hotplug_libudev.Po \
|
./$(DEPDIR)/pcscd-hotplug_libudev.Po \
|
||||||
./$(DEPDIR)/pcscd-hotplug_libusb.Po \
|
./$(DEPDIR)/pcscd-hotplug_libusb.Po \
|
||||||
./$(DEPDIR)/pcscd-hotplug_linux.Po \
|
|
||||||
./$(DEPDIR)/pcscd-hotplug_macosx.Po \
|
./$(DEPDIR)/pcscd-hotplug_macosx.Po \
|
||||||
./$(DEPDIR)/pcscd-ifdwrapper.Po \
|
./$(DEPDIR)/pcscd-ifdwrapper.Po \
|
||||||
./$(DEPDIR)/pcscd-pcscdaemon.Po \
|
./$(DEPDIR)/pcscd-pcscdaemon.Po \
|
||||||
|
@ -514,7 +512,6 @@ lib_LTLIBRARIES = libpcsclite.la
|
||||||
@ENABLE_USB_TRUE@USB_CONFIG = tokenparser.l \
|
@ENABLE_USB_TRUE@USB_CONFIG = tokenparser.l \
|
||||||
@ENABLE_USB_TRUE@ hotplug_libudev.c \
|
@ENABLE_USB_TRUE@ hotplug_libudev.c \
|
||||||
@ENABLE_USB_TRUE@ hotplug_libusb.c \
|
@ENABLE_USB_TRUE@ hotplug_libusb.c \
|
||||||
@ENABLE_USB_TRUE@ hotplug_linux.c \
|
|
||||||
@ENABLE_USB_TRUE@ hotplug_macosx.c
|
@ENABLE_USB_TRUE@ hotplug_macosx.c
|
||||||
|
|
||||||
libpcsclite_la_SOURCES = \
|
libpcsclite_la_SOURCES = \
|
||||||
|
@ -786,7 +783,6 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_generic.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_generic.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_libudev.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_libudev.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_libusb.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_libusb.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_linux.Po@am__quote@ # am--include-marker
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_macosx.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-hotplug_macosx.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-ifdwrapper.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-ifdwrapper.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-pcscdaemon.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-pcscdaemon.Po@am__quote@ # am--include-marker
|
||||||
|
@ -1130,20 +1126,6 @@ pcscd-hotplug_libusb.obj: hotplug_libusb.c
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @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) $(pcscd_CFLAGS) $(CFLAGS) -c -o pcscd-hotplug_libusb.obj `if test -f 'hotplug_libusb.c'; then $(CYGPATH_W) 'hotplug_libusb.c'; else $(CYGPATH_W) '$(srcdir)/hotplug_libusb.c'; fi`
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -c -o pcscd-hotplug_libusb.obj `if test -f 'hotplug_libusb.c'; then $(CYGPATH_W) 'hotplug_libusb.c'; else $(CYGPATH_W) '$(srcdir)/hotplug_libusb.c'; fi`
|
||||||
|
|
||||||
pcscd-hotplug_linux.o: hotplug_linux.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-hotplug_linux.o -MD -MP -MF $(DEPDIR)/pcscd-hotplug_linux.Tpo -c -o pcscd-hotplug_linux.o `test -f 'hotplug_linux.c' || echo '$(srcdir)/'`hotplug_linux.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-hotplug_linux.Tpo $(DEPDIR)/pcscd-hotplug_linux.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hotplug_linux.c' object='pcscd-hotplug_linux.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) $(pcscd_CFLAGS) $(CFLAGS) -c -o pcscd-hotplug_linux.o `test -f 'hotplug_linux.c' || echo '$(srcdir)/'`hotplug_linux.c
|
|
||||||
|
|
||||||
pcscd-hotplug_linux.obj: hotplug_linux.c
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-hotplug_linux.obj -MD -MP -MF $(DEPDIR)/pcscd-hotplug_linux.Tpo -c -o pcscd-hotplug_linux.obj `if test -f 'hotplug_linux.c'; then $(CYGPATH_W) 'hotplug_linux.c'; else $(CYGPATH_W) '$(srcdir)/hotplug_linux.c'; fi`
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-hotplug_linux.Tpo $(DEPDIR)/pcscd-hotplug_linux.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hotplug_linux.c' object='pcscd-hotplug_linux.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) $(pcscd_CFLAGS) $(CFLAGS) -c -o pcscd-hotplug_linux.obj `if test -f 'hotplug_linux.c'; then $(CYGPATH_W) 'hotplug_linux.c'; else $(CYGPATH_W) '$(srcdir)/hotplug_linux.c'; fi`
|
|
||||||
|
|
||||||
pcscd-hotplug_macosx.o: hotplug_macosx.c
|
pcscd-hotplug_macosx.o: hotplug_macosx.c
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-hotplug_macosx.o -MD -MP -MF $(DEPDIR)/pcscd-hotplug_macosx.Tpo -c -o pcscd-hotplug_macosx.o `test -f 'hotplug_macosx.c' || echo '$(srcdir)/'`hotplug_macosx.c
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-hotplug_macosx.o -MD -MP -MF $(DEPDIR)/pcscd-hotplug_macosx.Tpo -c -o pcscd-hotplug_macosx.o `test -f 'hotplug_macosx.c' || echo '$(srcdir)/'`hotplug_macosx.c
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-hotplug_macosx.Tpo $(DEPDIR)/pcscd-hotplug_macosx.Po
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-hotplug_macosx.Tpo $(DEPDIR)/pcscd-hotplug_macosx.Po
|
||||||
|
@ -1462,6 +1444,8 @@ distdir-am: $(DISTFILES)
|
||||||
check-am: all-am
|
check-am: all-am
|
||||||
check: check-recursive
|
check: check-recursive
|
||||||
all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(DATA) $(HEADERS)
|
all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(DATA) $(HEADERS)
|
||||||
|
install-sbinPROGRAMS: install-libLTLIBRARIES
|
||||||
|
|
||||||
installdirs: installdirs-recursive
|
installdirs: installdirs-recursive
|
||||||
installdirs-am:
|
installdirs-am:
|
||||||
for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(nodistheaderdir)" "$(DESTDIR)$(pcdir)" "$(DESTDIR)$(includedir)"; do \
|
for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(nodistheaderdir)" "$(DESTDIR)$(pcdir)" "$(DESTDIR)$(includedir)"; do \
|
||||||
|
@ -1526,7 +1510,6 @@ distclean: distclean-recursive
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_generic.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_generic.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_libudev.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_libudev.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_libusb.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_libusb.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_linux.Po
|
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_macosx.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_macosx.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-ifdwrapper.Po
|
-rm -f ./$(DEPDIR)/pcscd-ifdwrapper.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-pcscdaemon.Po
|
-rm -f ./$(DEPDIR)/pcscd-pcscdaemon.Po
|
||||||
|
@ -1608,7 +1591,6 @@ maintainer-clean: maintainer-clean-recursive
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_generic.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_generic.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_libudev.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_libudev.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_libusb.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_libusb.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_linux.Po
|
|
||||||
-rm -f ./$(DEPDIR)/pcscd-hotplug_macosx.Po
|
-rm -f ./$(DEPDIR)/pcscd-hotplug_macosx.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-ifdwrapper.Po
|
-rm -f ./$(DEPDIR)/pcscd-ifdwrapper.Po
|
||||||
-rm -f ./$(DEPDIR)/pcscd-pcscdaemon.Po
|
-rm -f ./$(DEPDIR)/pcscd-pcscdaemon.Po
|
||||||
|
|
|
@ -328,6 +328,7 @@ whichever location your reader resides.
|
||||||
#define TAG_IFD_POLLING_THREAD_KILLABLE 0x0FB1 /**< the polling thread can be killed */
|
#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_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 */
|
#define TAG_IFD_POLLING_THREAD_WITH_TIMEOUT 0x0FB3 /**< driver uses a polling thread with a timeout parameter */
|
||||||
|
#define TAG_IFD_DEVICE_REMOVED 0x0FB4 /**< signals the reader has been removed*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IFD Handler version number enummerations
|
* IFD Handler version number enummerations
|
||||||
|
|
|
@ -279,7 +279,7 @@ extern const SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci;
|
||||||
#define INFINITE 0xFFFFFFFF /**< Infinite timeout */
|
#define INFINITE 0xFFFFFFFF /**< Infinite timeout */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PCSCLITE_VERSION_NUMBER "1.9.4" /**< Current version */
|
#define PCSCLITE_VERSION_NUMBER "1.9.5" /**< Current version */
|
||||||
/** Maximum readers context (a slot is count as a reader) */
|
/** Maximum readers context (a slot is count as a reader) */
|
||||||
#define PCSCLITE_MAX_READERS_CONTEXTS 16
|
#define PCSCLITE_MAX_READERS_CONTEXTS 16
|
||||||
|
|
||||||
|
|
|
@ -26,16 +26,12 @@ pcscd (daemon)
|
||||||
eventhandler.c
|
eventhandler.c
|
||||||
hotplug_generic.c
|
hotplug_generic.c
|
||||||
hotplug_libusb.c
|
hotplug_libusb.c
|
||||||
hotplug_linux.c (this file is OS dependant)
|
|
||||||
hotplug_macosx.c (this file is OS dependant)
|
hotplug_macosx.c (this file is OS dependant)
|
||||||
ifdwrapper.c
|
ifdwrapper.c
|
||||||
pcscdaemon.c
|
pcscdaemon.c
|
||||||
powermgt_generic.c
|
|
||||||
powermgt_macosx.c (this file is OS dependant)
|
|
||||||
prothandler.c
|
prothandler.c
|
||||||
readerfactory.c
|
readerfactory.c
|
||||||
sys_unix.c (this file is OS dependant)
|
sys_unix.c (this file is OS dependant)
|
||||||
thread_unix.c (this file is OS dependant)
|
|
||||||
tokenparser.l
|
tokenparser.l
|
||||||
winscard.c
|
winscard.c
|
||||||
winscard_msg.c
|
winscard_msg.c
|
||||||
|
@ -49,7 +45,6 @@ libpcsclite.la (client library)
|
||||||
dyn_unix.c
|
dyn_unix.c
|
||||||
error.c
|
error.c
|
||||||
sys_unix.c
|
sys_unix.c
|
||||||
thread_unix.c
|
|
||||||
winscard_clnt.c or winscard_scf.c
|
winscard_clnt.c or winscard_scf.c
|
||||||
winscard_msg.c
|
winscard_msg.c
|
||||||
|
|
||||||
|
@ -187,37 +182,6 @@ We can have:
|
||||||
=> does not work
|
=> does not work
|
||||||
|
|
||||||
|
|
||||||
Memory structures
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
pcscd side:
|
|
||||||
|
|
||||||
- pcscd open/creates a shared memory segment (EHInitializeEventStructures()
|
|
||||||
in eventhandler.c)
|
|
||||||
- static PREADER_STATE readerStates[PCSCLITE_MAX_READERS_CONTEXTS]; is
|
|
||||||
an array of pointers on READER_STATE. Each entry readerStates[i]
|
|
||||||
points to a memory shared segment. It contains the state of each
|
|
||||||
readers.
|
|
||||||
|
|
||||||
- reader contexts are also created and maintained
|
|
||||||
- static PREADER_CONTEXT sReadersContexts[PCSCLITE_MAX_READERS_CONTEXTS];
|
|
||||||
is an array of pointers on READER_CONTEXT
|
|
||||||
- the structure is allocated by RFAllocateReaderSpace() in
|
|
||||||
readerfactory.c
|
|
||||||
- each READER_CONTEXT contains a pointer to a READER_STATE for the
|
|
||||||
context
|
|
||||||
|
|
||||||
|
|
||||||
libpcsclite side:
|
|
||||||
|
|
||||||
- the library open the shared memory segment (SCardEstablishContextTH()
|
|
||||||
in winscard_clnt.c)
|
|
||||||
- each entry readerStates[i] gets a reference to the memory segment of
|
|
||||||
the server.
|
|
||||||
|
|
||||||
The memory is READ ONLY on the library side.
|
|
||||||
|
|
||||||
|
|
||||||
Inter-thread communication:
|
Inter-thread communication:
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
|
|
@ -285,7 +285,7 @@ static void * EHStatusHandlerThread(READER_CONTEXT * rContext)
|
||||||
if (rv == IFD_SUCCESS)
|
if (rv == IFD_SUCCESS)
|
||||||
{
|
{
|
||||||
readerState = SCARD_PRESENT | SCARD_POWERED | SCARD_NEGOTIABLE;
|
readerState = SCARD_PRESENT | SCARD_POWERED | SCARD_NEGOTIABLE;
|
||||||
rContext->powerState = POWER_STATE_POWERED;
|
RFSetPowerState(rContext, POWER_STATE_POWERED);
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_POWERED");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_POWERED");
|
||||||
|
|
||||||
if (rContext->readerState->cardAtrLength > 0)
|
if (rContext->readerState->cardAtrLength > 0)
|
||||||
|
@ -300,7 +300,7 @@ static void * EHStatusHandlerThread(READER_CONTEXT * rContext)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
readerState = SCARD_PRESENT | SCARD_SWALLOWED;
|
readerState = SCARD_PRESENT | SCARD_SWALLOWED;
|
||||||
rContext->powerState = POWER_STATE_UNPOWERED;
|
RFSetPowerState(rContext, POWER_STATE_UNPOWERED);
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
||||||
Log3(PCSC_LOG_ERROR, "Error powering up card: %ld 0x%04lX", rv, rv);
|
Log3(PCSC_LOG_ERROR, "Error powering up card: %ld 0x%04lX", rv, rv);
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ static void * EHStatusHandlerThread(READER_CONTEXT * rContext)
|
||||||
rContext->readerState->cardAtrLength = 0;
|
rContext->readerState->cardAtrLength = 0;
|
||||||
rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED;
|
rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED;
|
||||||
rContext->readerState->readerState = SCARD_PRESENT;
|
rContext->readerState->readerState = SCARD_PRESENT;
|
||||||
rContext->powerState = POWER_STATE_UNPOWERED;
|
RFSetPowerState(rContext, POWER_STATE_UNPOWERED);
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
||||||
rv = IFD_SUCCESS;
|
rv = IFD_SUCCESS;
|
||||||
Log1(PCSC_LOG_INFO, "Skip card power on");
|
Log1(PCSC_LOG_INFO, "Skip card power on");
|
||||||
|
@ -402,13 +402,13 @@ static void * EHStatusHandlerThread(READER_CONTEXT * rContext)
|
||||||
if (rv == IFD_SUCCESS)
|
if (rv == IFD_SUCCESS)
|
||||||
{
|
{
|
||||||
rContext->readerState->readerState = SCARD_PRESENT | SCARD_POWERED | SCARD_NEGOTIABLE;
|
rContext->readerState->readerState = SCARD_PRESENT | SCARD_POWERED | SCARD_NEGOTIABLE;
|
||||||
rContext->powerState = POWER_STATE_POWERED;
|
RFSetPowerState(rContext, POWER_STATE_POWERED);
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_POWERED");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_POWERED");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rContext->readerState->readerState = SCARD_PRESENT | SCARD_SWALLOWED;
|
rContext->readerState->readerState = SCARD_PRESENT | SCARD_SWALLOWED;
|
||||||
rContext->powerState = POWER_STATE_UNPOWERED;
|
RFSetPowerState(rContext, POWER_STATE_UNPOWERED);
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
||||||
rContext->readerState->cardAtrLength = 0;
|
rContext->readerState->cardAtrLength = 0;
|
||||||
}
|
}
|
||||||
|
@ -456,7 +456,7 @@ static void * EHStatusHandlerThread(READER_CONTEXT * rContext)
|
||||||
int timeout;
|
int timeout;
|
||||||
|
|
||||||
#ifndef DISABLE_ON_DEMAND_POWER_ON
|
#ifndef DISABLE_ON_DEMAND_POWER_ON
|
||||||
if (POWER_STATE_POWERED == rContext->powerState)
|
if (POWER_STATE_POWERED == RFGetPowerState(rContext))
|
||||||
/* The card is powered but not yet used */
|
/* The card is powered but not yet used */
|
||||||
timeout = PCSCLITE_POWER_OFF_GRACE_PERIOD;
|
timeout = PCSCLITE_POWER_OFF_GRACE_PERIOD;
|
||||||
else
|
else
|
||||||
|
|
|
@ -367,7 +367,7 @@ static void HPRemoveDevice(struct udev_device *dev)
|
||||||
Log4(PCSC_LOG_INFO, "Removing USB device[%d]: %s at %s", i,
|
Log4(PCSC_LOG_INFO, "Removing USB device[%d]: %s at %s", i,
|
||||||
readerTracker[i].fullName, readerTracker[i].devpath);
|
readerTracker[i].fullName, readerTracker[i].devpath);
|
||||||
|
|
||||||
RFRemoveReader(readerTracker[i].fullName, PCSCLITE_HP_BASE_PORT + i);
|
RFRemoveReader(readerTracker[i].fullName, PCSCLITE_HP_BASE_PORT + i, REMOVE_READER_FLAG_REMOVED);
|
||||||
|
|
||||||
free(readerTracker[i].devpath);
|
free(readerTracker[i].devpath);
|
||||||
readerTracker[i].devpath = NULL;
|
readerTracker[i].devpath = NULL;
|
||||||
|
|
|
@ -762,7 +762,7 @@ static LONG HPRemoveHotPluggable(int reader_index)
|
||||||
readerTracker[reader_index].bus_device);
|
readerTracker[reader_index].bus_device);
|
||||||
|
|
||||||
RFRemoveReader(readerTracker[reader_index].fullName,
|
RFRemoveReader(readerTracker[reader_index].fullName,
|
||||||
PCSCLITE_HP_BASE_PORT + reader_index);
|
PCSCLITE_HP_BASE_PORT + reader_index, REMOVE_READER_FLAG_REMOVED);
|
||||||
free(readerTracker[reader_index].fullName);
|
free(readerTracker[reader_index].fullName);
|
||||||
readerTracker[reader_index].status = READER_ABSENT;
|
readerTracker[reader_index].status = READER_ABSENT;
|
||||||
readerTracker[reader_index].bus_device[0] = '\0';
|
readerTracker[reader_index].bus_device[0] = '\0';
|
||||||
|
|
|
@ -1,472 +0,0 @@
|
||||||
/*
|
|
||||||
* MUSCLE SmartCard Development ( https://pcsclite.apdu.fr/ )
|
|
||||||
*
|
|
||||||
* Copyright (C) 2001-2003
|
|
||||||
* David Corcoran <corcoran@musclecard.com>
|
|
||||||
* Copyright (C) 2002-2011
|
|
||||||
* Ludovic Rousseau <ludovic.rousseau@free.fr>
|
|
||||||
*
|
|
||||||
* The USB code was based partly on Johannes Erdfelt
|
|
||||||
* libusb code found at libusb.sourceforge.net
|
|
||||||
*
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* @brief This provides a search API for hot pluggble devices.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#if defined(__linux__) && !defined(HAVE_LIBUSB) && !defined(HAVE_LIBUDEV)
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include "misc.h"
|
|
||||||
#include "pcsclite.h"
|
|
||||||
#include "pcscd.h"
|
|
||||||
#include "debuglog.h"
|
|
||||||
#include "parser.h"
|
|
||||||
#include "readerfactory.h"
|
|
||||||
#include "winscard_msg.h"
|
|
||||||
#include "sys_generic.h"
|
|
||||||
#include "hotplug.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
#undef DEBUG_HOTPLUG
|
|
||||||
#define PCSCLITE_USB_PATH "/proc/bus/usb"
|
|
||||||
|
|
||||||
#define FALSE 0
|
|
||||||
#define TRUE 1
|
|
||||||
|
|
||||||
pthread_mutex_t usbNotifierMutex;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
__attribute__ ((packed));
|
|
||||||
|
|
||||||
static LONG HPAddHotPluggable(int, unsigned long);
|
|
||||||
static LONG HPRemoveHotPluggable(int, unsigned long);
|
|
||||||
static LONG HPReadBundleValues(void);
|
|
||||||
static void HPEstablishUSBNotifications(void);
|
|
||||||
|
|
||||||
static pthread_t usbNotifyThread;
|
|
||||||
static int AraKiriHotPlug = FALSE;
|
|
||||||
static int bundleSize = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A list to keep track of 20 simultaneous readers
|
|
||||||
*/
|
|
||||||
static struct _bundleTracker
|
|
||||||
{
|
|
||||||
long manuID;
|
|
||||||
long productID;
|
|
||||||
|
|
||||||
struct _deviceNumber {
|
|
||||||
int id;
|
|
||||||
char status;
|
|
||||||
} deviceNumber[PCSCLITE_MAX_READERS_CONTEXTS];
|
|
||||||
|
|
||||||
char *bundleName;
|
|
||||||
char *libraryPath;
|
|
||||||
char *readerName;
|
|
||||||
}
|
|
||||||
bundleTracker[PCSCLITE_MAX_READERS_CONTEXTS];
|
|
||||||
|
|
||||||
static LONG HPReadBundleValues(void)
|
|
||||||
{
|
|
||||||
LONG rv;
|
|
||||||
DIR *hpDir;
|
|
||||||
struct dirent *currFP = 0;
|
|
||||||
char fullPath[FILENAME_MAX];
|
|
||||||
char fullLibPath[FILENAME_MAX];
|
|
||||||
unsigned int listCount = 0;
|
|
||||||
|
|
||||||
hpDir = opendir(PCSCLITE_HP_DROPDIR);
|
|
||||||
|
|
||||||
if (hpDir == NULL)
|
|
||||||
{
|
|
||||||
Log1(PCSC_LOG_INFO,
|
|
||||||
"Cannot open PC/SC drivers directory: " PCSCLITE_HP_DROPDIR);
|
|
||||||
Log1(PCSC_LOG_INFO, "Disabling USB support for pcscd.");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_KEY(key, values) \
|
|
||||||
rv = LTPBundleFindValueWithKey(&plist, key, values); \
|
|
||||||
if (rv) \
|
|
||||||
{ \
|
|
||||||
Log2(PCSC_LOG_ERROR, "Value/Key not defined for " key " in %s", \
|
|
||||||
fullPath); \
|
|
||||||
continue; \
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((currFP = readdir(hpDir)) != 0)
|
|
||||||
{
|
|
||||||
if (strstr(currFP->d_name, ".bundle") != 0)
|
|
||||||
{
|
|
||||||
unsigned int alias;
|
|
||||||
list_t plist, *values;
|
|
||||||
list_t *manuIDs, *productIDs, *readerNames;
|
|
||||||
char *libraryPath;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The bundle exists - let's form a full path name and get the
|
|
||||||
* vendor and product ID's for this particular bundle
|
|
||||||
*/
|
|
||||||
snprintf(fullPath, FILENAME_MAX, "%s/%s/Contents/Info.plist",
|
|
||||||
PCSCLITE_HP_DROPDIR, currFP->d_name);
|
|
||||||
fullPath[FILENAME_MAX - 1] = '\0';
|
|
||||||
|
|
||||||
rv = bundleParse(fullPath, &plist);
|
|
||||||
if (rv)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* get CFBundleExecutable */
|
|
||||||
GET_KEY(PCSCLITE_HP_LIBRKEY_NAME, &values)
|
|
||||||
libraryPath = list_get_at(values, 0);
|
|
||||||
(void)snprintf(fullLibPath, sizeof(fullLibPath),
|
|
||||||
"%s/%s/Contents/%s/%s",
|
|
||||||
PCSCLITE_HP_DROPDIR, currFP->d_name, PCSC_ARCH,
|
|
||||||
libraryPath);
|
|
||||||
fullLibPath[sizeof(fullLibPath) - 1] = '\0';
|
|
||||||
|
|
||||||
GET_KEY(PCSCLITE_HP_CPCTKEY_NAME, &values)
|
|
||||||
GET_KEY(PCSCLITE_HP_MANUKEY_NAME, &manuIDs)
|
|
||||||
GET_KEY(PCSCLITE_HP_PRODKEY_NAME, &productIDs)
|
|
||||||
GET_KEY(PCSCLITE_HP_NAMEKEY_NAME, &readerNames)
|
|
||||||
|
|
||||||
/* while we find a nth ifdVendorID in Info.plist */
|
|
||||||
for (alias=0; alias<list_size(manuIDs); alias++)
|
|
||||||
{
|
|
||||||
char *value;
|
|
||||||
|
|
||||||
/* variables entries */
|
|
||||||
value = list_get_at(manuIDs, alias);
|
|
||||||
bundleTracker[listCount].manuID = strtol(value, NULL, 16);
|
|
||||||
|
|
||||||
value = list_get_at(productIDs, alias);
|
|
||||||
bundleTracker[listCount].productID = strtol(value, NULL, 16);
|
|
||||||
|
|
||||||
bundleTracker[listCount].readerName = strdup(list_get_at(readerNames, alias));
|
|
||||||
|
|
||||||
/* constant entries for a same driver */
|
|
||||||
bundleTracker[listCount].bundleName = strdup(currFP->d_name);
|
|
||||||
bundleTracker[listCount].libraryPath = strdup(fullLibPath);
|
|
||||||
|
|
||||||
#ifdef DEBUG_HOTPLUG
|
|
||||||
Log2(PCSC_LOG_INFO, "Found driver for: %s",
|
|
||||||
bundleTracker[listCount].readerName);
|
|
||||||
#endif
|
|
||||||
listCount++;
|
|
||||||
|
|
||||||
if (listCount >= COUNT_OF(bundleTracker))
|
|
||||||
{
|
|
||||||
Log2(PCSC_LOG_CRITICAL, "Too many readers declared. Maximum is %zd", COUNT_OF(bundleTracker));
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bundleRelease(&plist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
bundleSize = listCount;
|
|
||||||
|
|
||||||
if (bundleSize == 0)
|
|
||||||
{
|
|
||||||
Log1(PCSC_LOG_INFO,
|
|
||||||
"No bundle files in pcsc drivers directory: " PCSCLITE_HP_DROPDIR);
|
|
||||||
Log1(PCSC_LOG_INFO, "Disabling USB support for pcscd");
|
|
||||||
}
|
|
||||||
|
|
||||||
closedir(hpDir);
|
|
||||||
return bundleSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void HPEstablishUSBNotifications(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
int i, j, usbDeviceStatus;
|
|
||||||
DIR *dir, *dirB;
|
|
||||||
struct dirent *entry, *entryB;
|
|
||||||
int deviceNumber;
|
|
||||||
int suspectDeviceNumber;
|
|
||||||
char dirpath[FILENAME_MAX];
|
|
||||||
char filename[FILENAME_MAX * 2];
|
|
||||||
int fd, ret;
|
|
||||||
struct usb_device_descriptor usbDescriptor;
|
|
||||||
|
|
||||||
usbDeviceStatus = 0;
|
|
||||||
suspectDeviceNumber = 0;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
for (i = 0; i < bundleSize; i++)
|
|
||||||
{
|
|
||||||
usbDeviceStatus = 0;
|
|
||||||
suspectDeviceNumber = 0;
|
|
||||||
|
|
||||||
for (j=0; j < PCSCLITE_MAX_READERS_CONTEXTS; j++)
|
|
||||||
/* clear rollcall */
|
|
||||||
bundleTracker[i].deviceNumber[j].status = 0;
|
|
||||||
|
|
||||||
dir = NULL;
|
|
||||||
dir = opendir(PCSCLITE_USB_PATH);
|
|
||||||
if (dir == NULL)
|
|
||||||
{
|
|
||||||
Log1(PCSC_LOG_ERROR,
|
|
||||||
"Cannot open USB path directory: " PCSCLITE_USB_PATH);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
entry = NULL;
|
|
||||||
while ((entry = readdir(dir)) != 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Skip anything starting with a
|
|
||||||
*/
|
|
||||||
if (entry->d_name[0] == '.')
|
|
||||||
continue;
|
|
||||||
if (!strchr("0123456789",
|
|
||||||
entry->d_name[strlen(entry->d_name) - 1]))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(dirpath, sizeof dirpath, "%s/%s",
|
|
||||||
PCSCLITE_USB_PATH, entry->d_name);
|
|
||||||
|
|
||||||
dirB = opendir(dirpath);
|
|
||||||
|
|
||||||
if (dirB == NULL)
|
|
||||||
{
|
|
||||||
Log2(PCSC_LOG_ERROR,
|
|
||||||
"USB path seems to have disappeared %s", dirpath);
|
|
||||||
closedir(dir);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((entryB = readdir(dirB)) != NULL)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Skip anything starting with a
|
|
||||||
*/
|
|
||||||
if (entryB->d_name[0] == '.')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Get the device number so we can distinguish
|
|
||||||
multiple readers */
|
|
||||||
snprintf(filename, sizeof filename, "%s/%s",
|
|
||||||
dirpath, entryB->d_name);
|
|
||||||
deviceNumber = atoi(entryB->d_name);
|
|
||||||
|
|
||||||
fd = open(filename, O_RDONLY);
|
|
||||||
if (fd < 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ret = read(fd, (void *) &usbDescriptor,
|
|
||||||
sizeof(usbDescriptor));
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Device is found and we don't know about it
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (usbDescriptor.idVendor == bundleTracker[i].manuID &&
|
|
||||||
usbDescriptor.idProduct == bundleTracker[i].productID &&
|
|
||||||
usbDescriptor.idVendor !=0 &&
|
|
||||||
usbDescriptor.idProduct != 0)
|
|
||||||
{
|
|
||||||
for (j=0; j < PCSCLITE_MAX_READERS_CONTEXTS; j++)
|
|
||||||
{
|
|
||||||
if (bundleTracker[i].deviceNumber[j].id == deviceNumber &&
|
|
||||||
bundleTracker[i].deviceNumber[j].id != 0)
|
|
||||||
{
|
|
||||||
bundleTracker[i].deviceNumber[j].status = 1; /* i'm here */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j == PCSCLITE_MAX_READERS_CONTEXTS)
|
|
||||||
{
|
|
||||||
usbDeviceStatus = 1;
|
|
||||||
suspectDeviceNumber = deviceNumber;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* End of while */
|
|
||||||
|
|
||||||
closedir(dirB);
|
|
||||||
|
|
||||||
} /* End of while */
|
|
||||||
|
|
||||||
|
|
||||||
if (usbDeviceStatus == 1)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&usbNotifierMutex);
|
|
||||||
|
|
||||||
for (j=0; j < PCSCLITE_MAX_READERS_CONTEXTS; j++)
|
|
||||||
{
|
|
||||||
if (bundleTracker[i].deviceNumber[j].id == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j == PCSCLITE_MAX_READERS_CONTEXTS)
|
|
||||||
Log1(PCSC_LOG_ERROR,
|
|
||||||
"Too many identical readers plugged in");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HPAddHotPluggable(i, j+1);
|
|
||||||
bundleTracker[i].deviceNumber[j].id = suspectDeviceNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&usbNotifierMutex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if (usbDeviceStatus == 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
for (j=0; j < PCSCLITE_MAX_READERS_CONTEXTS; j++)
|
|
||||||
{
|
|
||||||
if (bundleTracker[i].deviceNumber[j].id != 0 &&
|
|
||||||
bundleTracker[i].deviceNumber[j].status == 0)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&usbNotifierMutex);
|
|
||||||
HPRemoveHotPluggable(i, j+1);
|
|
||||||
bundleTracker[i].deviceNumber[j].id = 0;
|
|
||||||
pthread_mutex_unlock(&usbNotifierMutex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Do nothing - no USB devices found
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dir)
|
|
||||||
closedir(dir);
|
|
||||||
|
|
||||||
} /* End of for..loop */
|
|
||||||
|
|
||||||
SYS_Sleep(1);
|
|
||||||
if (AraKiriHotPlug)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
Log1(PCSC_LOG_INFO, "Hotplug stopped");
|
|
||||||
pthread_exit(&retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* End of while loop */
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG HPSearchHotPluggables(void)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++)
|
|
||||||
{
|
|
||||||
bundleTracker[i].productID = 0;
|
|
||||||
bundleTracker[i].manuID = 0;
|
|
||||||
|
|
||||||
for (j=0; j < PCSCLITE_MAX_READERS_CONTEXTS; j++)
|
|
||||||
bundleTracker[i].deviceNumber[j].id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HPReadBundleValues() > 0)
|
|
||||||
ThreadCreate(&usbNotifyThread, THREAD_ATTR_DETACHED,
|
|
||||||
(PCSCLITE_THREAD_FUNCTION( )) HPEstablishUSBNotifications, 0);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG HPStopHotPluggables(void)
|
|
||||||
{
|
|
||||||
AraKiriHotPlug = TRUE;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LONG HPAddHotPluggable(int i, unsigned long usbAddr)
|
|
||||||
{
|
|
||||||
/* NOTE: The deviceName is an empty string "" until someone implements
|
|
||||||
* the code to get it */
|
|
||||||
RFAddReader(bundleTracker[i].readerName, PCSCLITE_HP_BASE_PORT + usbAddr,
|
|
||||||
bundleTracker[i].libraryPath, "");
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
} /* End of function */
|
|
||||||
|
|
||||||
static LONG HPRemoveHotPluggable(int i, unsigned long usbAddr)
|
|
||||||
{
|
|
||||||
RFRemoveReader(bundleTracker[i].readerName, PCSCLITE_HP_BASE_PORT + usbAddr);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
} /* End of function */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets up callbacks for device hotplug events.
|
|
||||||
*/
|
|
||||||
ULONG HPRegisterForHotplugEvents(void)
|
|
||||||
{
|
|
||||||
(void)pthread_mutex_init(&usbNotifierMutex, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HPReCheckSerialReaders(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __linux__ && !HAVE_LIBUSB */
|
|
|
@ -818,7 +818,8 @@ static int HPScan(void)
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
RFRemoveReader(a->m_driver->m_friendlyName,
|
RFRemoveReader(a->m_driver->m_friendlyName,
|
||||||
PCSCLITE_HP_BASE_PORT + a->m_address);
|
PCSCLITE_HP_BASE_PORT + a->m_address,
|
||||||
|
REMOVE_READER_FLAG_REMOVED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
|
|
||||||
#define PCSCLITE_CSOCK_NAME PCSCLITE_IPC_DIR "/pcscd.comm"
|
#define PCSCLITE_CSOCK_NAME PCSCLITE_IPC_DIR "/pcscd.comm"
|
||||||
|
|
||||||
#define PCSCLITE_VERSION_NUMBER "1.9.4" /**< Current version */
|
#define PCSCLITE_VERSION_NUMBER "1.9.5" /**< Current version */
|
||||||
#define PCSCLITE_STATUS_POLL_RATE 400000 /**< Status polling rate */
|
#define PCSCLITE_STATUS_POLL_RATE 400000 /**< Status polling rate */
|
||||||
#define PCSCLITE_LOCK_POLL_RATE 100000 /**< Lock polling rate */
|
#define PCSCLITE_LOCK_POLL_RATE 100000 /**< Lock polling rate */
|
||||||
|
|
||||||
|
|
|
@ -700,7 +700,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* post initialistion
|
* post initialization
|
||||||
*/
|
*/
|
||||||
Init = FALSE;
|
Init = FALSE;
|
||||||
|
|
||||||
|
@ -738,7 +738,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
(void)signal(SIGPIPE, SIG_IGN);
|
(void)signal(SIGPIPE, SIG_IGN);
|
||||||
(void)signal(SIGHUP, SIG_IGN); /* needed for Solaris. The signal is sent
|
(void)signal(SIGHUP, SIG_IGN); /* needed for Solaris. The signal is sent
|
||||||
* when the shell is existed */
|
* when the shell is exited */
|
||||||
|
|
||||||
#if !defined(PCSCLITE_STATIC_DRIVER) && defined(USE_USB)
|
#if !defined(PCSCLITE_STATIC_DRIVER) && defined(USE_USB)
|
||||||
/*
|
/*
|
||||||
|
@ -760,7 +760,7 @@ int main(int argc, char **argv)
|
||||||
RFWaitForReaderInit();
|
RFWaitForReaderInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* initialisation succeeded */
|
/* initialization succeeded */
|
||||||
if (pipefd[1] >= 0)
|
if (pipefd[1] >= 0)
|
||||||
{
|
{
|
||||||
char buf = 0;
|
char buf = 0;
|
||||||
|
@ -776,6 +776,13 @@ int main(int argc, char **argv)
|
||||||
pipefd[1] = -1;
|
pipefd[1] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (AutoExit)
|
||||||
|
{
|
||||||
|
Log2(PCSC_LOG_DEBUG, "Starting suicide alarm in %d seconds",
|
||||||
|
TIME_BEFORE_SUICIDE);
|
||||||
|
alarm(TIME_BEFORE_SUICIDE);
|
||||||
|
}
|
||||||
|
|
||||||
SVCServiceRunLoop();
|
SVCServiceRunLoop();
|
||||||
|
|
||||||
Log1(PCSC_LOG_ERROR, "SVCServiceRunLoop returned");
|
Log1(PCSC_LOG_ERROR, "SVCServiceRunLoop returned");
|
||||||
|
|
|
@ -378,7 +378,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
|
|
||||||
/* Cannot connect to reader. Exit gracefully */
|
/* Cannot connect to reader. Exit gracefully */
|
||||||
Log2(log_level, "%s init failed.", readerName);
|
Log2(log_level, "%s init failed.", readerName);
|
||||||
(void)RFRemoveReader(readerName, port);
|
(void)RFRemoveReader(readerName, port, REMOVE_READER_NO_FLAG);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,7 +404,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
if (rv != SCARD_S_SUCCESS)
|
if (rv != SCARD_S_SUCCESS)
|
||||||
{
|
{
|
||||||
Log2(PCSC_LOG_ERROR, "%s init failed.", readerName);
|
Log2(PCSC_LOG_ERROR, "%s init failed.", readerName);
|
||||||
(void)RFRemoveReader(readerName, port);
|
(void)RFRemoveReader(readerName, port, REMOVE_READER_NO_FLAG);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -449,7 +449,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
if (i == PCSCLITE_MAX_READERS_CONTEXTS)
|
if (i == PCSCLITE_MAX_READERS_CONTEXTS)
|
||||||
{
|
{
|
||||||
/* No more slot left return */
|
/* No more slot left return */
|
||||||
RFRemoveReader(readerName, port);
|
RFRemoveReader(readerName, port, REMOVE_READER_NO_FLAG);
|
||||||
return SCARD_E_NO_MEMORY;
|
return SCARD_E_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -548,7 +548,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
if (rv != SCARD_S_SUCCESS)
|
if (rv != SCARD_S_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Cannot connect to slot. Exit gracefully */
|
/* Cannot connect to slot. Exit gracefully */
|
||||||
(void)RFRemoveReader(readerName, port);
|
(void)RFRemoveReader(readerName, port, REMOVE_READER_NO_FLAG);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,7 +571,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
if (rv != SCARD_S_SUCCESS)
|
if (rv != SCARD_S_SUCCESS)
|
||||||
{
|
{
|
||||||
Log2(PCSC_LOG_ERROR, "%s init failed.", readerName);
|
Log2(PCSC_LOG_ERROR, "%s init failed.", readerName);
|
||||||
(void)RFRemoveReader(readerName, port);
|
(void)RFRemoveReader(readerName, port, REMOVE_READER_NO_FLAG);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -579,7 +579,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
return SCARD_S_SUCCESS;
|
return SCARD_S_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG RFRemoveReader(const char *readerName, int port)
|
LONG RFRemoveReader(const char *readerName, int port, int flags)
|
||||||
{
|
{
|
||||||
char lpcStripReader[MAX_READERNAME];
|
char lpcStripReader[MAX_READERNAME];
|
||||||
int i;
|
int i;
|
||||||
|
@ -610,6 +610,24 @@ LONG RFRemoveReader(const char *readerName, int port)
|
||||||
if ((strncmp(readerName, lpcStripReader, MAX_READERNAME - sizeof(" 00 00")) == 0)
|
if ((strncmp(readerName, lpcStripReader, MAX_READERNAME - sizeof(" 00 00")) == 0)
|
||||||
&& (port == sReadersContexts[i]->port))
|
&& (port == sReadersContexts[i]->port))
|
||||||
{
|
{
|
||||||
|
if (flags & REMOVE_READER_FLAG_REMOVED)
|
||||||
|
{
|
||||||
|
UCHAR tagValue[1];
|
||||||
|
DWORD valueLength;
|
||||||
|
LONG ret;
|
||||||
|
|
||||||
|
/* signal to the driver that the reader has been removed */
|
||||||
|
valueLength = sizeof(tagValue);
|
||||||
|
ret = IFDGetCapabilities(sReadersContexts[i],
|
||||||
|
TAG_IFD_DEVICE_REMOVED, &valueLength, tagValue);
|
||||||
|
if ((IFD_SUCCESS) == ret && (1 == tagValue[0]))
|
||||||
|
{
|
||||||
|
tagValue[0] = 1;
|
||||||
|
ret = IFDSetCapabilities(sReadersContexts[i],
|
||||||
|
TAG_IFD_DEVICE_REMOVED, sizeof tagValue, tagValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* remove the reader */
|
/* remove the reader */
|
||||||
UNREF_READER(sReadersContexts[i])
|
UNREF_READER(sReadersContexts[i])
|
||||||
}
|
}
|
||||||
|
@ -1375,7 +1393,8 @@ void RFCleanupReaders(void)
|
||||||
/* strip the 6 last char ' 00 00' */
|
/* strip the 6 last char ' 00 00' */
|
||||||
lpcStripReader[strlen(lpcStripReader) - 6] = '\0';
|
lpcStripReader[strlen(lpcStripReader) - 6] = '\0';
|
||||||
|
|
||||||
rv = RFRemoveReader(lpcStripReader, sReadersContexts[i]->port);
|
rv = RFRemoveReader(lpcStripReader, sReadersContexts[i]->port,
|
||||||
|
REMOVE_READER_NO_FLAG);
|
||||||
|
|
||||||
if (rv != SCARD_S_SUCCESS)
|
if (rv != SCARD_S_SUCCESS)
|
||||||
Log2(PCSC_LOG_ERROR, "RFRemoveReader error: 0x%08lX", rv);
|
Log2(PCSC_LOG_ERROR, "RFRemoveReader error: 0x%08lX", rv);
|
||||||
|
@ -1542,7 +1561,7 @@ void RFReCheckReaderConf(void)
|
||||||
Log2(PCSC_LOG_INFO, "Reader %s disappeared",
|
Log2(PCSC_LOG_INFO, "Reader %s disappeared",
|
||||||
reader_list[i].pcFriendlyname);
|
reader_list[i].pcFriendlyname);
|
||||||
(void)RFRemoveReader(reader_list[i].pcFriendlyname,
|
(void)RFRemoveReader(reader_list[i].pcFriendlyname,
|
||||||
reader_list[r].channelId);
|
reader_list[r].channelId, REMOVE_READER_NO_FLAG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1564,3 +1583,18 @@ void RFReCheckReaderConf(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int RFGetPowerState(READER_CONTEXT * rContext)
|
||||||
|
{
|
||||||
|
(void)pthread_mutex_lock(&rContext->powerState_lock);
|
||||||
|
int result = rContext->powerState;
|
||||||
|
(void)pthread_mutex_unlock(&rContext->powerState_lock);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFSetPowerState(READER_CONTEXT * rContext, int value)
|
||||||
|
{
|
||||||
|
(void)pthread_mutex_lock(&rContext->powerState_lock);
|
||||||
|
rContext->powerState = value;
|
||||||
|
(void)pthread_mutex_unlock(&rContext->powerState_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,7 +148,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
LONG RFAllocateReaderSpace(unsigned int);
|
LONG RFAllocateReaderSpace(unsigned int);
|
||||||
LONG RFAddReader(const char *, int, const char *, const char *);
|
LONG RFAddReader(const char *, int, const char *, const char *);
|
||||||
LONG RFRemoveReader(const char *, int);
|
LONG RFRemoveReader(const char *, int, int);
|
||||||
LONG RFSetReaderName(READER_CONTEXT *, const char *, const char *, int);
|
LONG RFSetReaderName(READER_CONTEXT *, const char *, const char *, int);
|
||||||
LONG RFReaderInfo(const char *, /*@out@*/ struct ReaderContext **);
|
LONG RFReaderInfo(const char *, /*@out@*/ struct ReaderContext **);
|
||||||
LONG RFReaderInfoById(SCARDHANDLE, /*@out@*/ struct ReaderContext **);
|
LONG RFReaderInfoById(SCARDHANDLE, /*@out@*/ struct ReaderContext **);
|
||||||
|
@ -173,5 +173,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
void RFWaitForReaderInit(void);
|
void RFWaitForReaderInit(void);
|
||||||
int RFStartSerialReaders(const char *readerconf);
|
int RFStartSerialReaders(const char *readerconf);
|
||||||
void RFReCheckReaderConf(void);
|
void RFReCheckReaderConf(void);
|
||||||
|
int RFGetPowerState(READER_CONTEXT *);
|
||||||
|
void RFSetPowerState(READER_CONTEXT *, int value);
|
||||||
|
|
||||||
|
#define REMOVE_READER_NO_FLAG 0
|
||||||
|
#define REMOVE_READER_FLAG_REMOVED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Makefile.in generated by automake 1.16.4 from Makefile.am.
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
|
|
@ -715,10 +715,8 @@ LONG SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the card is now in use */
|
/* the card is now in use */
|
||||||
(void)pthread_mutex_lock(&rContext->powerState_lock);
|
RFSetPowerState(rContext, POWER_STATE_IN_USE);
|
||||||
rContext->powerState = POWER_STATE_IN_USE;
|
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_IN_USE");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_IN_USE");
|
||||||
(void)pthread_mutex_unlock(&rContext->powerState_lock);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -900,7 +898,7 @@ LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
|
||||||
/* SCARD_UNPOWER_CARD */
|
/* SCARD_UNPOWER_CARD */
|
||||||
rv = IFDPowerICC(rContext, IFD_POWER_DOWN, NULL, NULL);
|
rv = IFDPowerICC(rContext, IFD_POWER_DOWN, NULL, NULL);
|
||||||
|
|
||||||
rContext->powerState = POWER_STATE_UNPOWERED;
|
RFSetPowerState(rContext, POWER_STATE_UNPOWERED);
|
||||||
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
Log1(PCSC_LOG_DEBUG, "powerState: POWER_STATE_UNPOWERED");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue