New upstream version 1.8.23

This commit is contained in:
Ludovic Rousseau 2017-12-19 18:42:44 +01:00
parent acc3243be1
commit c13142777b
23 changed files with 429 additions and 868 deletions

View File

@ -1,3 +1,11 @@
1.8.23: Ludovic Rousseau
18 December 2017
- use libsystemd instead sd-daemon.{c,h}
- install_spy.sh: add support of Ubuntu
- spy: add support SCardStatus() with NULL pcbAtrLen
- Some other minor improvements
1.8.22: Ludovic Rousseau
17 June 2017
- SCardCancel() was broken in 1.8.21. The call was bloking.

View File

@ -1,4 +1,236 @@
commit 696023944649e0c52802e20994fb78d6b24d4efd (HEAD -> master, tag: pcsc-1.8.22, zotac/master, origin/master, origin/HEAD, github/master)
commit 09f0f85b86e7488cf26642dd17150f76bed5300c (HEAD -> master)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Mon Dec 18 19:56:49 2017 +0100
Release 1.8.23
ChangeLog | 8 ++++++++
configure.ac | 2 +-
2 files changed, 9 insertions(+), 1 deletion(-)
commit 1dde8427236fa988e9f488baa46d7316691a5555 (origin/master, origin/HEAD)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Nov 14 15:09:25 2017 +0100
spy: add support SCardStatus() with NULL pcbAtrLen
If an application calls SCardStatus() with pcbAtrLen = NULL then the trace
interpretation was wrong.
The problematic trace was:
7F9414EF6700@>|1510667088|620972|SCardStatus
7F9414EF6700@0x7B0DDEA3
7F9414EF6700@NULL
7F9414EF6700@NULL
7F9414EF6700@NULL
7F9414EF6700@""
7F9414EF6700@NULL
7F9414EF6700@NULL
7F9414EF6700@NULL
7F9414EF6700@<|1510667088|621107|SCardStatus|Command successful.|0x00000000
SCardStatus
i hCard: 0x7B0DDEA3
i pcchReaderLen NULL
i pcbAtrLen NULL
o cchReaderLen NULL
o mszReaderName ""
o dwState NULL
o dwProtocol NULL
o bAtrLen NULL
o bAtr
=> Command successful. (SCARD_S_SUCCESS [0x00000000]) [0.000135]
In the trace above the value bAtr is not known (bAtrLen has no value) so
nothing is displayed.
A more classic trace is:
7FF91179D700@>|1510668989|105007|SCardStatus
7FF91179D700@0x2E753ED9
7FF91179D700@0x00000000
7FF91179D700@0x00000000
7FF91179D700@0x0000001D
7FF91179D700@NULL
7FF91179D700@0x00050034
7FF91179D700@0x00000001
7FF91179D700@0x00000014
7FF91179D700@NULL
7FF91179D700@<|1510668989|105301|SCardStatus|Command successful.|0x00000000
7FF91179D700@>|1510668989|105306|SCardStatus
7FF91179D700@0x2E753ED9
7FF91179D700@0x0000001D
7FF91179D700@0x00000021
7FF91179D700@0x0000001D
7FF91179D700@Gemalto PC Twin Reader 00 00
7FF91179D700@0x00050034
7FF91179D700@0x00000001
7FF91179D700@0x00000014
7FF91179D700@3B 7F 96 00 00 80 31 80 65 B0 85 03 00 EF 12 0F FE 82 90 00
7FF91179D700@<|1510668989|105365|SCardStatus|Command successful.|0x00000000
giving:
SCardStatus
i hCard: 0x2E753ED9
i pcchReaderLen 0x00000000 (0)
i pcbAtrLen 0x00000000 (0)
o cchReaderLen 0x0000001D (29)
o mszReaderName NULL
o dwState 0x00050034 (327732)
o dwProtocol 0x00000001 (1)
o bAtrLen 0x00000014 (20)
o bAtr NULL
=> Command successful. (SCARD_S_SUCCESS [0x00000000]) [0.000294]
SCardStatus
i hCard: 0x2E753ED9
i pcchReaderLen 0x0000001D (29)
i pcbAtrLen 0x00000021 (33)
o cchReaderLen 0x0000001D (29)
o mszReaderName Gemalto PC Twin Reader 00 00
o dwState 0x00050034 (327732)
o dwProtocol 0x00000001 (1)
o bAtrLen 0x00000014 (20)
o bAtr 3B 7F 96 00 00 80 31 80 65 B0 85 03 00 EF 12 0F FE 82 90 00
=> Command successful. (SCARD_S_SUCCESS [0x00000000]) [0.000059]
src/spy/pcsc-spy | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
commit 661c56584f3806ca47944a2c989eb79b9b89b74d
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Nov 14 13:32:17 2017 +0100
spy: add support of Ubuntu
On Ubuntu libpcsclite.so.1 is in /lib/... but libpcscspy.so is in
/usr/lib/...
The 2 libraries are not in the same directory.
src/spy/install_spy.sh | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
commit c19857227058b38a37f19e4e6bf83bb4a93ecb7f
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Sep 26 15:13:54 2017 +0200
SCardGetStatusChange(): fix comment
After cancellable is set to FALSE then SCardCancel() will just return
immediatly with success.
src/winscard_clnt.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
commit 7424c7a32006c332383e9d17827b700dc369913f
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Sep 19 22:18:16 2017 +0200
.gitignore: remove no more present files
.gitignore | 2 --
1 file changed, 2 deletions(-)
commit 180e5c678365b7d1b078f49b0ae881d3ce6f10a5
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Sep 19 22:09:37 2017 +0200
.gitignore: sort lines
.gitignore | 56 ++++++++++++++++++++++++++++----------------------------
1 file changed, 28 insertions(+), 28 deletions(-)
commit 0e5ef3e2cb399c472ca91fb1270ac3e294bbd9d6
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Sep 19 22:07:31 2017 +0200
.gitignore: ignore generated files
.gitignore | 8 ++++++++
1 file changed, 8 insertions(+)
commit 1324532eee4342aa17ad16617c8d6ae03b3e4b96
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Mon Aug 21 13:13:08 2017 +0200
RFAddReader(): simplify code
The cases rv != IFD_SUCCESS and dwGetSize != 1 are already managed by
the previous if(). So no need to test again these values.
src/readerfactory.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
commit 5905bbe11414c131a32a7d84829eaa5d060bd55d
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Mon Aug 21 13:10:52 2017 +0200
Fix compiler warning (gcc 7)
Use an intermediate variable nbSlots.
readerfactory.c: In function RFAddReader:
readerfactory.c:457:51: warning: %02X directive output may be truncated writing between 2 and 8 bytes into a region of size 3 [-Wformat-truncation=]
snprintf(tmpReader + strlen(tmpReader) - 2, 3, "%02X", j);
^~~~
readerfactory.c:457:50: note: directive argument in the range [1, 2147483646]
snprintf(tmpReader + strlen(tmpReader) - 2, 3, "%02X", j);
^~~~~~
In file included from /usr/include/stdio.h:938:0,
from readerfactory.c:43:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:64:10: note: __builtin___snprintf_chk output between 3 and 9 bytes into a destination of size 3
return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
__bos (__s), __fmt, __va_arg_pack ());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/readerfactory.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
commit f1fa9106513ac6990719c677f053bdee558c661d
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Tue Aug 1 10:11:29 2017 +0200
configure.ac: fix typo in help message
configure.ac | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 8946edadaca353d65112664a5fcd7bbe1be54ed5
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Wed Jul 12 17:59:48 2017 +0200
simclist: fix a potential memory leak
Changes in a801c6e613fde89c09c755a20003ab82fd6a5c47 added tests and
returns in case of errors.
If something fails in list_insert_at() we must free the memory allocated
for the new element (that was not inserted).
src/simclist.c | 7 +++++++
1 file changed, 7 insertions(+)
commit 30e10951f81b9480e788965f89d0d4d0aee909c0 (zotac/master, github/master)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Thu Jul 13 17:52:13 2017 +0200
Use libsystemd instead sd-daemon.{c,h}
Remove files src/sd-daemon.{c,h} and use libsystemd to get
sd_listen_fds() and sd_is_socket() implementations.
So we do not have to maintain systemd specific code.
Use --disable-systemd if you do not have libsystemd available. In that
case I think you do not use systemd either.
configure.ac | 12 ++
src/Makefile.am | 10 +-
src/pcscdaemon.c | 8 +-
src/sd-daemon.c | 526 -------------------------------------------------
src/sd-daemon.h | 277 --------------------------
src/winscard_msg_srv.c | 6 +-
6 files changed, 26 insertions(+), 813 deletions(-)
commit 696023944649e0c52802e20994fb78d6b24d4efd (tag: pcsc-1.8.22)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Sat Jun 17 08:56:54 2017 +0200

