diff --git a/ChangeLog b/ChangeLog index f3e6817..778f0e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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. diff --git a/ChangeLog.git b/ChangeLog.git index 6ce99d8..9bf3ee7 100644 --- a/ChangeLog.git +++ b/ChangeLog.git @@ -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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 Date: Sat Jun 17 08:56:54 2017 +0200 diff --git a/Makefile.in b/Makefile.in index bbdf646..788e427 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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@ diff --git a/config.h.in b/config.h.in index 153bc6d..3cbf854 100644 --- a/config.h.in +++ b/config.h.in @@ -200,6 +200,9 @@ /* directory containing IPC files */ #undef USE_IPCDIR +/* Use libsystemd */ +#undef USE_LIBSYSTEMD + /* Use serial conf file mechanism */ #undef USE_SERIAL diff --git a/configure b/configure index 5176a54..f703d51 100755 --- a/configure +++ b/configure @@ -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\\" diff --git a/configure.ac b/configure.ac index 00276b4..9704a18 100644 --- a/configure.ac +++ b/configure.ac @@ -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} diff --git a/doc/Makefile.in b/doc/Makefile.in index a3825cb..73bad4e 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -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@ diff --git a/doc/example/Makefile.in b/doc/example/Makefile.in index 6d4a6d2..c24e245 100644 --- a/doc/example/Makefile.in +++ b/doc/example/Makefile.in @@ -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@ diff --git a/etc/Makefile.in b/etc/Makefile.in index fa4375f..7396aa0 100644 --- a/etc/Makefile.in +++ b/etc/Makefile.in @@ -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@ diff --git a/src/Makefile.am b/src/Makefile.am index 29d699e..7cde8d5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/Makefile.in b/src/Makefile.in index 2db0642..dff82f2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -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 diff --git a/src/PCSC/pcsclite.h b/src/PCSC/pcsclite.h index 23748c3..fa6c998 100644 --- a/src/PCSC/pcsclite.h +++ b/src/PCSC/pcsclite.h @@ -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 diff --git a/src/pcscd.h b/src/pcscd.h index b7e0378..fc8b0fe 100644 --- a/src/pcscd.h +++ b/src/pcscd.h @@ -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 */ diff --git a/src/pcscdaemon.c b/src/pcscdaemon.c index 0102a4e..5511512 100644 --- a/src/pcscdaemon.c +++ b/src/pcscdaemon.c @@ -53,12 +53,14 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef HAVE_GETOPT_H #include #endif +#ifdef USE_LIBSYSTEMD +#include +#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) diff --git a/src/readerfactory.c b/src/readerfactory.c index ef0e673..e42cdc9 100644 --- a/src/readerfactory.c +++ b/src/readerfactory.c @@ -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; diff --git a/src/sd-daemon.c b/src/sd-daemon.c deleted file mode 100644 index e68b708..0000000 --- a/src/sd-daemon.c +++ /dev/null @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(__linux__) -#include -#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 -} diff --git a/src/sd-daemon.h b/src/sd-daemon.h deleted file mode 100644 index 46dc7fd..0000000 --- a/src/sd-daemon.h +++ /dev/null @@ -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 -#include - -#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 diff --git a/src/simclist.c b/src/simclist.c index 27927cd..4f25cdd 100644 --- a/src/simclist.c +++ b/src/simclist.c @@ -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; diff --git a/src/spy/Makefile.in b/src/spy/Makefile.in index 83a6e6b..7504fd1 100644 --- a/src/spy/Makefile.in +++ b/src/spy/Makefile.in @@ -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@ diff --git a/src/spy/install_spy.sh b/src/spy/install_spy.sh index 83dc3eb..0380183 100755 --- a/src/spy/install_spy.sh +++ b/src/spy/install_spy.sh @@ -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 diff --git a/src/spy/pcsc-spy b/src/spy/pcsc-spy index cef0e1e..bf49482 100755 --- a/src/spy/pcsc-spy +++ b/src/spy/pcsc-spy @@ -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): diff --git a/src/winscard_clnt.c b/src/winscard_clnt.c index 4611e53..d822418 100644 --- a/src/winscard_clnt.c +++ b/src/winscard_clnt.c @@ -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 */ diff --git a/src/winscard_msg_srv.c b/src/winscard_msg_srv.c index 59bc363..f5cfc67 100644 --- a/src/winscard_msg_srv.c +++ b/src/winscard_msg_srv.c @@ -57,10 +57,12 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef HAVE_SYS_FILIO_H #include #endif +#ifdef USE_LIBSYSTEMD +#include +#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.