View File

@ -248,6 +248,8 @@ LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
LIBTOOL = @LIBTOOL@
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
LIBUDEV_LIBS = @LIBUDEV_LIBS@

View File

@ -200,6 +200,9 @@
/* directory containing IPC files */
#undef USE_IPCDIR
/* Use libsystemd */
#undef USE_LIBSYSTEMD
/* Use serial conf file mechanism */
#undef USE_SERIAL

117
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for pcsc-lite 1.8.22.
# Generated by GNU Autoconf 2.69 for pcsc-lite 1.8.23.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -587,8 +587,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='pcsc-lite'
PACKAGE_TARNAME='pcsc-lite'
PACKAGE_VERSION='1.8.22'
PACKAGE_STRING='pcsc-lite 1.8.22'
PACKAGE_VERSION='1.8.23'
PACKAGE_STRING='pcsc-lite 1.8.23'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
@ -659,6 +659,8 @@ ENABLE_USB_FALSE
ENABLE_USB_TRUE
ENABLE_SERIAL_FALSE
ENABLE_SERIAL_TRUE
LIBSYSTEMD_LIBS
LIBSYSTEMD_CFLAGS
SYMBOL_VISIBILITY
ALLOCA
LIBOBJS
@ -805,6 +807,7 @@ with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
enable_libsystemd
enable_serial
enable_usb
enable_libudev
@ -831,6 +834,8 @@ PKG_CONFIG
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
LT_SYS_LIBRARY_PATH
LIBSYSTEMD_CFLAGS
LIBSYSTEMD_LIBS
LIBUDEV_CFLAGS
LIBUDEV_LIBS
LIBUSB_CFLAGS
@ -1387,7 +1392,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 pcsc-lite 1.8.22 to adapt to many kinds of systems.
\`configure' configures pcsc-lite 1.8.23 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1458,7 +1463,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of pcsc-lite 1.8.22:";;
short | recursive ) echo "Configuration of pcsc-lite 1.8.23:";;
esac
cat <<\_ACEOF
@ -1480,6 +1485,7 @@ Optional Features:
--enable-fast-install[=PKGS]
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
--disable-libsystemd do not use libsystemd
--disable-serial do not use serial reader.conf file
--disable-usb do not use usb hotplug
--disable-libudev do not use libudev
@ -1528,6 +1534,10 @@ Some influential environment variables:
path overriding pkg-config's built-in search path
LT_SYS_LIBRARY_PATH
User-defined run-time library search path.
LIBSYSTEMD_CFLAGS
C compiler flags for LIBSYSTEMD, overriding pkg-config
LIBSYSTEMD_LIBS
linker flags for LIBSYSTEMD, overriding pkg-config
LIBUDEV_CFLAGS
C compiler flags for LIBUDEV, overriding pkg-config
LIBUDEV_LIBS
@ -1605,7 +1615,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
pcsc-lite configure 1.8.22
pcsc-lite configure 1.8.23
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@ -2081,7 +2091,7 @@ 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 pcsc-lite $as_me 1.8.22, which was
It was created by pcsc-lite $as_me 1.8.23, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@ -2945,7 +2955,7 @@ fi
# Define the identity of the package.
PACKAGE='pcsc-lite'
VERSION='1.8.22'
VERSION='1.8.23'
cat >>confdefs.h <<_ACEOF
@ -14654,6 +14664,92 @@ if test "x$ac_cv_lib_rt_mq_getattr" = xyes; then :
fi
# check for libsystemd
# Check whether --enable-libsystemd was given.
if test "${enable_libsystemd+set}" = set; then :
enableval=$enable_libsystemd; use_libsystemd="${enableval}"
else
use_libsystemd="yes"
fi
if test "$use_libsystemd" != "no"; then
pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSYSTEMD" >&5
$as_echo_n "checking for LIBSYSTEMD... " >&6; }
if test -n "$LIBSYSTEMD_CFLAGS"; then
pkg_cv_LIBSYSTEMD_CFLAGS="$LIBSYSTEMD_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5
($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_LIBSYSTEMD_CFLAGS=`$PKG_CONFIG --cflags "libsystemd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$LIBSYSTEMD_LIBS"; then
pkg_cv_LIBSYSTEMD_LIBS="$LIBSYSTEMD_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5
($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_LIBSYSTEMD_LIBS=`$PKG_CONFIG --libs "libsystemd" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
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
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
LIBSYSTEMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd" 2>&1`
else
LIBSYSTEMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$LIBSYSTEMD_PKG_ERRORS" >&5
as_fn_error $? "install libsystemd-dev or use --disable-libsystemd" "$LINENO" 5
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "install libsystemd-dev or use --disable-libsystemd" "$LINENO" 5
else
LIBSYSTEMD_CFLAGS=$pkg_cv_LIBSYSTEMD_CFLAGS
LIBSYSTEMD_LIBS=$pkg_cv_LIBSYSTEMD_LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
fi
$as_echo "#define USE_LIBSYSTEMD 1" >>confdefs.h
PCSCLITE_FEATURES="${PCSCLITE_FEATURES} libsystemd"
fi
# --disable-serial
# Check whether --enable-serial was given.
if test "${enable_serial+set}" = set; then :
@ -15513,6 +15609,7 @@ ATR parsing messages: ${debugatr}
ipcdir: ${ipcdir}
use serial: ${use_serial}
use usb: ${use_usb}
use libsystemd: ${use_libsystemd}
systemd unit directory: ${with_systemdsystemunitdir}
serial config dir.: ${confdir_exp}
filter: ${use_filter}
@ -16075,7 +16172,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by pcsc-lite $as_me 1.8.22, which was
This file was extended by pcsc-lite $as_me 1.8.23, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -16141,7 +16238,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
pcsc-lite config.status 1.8.22
pcsc-lite config.status 1.8.23
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"

View File

@ -3,7 +3,7 @@
AC_PREREQ([2.69])
AC_INIT([pcsc-lite],[1.8.22])
AC_INIT([pcsc-lite],[1.8.23])
AC_CONFIG_SRCDIR(src/pcscdaemon.c)
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
AC_CONFIG_HEADERS([config.h])
@ -150,6 +150,17 @@ AC_CHECK_LIB(socket, socket, [LIBS="$LIBS -lsocket"])
# check for mq_getattr()
AC_CHECK_LIB(rt, mq_getattr, [LIBS="$LIBS -lrt"])
# check for libsystemd
AC_ARG_ENABLE(libsystemd,
AS_HELP_STRING([--disable-libsystemd],[do not use libsystemd]),
[ use_libsystemd="${enableval}" ], [ use_libsystemd="yes" ] )
if test "$use_libsystemd" != "no"; then
PKG_CHECK_MODULES(LIBSYSTEMD, libsystemd,,
[ AC_MSG_ERROR([install libsystemd-dev or use --disable-libsystemd]) ])
AC_DEFINE(USE_LIBSYSTEMD, 1, [Use libsystemd])
PCSCLITE_FEATURES="${PCSCLITE_FEATURES} libsystemd"
fi
# --disable-serial
AC_ARG_ENABLE(serial,
AS_HELP_STRING([--disable-serial],[do not use serial reader.conf file]),
@ -431,6 +442,7 @@ ATR parsing messages: ${debugatr}
ipcdir: ${ipcdir}
use serial: ${use_serial}
use usb: ${use_usb}
use libsystemd: ${use_libsystemd}
systemd unit directory: ${with_systemdsystemunitdir}
serial config dir.: ${confdir_exp}
filter: ${use_filter}

View File

@ -262,6 +262,8 @@ LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
LIBTOOL = @LIBTOOL@
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
LIBUDEV_LIBS = @LIBUDEV_LIBS@

View File

@ -219,6 +219,8 @@ LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
LIBTOOL = @LIBTOOL@
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
LIBUDEV_LIBS = @LIBUDEV_LIBS@

View File

@ -195,6 +195,8 @@ LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
LIBTOOL = @LIBTOOL@
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
LIBUDEV_LIBS = @LIBUDEV_LIBS@

View File

@ -63,8 +63,6 @@ pcscd_SOURCES = \
prothandler.h \
readerfactory.c \
readerfactory.h \
sd-daemon.c \
sd-daemon.h \
simclist.c \
simclist.h \
sys_generic.h \
@ -79,9 +77,9 @@ pcscd_SOURCES = \
winscard_svc.c \
winscard_svc.h
pcscd_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(LIBUSB_CFLAGS) $(LIBUDEV_CFLAGS) \
$(POLKIT_CFLAGS) \
$(POLKIT_CFLAGS) $(LIBSYSTEMD_CFLAGS) \
-DPCSCD -DSIMCLIST_NO_DUMPRESTORE
pcscd_LDFLAGS = $(LDFLAGS) -export-dynamic
pcscd_LDFLAGS = $(LDFLAGS) $(LIBSYSTEMD_LIBS) -export-dynamic
pcscd_LDADD = \
$(PTHREAD_LIBS) $(COREFOUNDATION) \
$(LIBUSB_LIBS) $(IOKIT) $(LIBUDEV_LIBS) \
@ -92,10 +90,6 @@ fix-rights: install-sbinPROGRAMS
chgrp pcscd $(DESTDIR)$(sbindir)/pcscd
chmod g+s $(DESTDIR)$(sbindir)/pcscd
update-systemd:
curl -O http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
curl -O http://cgit.freedesktop.org/systemd/systemd/plain/src/systemd/sd-daemon.h
testpcsc_SOURCES = testpcsc.c
testpcsc_LDADD = libpcsclite.la

View File

@ -171,11 +171,11 @@ am__pcscd_SOURCES_DIST = auth.c auth.h atrhandler.c atrhandler.h \
parser.h pcscdaemon.c pcscd.h PCSC/debuglog.h \
PCSC/ifdhandler.h PCSC/pcsclite.h PCSC/winscard.h \
PCSC/wintypes.h prothandler.c prothandler.h readerfactory.c \
readerfactory.h sd-daemon.c sd-daemon.h simclist.c simclist.h \
sys_generic.h sys_unix.c tokenparser.l hotplug_libudev.c \
hotplug_libusb.c hotplug_linux.c hotplug_macosx.c utils.c \
utils.h winscard.c winscard_msg.c winscard_msg.h \
winscard_msg_srv.c winscard_svc.c winscard_svc.h
readerfactory.h simclist.c simclist.h sys_generic.h sys_unix.c \
tokenparser.l hotplug_libudev.c hotplug_libusb.c \
hotplug_linux.c hotplug_macosx.c utils.c utils.h winscard.c \
winscard_msg.c winscard_msg.h winscard_msg_srv.c \
winscard_svc.c winscard_svc.h
@ENABLE_SERIAL_TRUE@am__objects_1 = pcscd-configfile.$(OBJEXT)
@ENABLE_USB_TRUE@am__objects_2 = pcscd-tokenparser.$(OBJEXT) \
@ENABLE_USB_TRUE@ pcscd-hotplug_libudev.$(OBJEXT) \
@ -188,11 +188,11 @@ am_pcscd_OBJECTS = pcscd-auth.$(OBJEXT) pcscd-atrhandler.$(OBJEXT) \
pcscd-dyn_unix.$(OBJEXT) pcscd-eventhandler.$(OBJEXT) \
pcscd-hotplug_generic.$(OBJEXT) pcscd-ifdwrapper.$(OBJEXT) \
pcscd-pcscdaemon.$(OBJEXT) pcscd-prothandler.$(OBJEXT) \
pcscd-readerfactory.$(OBJEXT) pcscd-sd-daemon.$(OBJEXT) \
pcscd-simclist.$(OBJEXT) pcscd-sys_unix.$(OBJEXT) \
$(am__objects_2) pcscd-utils.$(OBJEXT) \
pcscd-winscard.$(OBJEXT) pcscd-winscard_msg.$(OBJEXT) \
pcscd-winscard_msg_srv.$(OBJEXT) pcscd-winscard_svc.$(OBJEXT)
pcscd-readerfactory.$(OBJEXT) pcscd-simclist.$(OBJEXT) \
pcscd-sys_unix.$(OBJEXT) $(am__objects_2) \
pcscd-utils.$(OBJEXT) pcscd-winscard.$(OBJEXT) \
pcscd-winscard_msg.$(OBJEXT) pcscd-winscard_msg_srv.$(OBJEXT) \
pcscd-winscard_svc.$(OBJEXT)
pcscd_OBJECTS = $(am_pcscd_OBJECTS)
pcscd_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
@ -366,6 +366,8 @@ LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
LIBTOOL = @LIBTOOL@
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
LIBUDEV_LIBS = @LIBUDEV_LIBS@
@ -530,8 +532,6 @@ pcscd_SOURCES = \
prothandler.h \
readerfactory.c \
readerfactory.h \
sd-daemon.c \
sd-daemon.h \
simclist.c \
simclist.h \
sys_generic.h \
@ -547,10 +547,10 @@ pcscd_SOURCES = \
winscard_svc.h
pcscd_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(LIBUSB_CFLAGS) $(LIBUDEV_CFLAGS) \
$(POLKIT_CFLAGS) \
$(POLKIT_CFLAGS) $(LIBSYSTEMD_CFLAGS) \
-DPCSCD -DSIMCLIST_NO_DUMPRESTORE
pcscd_LDFLAGS = $(LDFLAGS) -export-dynamic
pcscd_LDFLAGS = $(LDFLAGS) $(LIBSYSTEMD_LIBS) -export-dynamic
pcscd_LDADD = \
$(PTHREAD_LIBS) $(COREFOUNDATION) \
$(LIBUSB_LIBS) $(IOKIT) $(LIBUDEV_LIBS) \
@ -764,7 +764,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-pcscdaemon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-prothandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-readerfactory.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-sd-daemon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-simclist.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-sys_unix.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-tokenparser.Po@am__quote@
@ -1027,20 +1026,6 @@ pcscd-readerfactory.obj: readerfactory.c
@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-readerfactory.obj `if test -f 'readerfactory.c'; then $(CYGPATH_W) 'readerfactory.c'; else $(CYGPATH_W) '$(srcdir)/readerfactory.c'; fi`
pcscd-sd-daemon.o: sd-daemon.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-sd-daemon.o -MD -MP -MF $(DEPDIR)/pcscd-sd-daemon.Tpo -c -o pcscd-sd-daemon.o `test -f 'sd-daemon.c' || echo '$(srcdir)/'`sd-daemon.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-sd-daemon.Tpo $(DEPDIR)/pcscd-sd-daemon.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sd-daemon.c' object='pcscd-sd-daemon.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-sd-daemon.o `test -f 'sd-daemon.c' || echo '$(srcdir)/'`sd-daemon.c
pcscd-sd-daemon.obj: sd-daemon.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-sd-daemon.obj -MD -MP -MF $(DEPDIR)/pcscd-sd-daemon.Tpo -c -o pcscd-sd-daemon.obj `if test -f 'sd-daemon.c'; then $(CYGPATH_W) 'sd-daemon.c'; else $(CYGPATH_W) '$(srcdir)/sd-daemon.c'; fi`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-sd-daemon.Tpo $(DEPDIR)/pcscd-sd-daemon.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sd-daemon.c' object='pcscd-sd-daemon.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-sd-daemon.obj `if test -f 'sd-daemon.c'; then $(CYGPATH_W) 'sd-daemon.c'; else $(CYGPATH_W) '$(srcdir)/sd-daemon.c'; fi`
pcscd-simclist.o: simclist.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcscd_CFLAGS) $(CFLAGS) -MT pcscd-simclist.o -MD -MP -MF $(DEPDIR)/pcscd-simclist.Tpo -c -o pcscd-simclist.o `test -f 'simclist.c' || echo '$(srcdir)/'`simclist.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcscd-simclist.Tpo $(DEPDIR)/pcscd-simclist.Po
@ -1581,10 +1566,6 @@ fix-rights: install-sbinPROGRAMS
chgrp pcscd $(DESTDIR)$(sbindir)/pcscd
chmod g+s $(DESTDIR)$(sbindir)/pcscd
update-systemd:
curl -O http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
curl -O http://cgit.freedesktop.org/systemd/systemd/plain/src/systemd/sd-daemon.h
# pcsc_wirecheck_CFLAGS := $(LIBPCSCLITE_CFLAGS) -DCOMPAT_64BIT_SERVER=1
$(srcdir)/pcsc-wirecheck-dist.c: pcsc-wirecheck-gen

View File

@ -279,7 +279,7 @@ extern const SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci;
#define INFINITE 0xFFFFFFFF /**< Infinite timeout */
#endif
#define PCSCLITE_VERSION_NUMBER "1.8.22" /**< Current version */
#define PCSCLITE_VERSION_NUMBER "1.8.23" /**< Current version */
/** Maximum readers context (a slot is count as a reader) */
#define PCSCLITE_MAX_READERS_CONTEXTS 16

View File

@ -49,7 +49,7 @@
#define PCSCLITE_CSOCK_NAME PCSCLITE_IPC_DIR "/pcscd.comm"
#define PCSCLITE_VERSION_NUMBER "1.8.22" /**< Current version */
#define PCSCLITE_VERSION_NUMBER "1.8.23" /**< Current version */
#define PCSCLITE_STATUS_POLL_RATE 400000 /**< Status polling rate */
#define PCSCLITE_LOCK_POLL_RATE 100000 /**< Lock polling rate */

View File

@ -53,12 +53,14 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#ifdef USE_LIBSYSTEMD
#include <systemd/sd-daemon.h>
#endif
#include "misc.h"
#include "pcsclite.h"
#include "pcscd.h"
#include "debuglog.h"
#include "sd-daemon.h"
#include "winscard_msg.h"
#include "winscard_svc.h"
#include "sys_generic.h"
@ -430,6 +432,7 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
#ifdef USE_LIBSYSTEMD
/*
* Check if systemd passed us any file descriptors
*/
@ -449,6 +452,7 @@ int main(int argc, char **argv)
else
SocketActivated = FALSE;
}
#endif
/*
* test the presence of /var/run/pcscd/pcscd.comm
@ -706,9 +710,11 @@ int main(int argc, char **argv)
/*
* Initialize the comm structure
*/
#ifdef USE_LIBSYSTEMD
if (SocketActivated)
rv = ListenExistingSocket(SD_LISTEN_FDS_START + 0);
else
#endif
rv = InitializeSocket();
if (rv)

View File

@ -410,13 +410,14 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
rv = IFDGetCapabilities((sReadersContexts[dwContext]),
TAG_IFD_SLOTS_NUMBER, &dwGetSize, ucGetData);
if (rv != IFD_SUCCESS || dwGetSize != 1 || ucGetData[0] == 0)
int nbSlots = ucGetData[0];
if (rv != IFD_SUCCESS || dwGetSize != 1 || nbSlots == 0)
/* Reader does not have this defined. Must be a single slot
* reader so we can just return SCARD_S_SUCCESS. */
return SCARD_S_SUCCESS;
if (rv == IFD_SUCCESS && dwGetSize == 1 && ucGetData[0] == 1)
/* Reader has this defined and it only has one slot */
if (1 == nbSlots)
/* Reader has only one slot */
return SCARD_S_SUCCESS;
/*
@ -425,7 +426,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
*/
/* Initialize the rest of the slots */
for (j = 1; j < ucGetData[0]; j++)
for (j = 1; j < nbSlots; j++)
{
char *tmpReader = NULL;
DWORD dwContextB = 0;

View File

@ -1,526 +0,0 @@
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
Copyright 2010 Lennart Poettering
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
***/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/fcntl.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <stddef.h>
#include <limits.h>
#if defined(__linux__)
#include <mqueue.h>
#endif
#include "sd-daemon.h"
#if (__GNUC__ >= 4)
#ifdef SD_EXPORT_SYMBOLS
/* Export symbols */
#define _sd_export_ __attribute__ ((visibility("default")))
#else
/* Don't export the symbols */
#define _sd_export_ __attribute__ ((visibility("hidden")))
#endif
#else
#define _sd_export_
#endif
_sd_export_ int sd_listen_fds(int unset_environment) {
#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
return 0;
#else
int r, fd;
const char *e;
char *p = NULL;
unsigned long l;
if (!(e = getenv("LISTEN_PID"))) {
r = 0;
goto finish;
}
errno = 0;
l = strtoul(e, &p, 10);
if (errno != 0) {
r = -errno;
goto finish;
}
if (!p || *p || l <= 0) {
r = -EINVAL;
goto finish;
}
/* Is this for us? */
if (getpid() != (pid_t) l) {
r = 0;
goto finish;
}
if (!(e = getenv("LISTEN_FDS"))) {
r = 0;
goto finish;
}
errno = 0;
l = strtoul(e, &p, 10);
if (errno != 0) {
r = -errno;
goto finish;
}
if (!p || *p) {
r = -EINVAL;
goto finish;
}
for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {
int flags;
if ((flags = fcntl(fd, F_GETFD)) < 0) {
r = -errno;
goto finish;
}
if (flags & FD_CLOEXEC)
continue;
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
r = -errno;
goto finish;
}
}
r = (int) l;
finish:
if (unset_environment) {
unsetenv("LISTEN_PID");
unsetenv("LISTEN_FDS");
}
return r;
#endif
}
_sd_export_ int sd_is_fifo(int fd, const char *path) {
struct stat st_fd;
if (fd < 0)
return -EINVAL;
memset(&st_fd, 0, sizeof(st_fd));
if (fstat(fd, &st_fd) < 0)
return -errno;
if (!S_ISFIFO(st_fd.st_mode))
return 0;
if (path) {
struct stat st_path;
memset(&st_path, 0, sizeof(st_path));
if (stat(path, &st_path) < 0) {
if (errno == ENOENT || errno == ENOTDIR)
return 0;
return -errno;
}
return
st_path.st_dev == st_fd.st_dev &&
st_path.st_ino == st_fd.st_ino;
}
return 1;
}
_sd_export_ int sd_is_special(int fd, const char *path) {
struct stat st_fd;
if (fd < 0)
return -EINVAL;
if (fstat(fd, &st_fd) < 0)
return -errno;
if (!S_ISREG(st_fd.st_mode) && !S_ISCHR(st_fd.st_mode))
return 0;
if (path) {
struct stat st_path;
if (stat(path, &st_path) < 0) {
if (errno == ENOENT || errno == ENOTDIR)
return 0;
return -errno;
}
if (S_ISREG(st_fd.st_mode) && S_ISREG(st_path.st_mode))
return
st_path.st_dev == st_fd.st_dev &&
st_path.st_ino == st_fd.st_ino;
else if (S_ISCHR(st_fd.st_mode) && S_ISCHR(st_path.st_mode))
return st_path.st_rdev == st_fd.st_rdev;
else
return 0;
}
return 1;
}
static int sd_is_socket_internal(int fd, int type, int listening) {
struct stat st_fd;
if (fd < 0 || type < 0)
return -EINVAL;
if (fstat(fd, &st_fd) < 0)
return -errno;
if (!S_ISSOCK(st_fd.st_mode))
return 0;
if (type != 0) {
int other_type = 0;
socklen_t l = sizeof(other_type);
if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0)
return -errno;
if (l != sizeof(other_type))
return -EINVAL;
if (other_type != type)
return 0;
}
if (listening >= 0) {
int accepting = 0;
socklen_t l = sizeof(accepting);
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0)
return -errno;
if (l != sizeof(accepting))
return -EINVAL;
if (!accepting != !listening)
return 0;
}
return 1;
}
union sockaddr_union {
struct sockaddr sa;
struct sockaddr_in in4;
struct sockaddr_in6 in6;
struct sockaddr_un un;
struct sockaddr_storage storage;
};
_sd_export_ int sd_is_socket(int fd, int family, int type, int listening) {
int r;
if (family < 0)
return -EINVAL;
if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
return r;
if (family > 0) {
union sockaddr_union sockaddr;
socklen_t l;
memset(&sockaddr, 0, sizeof(sockaddr));
l = sizeof(sockaddr);
if (getsockname(fd, &sockaddr.sa, &l) < 0)
return -errno;
if (l < sizeof(sa_family_t))
return -EINVAL;
return sockaddr.sa.sa_family == family;
}
return 1;
}
_sd_export_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) {
union sockaddr_union sockaddr;
socklen_t l;
int r;
if (family != 0 && family != AF_INET && family != AF_INET6)
return -EINVAL;
if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
return r;
memset(&sockaddr, 0, sizeof(sockaddr));
l = sizeof(sockaddr);
if (getsockname(fd, &sockaddr.sa, &l) < 0)
return -errno;
if (l < sizeof(sa_family_t))
return -EINVAL;
if (sockaddr.sa.sa_family != AF_INET &&
sockaddr.sa.sa_family != AF_INET6)
return 0;
if (family > 0)
if (sockaddr.sa.sa_family != family)
return 0;
if (port > 0) {
if (sockaddr.sa.sa_family == AF_INET) {
if (l < sizeof(struct sockaddr_in))
return -EINVAL;
return htons(port) == sockaddr.in4.sin_port;
} else {
if (l < sizeof(struct sockaddr_in6))
return -EINVAL;
return htons(port) == sockaddr.in6.sin6_port;
}
}
return 1;
}
_sd_export_ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
union sockaddr_union sockaddr;
socklen_t l;
int r;
if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
return r;
memset(&sockaddr, 0, sizeof(sockaddr));
l = sizeof(sockaddr);
if (getsockname(fd, &sockaddr.sa, &l) < 0)
return -errno;
if (l < sizeof(sa_family_t))
return -EINVAL;
if (sockaddr.sa.sa_family != AF_UNIX)
return 0;
if (path) {
if (length <= 0)
length = strlen(path);
if (length <= 0)
/* Unnamed socket */
return l == offsetof(struct sockaddr_un, sun_path);
if (path[0])
/* Normal path socket */
return
(l >= offsetof(struct sockaddr_un, sun_path) + length + 1) &&
memcmp(path, sockaddr.un.sun_path, length+1) == 0;
else
/* Abstract namespace socket */
return
(l == offsetof(struct sockaddr_un, sun_path) + length) &&
memcmp(path, sockaddr.un.sun_path, length) == 0;
}
return 1;
}
_sd_export_ int sd_is_mq(int fd, const char *path) {
#if !defined(__linux__)
return 0;
#else
struct mq_attr attr;
if (fd < 0)
return -EINVAL;
if (mq_getattr(fd, &attr) < 0)
return -errno;
if (path) {
char fpath[PATH_MAX];
struct stat a, b;
if (path[0] != '/')
return -EINVAL;
if (fstat(fd, &a) < 0)
return -errno;
strncpy(stpcpy(fpath, "/dev/mqueue"), path, sizeof(fpath) - 12);
fpath[sizeof(fpath)-1] = 0;
if (stat(fpath, &b) < 0)
return -errno;
if (a.st_dev != b.st_dev ||
a.st_ino != b.st_ino)
return 0;
}
return 1;
#endif
}
_sd_export_ int sd_notify(int unset_environment, const char *state) {
#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC)
return 0;
#else
int fd = -1, r;
struct msghdr msghdr;
struct iovec iovec;
union sockaddr_union sockaddr;
const char *e;
if (!state) {
r = -EINVAL;
goto finish;
}
if (!(e = getenv("NOTIFY_SOCKET")))
return 0;
/* Must be an abstract socket, or an absolute path */
if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
r = -EINVAL;
goto finish;
}
if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
r = -errno;
goto finish;
}
memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sa.sa_family = AF_UNIX;
strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
if (sockaddr.un.sun_path[0] == '@')
sockaddr.un.sun_path[0] = 0;
memset(&iovec, 0, sizeof(iovec));
iovec.iov_base = (char*) state;
iovec.iov_len = strlen(state);
memset(&msghdr, 0, sizeof(msghdr));
msghdr.msg_name = &sockaddr;
msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(e);
if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
msghdr.msg_namelen = sizeof(struct sockaddr_un);
msghdr.msg_iov = &iovec;
msghdr.msg_iovlen = 1;
if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) {
r = -errno;
goto finish;
}
r = 1;
finish:
if (unset_environment)
unsetenv("NOTIFY_SOCKET");
if (fd >= 0)
close(fd);
return r;
#endif
}
_sd_export_ int sd_notifyf(int unset_environment, const char *format, ...) {
#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
return 0;
#else
va_list ap;
char *p = NULL;
int r;
va_start(ap, format);
r = vasprintf(&p, format, ap);
va_end(ap);
if (r < 0 || !p)
return -ENOMEM;
r = sd_notify(unset_environment, p);
free(p);
return r;
#endif
}
_sd_export_ int sd_booted(void) {
#if defined(DISABLE_SYSTEMD) || !defined(__linux__)
return 0;
#else
struct stat a, b;
/* We simply test whether the systemd cgroup hierarchy is
* mounted */
if (lstat("/sys/fs/cgroup", &a) < 0)
return 0;
if (lstat("/sys/fs/cgroup/systemd", &b) < 0)
return 0;
return a.st_dev != b.st_dev;
#endif
}

View File

@ -1,277 +0,0 @@
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
#ifndef foosddaemonhfoo
#define foosddaemonhfoo
/***
Copyright 2010 Lennart Poettering
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
***/
#include <sys/types.h>
#include <inttypes.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
Reference implementation of a few systemd related interfaces for
writing daemons. These interfaces are trivial to implement. To
simplify porting we provide this reference implementation.
Applications are welcome to reimplement the algorithms described
here if they do not want to include these two source files.
The following functionality is provided:
- Support for logging with log levels on stderr
- File descriptor passing for socket-based activation
- Daemon startup and status notification
- Detection of systemd boots
You may compile this with -DDISABLE_SYSTEMD to disable systemd
support. This makes all those calls NOPs that are directly related to
systemd (i.e. only sd_is_xxx() will stay useful).
Since this is drop-in code we don't want any of our symbols to be
exported in any case. Hence we declare hidden visibility for all of
them.
You may find an up-to-date version of these source files online:
http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h
http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
This should compile on non-Linux systems, too, but with the
exception of the sd_is_xxx() calls all functions will become NOPs.
See sd-daemon(7) for more information.
*/
#ifndef _sd_printf_attr_
#if __GNUC__ >= 4
#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
#else
#define _sd_printf_attr_(a,b)
#endif
#endif
/*
Log levels for usage on stderr:
fprintf(stderr, SD_NOTICE "Hello World!\n");
This is similar to printk() usage in the kernel.
*/
#define SD_EMERG "<0>" /* system is unusable */
#define SD_ALERT "<1>" /* action must be taken immediately */
#define SD_CRIT "<2>" /* critical conditions */
#define SD_ERR "<3>" /* error conditions */
#define SD_WARNING "<4>" /* warning conditions */
#define SD_NOTICE "<5>" /* normal but significant condition */
#define SD_INFO "<6>" /* informational */
#define SD_DEBUG "<7>" /* debug-level messages */
/* The first passed file descriptor is fd 3 */
#define SD_LISTEN_FDS_START 3
/*
Returns how many file descriptors have been passed, or a negative
errno code on failure. Optionally, removes the $LISTEN_FDS and
$LISTEN_PID file descriptors from the environment (recommended, but
problematic in threaded environments). If r is the return value of
this function you'll find the file descriptors passed as fds
SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative
errno style error code on failure. This function call ensures that
the FD_CLOEXEC flag is set for the passed file descriptors, to make
sure they are not passed on to child processes. If FD_CLOEXEC shall
not be set, the caller needs to unset it after this call for all file
descriptors that are used.
See sd_listen_fds(3) for more information.
*/
int sd_listen_fds(int unset_environment);
/*
Helper call for identifying a passed file descriptor. Returns 1 if
the file descriptor is a FIFO in the file system stored under the
specified path, 0 otherwise. If path is NULL a path name check will
not be done and the call only verifies if the file descriptor
refers to a FIFO. Returns a negative errno style error code on
failure.
See sd_is_fifo(3) for more information.
*/
int sd_is_fifo(int fd, const char *path);
/*
Helper call for identifying a passed file descriptor. Returns 1 if
the file descriptor is a special character device on the file
system stored under the specified path, 0 otherwise.
If path is NULL a path name check will not be done and the call
only verifies if the file descriptor refers to a special character.
Returns a negative errno style error code on failure.
See sd_is_special(3) for more information.
*/
int sd_is_special(int fd, const char *path);
/*
Helper call for identifying a passed file descriptor. Returns 1 if
the file descriptor is a socket of the specified family (AF_INET,
...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
family is 0 a socket family check will not be done. If type is 0 a
socket type check will not be done and the call only verifies if
the file descriptor refers to a socket. If listening is > 0 it is
verified that the socket is in listening mode. (i.e. listen() has
been called) If listening is == 0 it is verified that the socket is
not in listening mode. If listening is < 0 no listening mode check
is done. Returns a negative errno style error code on failure.
See sd_is_socket(3) for more information.
*/
int sd_is_socket(int fd, int family, int type, int listening);
/*
Helper call for identifying a passed file descriptor. Returns 1 if
the file descriptor is an Internet socket, of the specified family
(either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM,
SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version
check is not done. If type is 0 a socket type check will not be
done. If port is 0 a socket port check will not be done. The
listening flag is used the same way as in sd_is_socket(). Returns a
negative errno style error code on failure.
See sd_is_socket_inet(3) for more information.
*/
int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port);
/*
Helper call for identifying a passed file descriptor. Returns 1 if
the file descriptor is an AF_UNIX socket of the specified type
(SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
a socket type check will not be done. If path is NULL a socket path
check will not be done. For normal AF_UNIX sockets set length to
0. For abstract namespace sockets set length to the length of the
socket name (including the initial 0 byte), and pass the full
socket path in path (including the initial 0 byte). The listening
flag is used the same way as in sd_is_socket(). Returns a negative
errno style error code on failure.
See sd_is_socket_unix(3) for more information.
*/
int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length);
/*
Helper call for identifying a passed file descriptor. Returns 1 if
the file descriptor is a POSIX Message Queue of the specified name,
0 otherwise. If path is NULL a message queue name check is not
done. Returns a negative errno style error code on failure.
*/
int sd_is_mq(int fd, const char *path);
/*
Informs systemd about changed daemon state. This takes a number of
newline separated environment-style variable assignments in a
string. The following variables are known:
READY=1 Tells systemd that daemon startup is finished (only
relevant for services of Type=notify). The passed
argument is a boolean "1" or "0". Since there is
little value in signaling non-readiness the only
value daemons should send is "READY=1".
STATUS=... Passes a single-line status string back to systemd
that describes the daemon state. This is free-from
and can be used for various purposes: general state
feedback, fsck-like programs could pass completion
percentages and failing programs could pass a human
readable error message. Example: "STATUS=Completed
66% of file system check..."
ERRNO=... If a daemon fails, the errno-style error code,
formatted as string. Example: "ERRNO=2" for ENOENT.
BUSERROR=... If a daemon fails, the D-Bus error-style error
code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut"
MAINPID=... The main pid of a daemon, in case systemd did not
fork off the process itself. Example: "MAINPID=4711"
Daemons can choose to send additional variables. However, it is
recommended to prefix variable names not listed above with X_.
Returns a negative errno-style error code on failure. Returns > 0
if systemd could be notified, 0 if it couldn't possibly because
systemd is not running.
Example: When a daemon finished starting up, it could issue this
call to notify systemd about it:
sd_notify(0, "READY=1");
See sd_notifyf() for more complete examples.
See sd_notify(3) for more information.
*/
int sd_notify(int unset_environment, const char *state);
/*
Similar to sd_notify() but takes a format string.
Example 1: A daemon could send the following after initialization:
sd_notifyf(0, "READY=1\n"
"STATUS=Processing requests...\n"
"MAINPID=%lu",
(unsigned long) getpid());
Example 2: A daemon could send the following shortly before
exiting, on failure:
sd_notifyf(0, "STATUS=Failed to start up: %s\n"
"ERRNO=%i",
strerror(errno),
errno);
See sd_notifyf(3) for more information.
*/
int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3);
/*
Returns > 0 if the system was booted with systemd. Returns < 0 on
error. Returns 0 if the system was not booted with systemd. Note
that all of the functions above handle non-systemd boots just
fine. You should NOT protect them with a call to this function. Also
note that this function checks whether the system, not the user
session is controlled by systemd. However the functions above work
for both user and system services.
See sd_booted(3) for more information.
*/
int sd_booted(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -508,7 +508,10 @@ int list_insert_at(list_t *restrict l, const void *data, unsigned int pos) {
size_t datalen = l->attrs.meter(data);
lent->data = (struct list_entry_s *)malloc(datalen);
if (NULL == lent->data)
{
free(lent);
return -1;
}
memcpy(lent->data, data, datalen);
} else {
lent->data = (void*)data;
@ -517,7 +520,11 @@ int list_insert_at(list_t *restrict l, const void *data, unsigned int pos) {
/* actually append element */
prec = list_findpos(l, pos-1);
if (NULL == prec)
{
free(lent->data);
free(lent);
return -1;
}
succ = prec->next;
prec->next = lent;

View File

@ -248,6 +248,8 @@ LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
LIBTOOL = @LIBTOOL@
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
LIBUDEV_LIBS = @LIBUDEV_LIBS@

View File

@ -13,7 +13,12 @@ DIR=$(echo $DIR | cut -d'=' -f2 | cut -d' ' -f2)
# get the directory part only: /usr/lib/x86_64-linux-gnu
DIR=$(dirname $DIR)
# find the spying library
SPY=$(ldconfig --print-cache | grep libpcscspy.so)
SPY=$(echo $SPY | cut -d'=' -f2 | cut -d' ' -f2)
echo "Using directory:" $DIR
echo "Spying library is:" $SPY
cd $DIR
@ -28,5 +33,5 @@ else
fi
# link to the spy library
ln -sf libpcscspy.so.0.0.0 libpcsclite.so.1.0.0
ln -sf $SPY libpcsclite.so.1.0.0
ln -sf libpcsclite.so.1.0.0 libpcsclite.so.1

View File

@ -651,8 +651,11 @@ class PCSCspy(object):
self.log_out2("mszReaderName")
self.log_out2("dwState")
self.log_out2("dwProtocol")
self.log_out2("bAtrLen")
self.log_out2("bAtr")
data = self.log_out2("bAtrLen")
if not data == "NULL":
self.log_out2("bAtr")
else:
self.log_out("bAtr")
self._log_rv()
def _SCardReconnect(self):

View File

@ -2081,7 +2081,8 @@ LONG SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout,
&waitStatusStruct, sizeof(waitStatusStruct),
currentContextMap->dwClientID, dwTime);
/* another thread can do SCardCancel() */
/* SCardCancel() will return immediatly with success
* because something changed on the daemon side. */
currentContextMap->cancellable = FALSE;
/* timeout */

View File

@ -57,10 +57,12 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifdef HAVE_SYS_FILIO_H
#include <sys/filio.h>
#endif
#ifdef USE_LIBSYSTEMD
#include <systemd/sd-daemon.h>
#endif
#include "misc.h"
#include "pcscd.h"
#include "sd-daemon.h"
#include "winscard.h"
#include "debuglog.h"
#include "winscard_msg.h"
@ -174,6 +176,7 @@ INTERNAL int32_t InitializeSocket(void)
* @retval 0 Success
* @retval -1 Passed FD is not an UNIX socket.
*/
#ifdef USE_LIBSYSTEMD
INTERNAL int32_t ListenExistingSocket(int fd)
{
if (!sd_is_socket(fd, AF_UNIX, SOCK_STREAM, -1))
@ -185,6 +188,7 @@ INTERNAL int32_t ListenExistingSocket(int fd)
commonSocket = fd;
return 0;
}
#endif
/**
* @brief Looks for messages sent by clients.