commit
310a42b331
|
@ -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
|
1.8.22: Ludovic Rousseau
|
||||||
17 June 2017
|
17 June 2017
|
||||||
- SCardCancel() was broken in 1.8.21. The call was bloking.
|
- SCardCancel() was broken in 1.8.21. The call was bloking.
|
||||||
|
|
234
ChangeLog.git
234
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 <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>
|
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
|
||||||
Date: Sat Jun 17 08:56:54 2017 +0200
|
Date: Sat Jun 17 08:56:54 2017 +0200
|
||||||
|
|
||||||
|
|
|
@ -248,6 +248,8 @@ LEXLIB = @LEXLIB@
|
||||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
|
||||||
|
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
||||||
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
||||||
|
|
|
@ -200,6 +200,9 @@
|
||||||
/* directory containing IPC files */
|
/* directory containing IPC files */
|
||||||
#undef USE_IPCDIR
|
#undef USE_IPCDIR
|
||||||
|
|
||||||
|
/* Use libsystemd */
|
||||||
|
#undef USE_LIBSYSTEMD
|
||||||
|
|
||||||
/* Use serial conf file mechanism */
|
/* Use serial conf file mechanism */
|
||||||
#undef USE_SERIAL
|
#undef USE_SERIAL
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.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.
|
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
||||||
|
@ -587,8 +587,8 @@ MAKEFLAGS=
|
||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='pcsc-lite'
|
PACKAGE_NAME='pcsc-lite'
|
||||||
PACKAGE_TARNAME='pcsc-lite'
|
PACKAGE_TARNAME='pcsc-lite'
|
||||||
PACKAGE_VERSION='1.8.22'
|
PACKAGE_VERSION='1.8.23'
|
||||||
PACKAGE_STRING='pcsc-lite 1.8.22'
|
PACKAGE_STRING='pcsc-lite 1.8.23'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL=''
|
PACKAGE_URL=''
|
||||||
|
|
||||||
|
@ -659,6 +659,8 @@ ENABLE_USB_FALSE
|
||||||
ENABLE_USB_TRUE
|
ENABLE_USB_TRUE
|
||||||
ENABLE_SERIAL_FALSE
|
ENABLE_SERIAL_FALSE
|
||||||
ENABLE_SERIAL_TRUE
|
ENABLE_SERIAL_TRUE
|
||||||
|
LIBSYSTEMD_LIBS
|
||||||
|
LIBSYSTEMD_CFLAGS
|
||||||
SYMBOL_VISIBILITY
|
SYMBOL_VISIBILITY
|
||||||
ALLOCA
|
ALLOCA
|
||||||
LIBOBJS
|
LIBOBJS
|
||||||
|
@ -805,6 +807,7 @@ with_aix_soname
|
||||||
with_gnu_ld
|
with_gnu_ld
|
||||||
with_sysroot
|
with_sysroot
|
||||||
enable_libtool_lock
|
enable_libtool_lock
|
||||||
|
enable_libsystemd
|
||||||
enable_serial
|
enable_serial
|
||||||
enable_usb
|
enable_usb
|
||||||
enable_libudev
|
enable_libudev
|
||||||
|
@ -831,6 +834,8 @@ PKG_CONFIG
|
||||||
PKG_CONFIG_PATH
|
PKG_CONFIG_PATH
|
||||||
PKG_CONFIG_LIBDIR
|
PKG_CONFIG_LIBDIR
|
||||||
LT_SYS_LIBRARY_PATH
|
LT_SYS_LIBRARY_PATH
|
||||||
|
LIBSYSTEMD_CFLAGS
|
||||||
|
LIBSYSTEMD_LIBS
|
||||||
LIBUDEV_CFLAGS
|
LIBUDEV_CFLAGS
|
||||||
LIBUDEV_LIBS
|
LIBUDEV_LIBS
|
||||||
LIBUSB_CFLAGS
|
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.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures pcsc-lite 1.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]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
@ -1458,7 +1463,7 @@ fi
|
||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of pcsc-lite 1.8.22:";;
|
short | recursive ) echo "Configuration of pcsc-lite 1.8.23:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
|
@ -1480,6 +1485,7 @@ Optional Features:
|
||||||
--enable-fast-install[=PKGS]
|
--enable-fast-install[=PKGS]
|
||||||
optimize for fast installation [default=yes]
|
optimize for fast installation [default=yes]
|
||||||
--disable-libtool-lock avoid locking (might break parallel builds)
|
--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-serial do not use serial reader.conf file
|
||||||
--disable-usb do not use usb hotplug
|
--disable-usb do not use usb hotplug
|
||||||
--disable-libudev do not use libudev
|
--disable-libudev do not use libudev
|
||||||
|
@ -1528,6 +1534,10 @@ Some influential environment variables:
|
||||||
path overriding pkg-config's built-in search path
|
path overriding pkg-config's built-in search path
|
||||||
LT_SYS_LIBRARY_PATH
|
LT_SYS_LIBRARY_PATH
|
||||||
User-defined run-time library search 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
|
LIBUDEV_CFLAGS
|
||||||
C compiler flags for LIBUDEV, overriding pkg-config
|
C compiler flags for LIBUDEV, overriding pkg-config
|
||||||
LIBUDEV_LIBS
|
LIBUDEV_LIBS
|
||||||
|
@ -1605,7 +1615,7 @@ fi
|
||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
pcsc-lite configure 1.8.22
|
pcsc-lite configure 1.8.23
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
@ -2081,7 +2091,7 @@ cat >config.log <<_ACEOF
|
||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by pcsc-lite $as_me 1.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
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
|
@ -2945,7 +2955,7 @@ fi
|
||||||
|
|
||||||
# Define the identity of the package.
|
# Define the identity of the package.
|
||||||
PACKAGE='pcsc-lite'
|
PACKAGE='pcsc-lite'
|
||||||
VERSION='1.8.22'
|
VERSION='1.8.23'
|
||||||
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
@ -14654,6 +14664,92 @@ if test "x$ac_cv_lib_rt_mq_getattr" = xyes; then :
|
||||||
fi
|
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
|
# --disable-serial
|
||||||
# Check whether --enable-serial was given.
|
# Check whether --enable-serial was given.
|
||||||
if test "${enable_serial+set}" = set; then :
|
if test "${enable_serial+set}" = set; then :
|
||||||
|
@ -15513,6 +15609,7 @@ ATR parsing messages: ${debugatr}
|
||||||
ipcdir: ${ipcdir}
|
ipcdir: ${ipcdir}
|
||||||
use serial: ${use_serial}
|
use serial: ${use_serial}
|
||||||
use usb: ${use_usb}
|
use usb: ${use_usb}
|
||||||
|
use libsystemd: ${use_libsystemd}
|
||||||
systemd unit directory: ${with_systemdsystemunitdir}
|
systemd unit directory: ${with_systemdsystemunitdir}
|
||||||
serial config dir.: ${confdir_exp}
|
serial config dir.: ${confdir_exp}
|
||||||
filter: ${use_filter}
|
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
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by pcsc-lite $as_me 1.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
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
|
@ -16141,7 +16238,7 @@ _ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
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,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|
14
configure.ac
14
configure.ac
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
|
|
||||||
AC_INIT([pcsc-lite],[1.8.22])
|
AC_INIT([pcsc-lite],[1.8.23])
|
||||||
AC_CONFIG_SRCDIR(src/pcscdaemon.c)
|
AC_CONFIG_SRCDIR(src/pcscdaemon.c)
|
||||||
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
|
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
@ -150,6 +150,17 @@ AC_CHECK_LIB(socket, socket, [LIBS="$LIBS -lsocket"])
|
||||||
# check for mq_getattr()
|
# check for mq_getattr()
|
||||||
AC_CHECK_LIB(rt, mq_getattr, [LIBS="$LIBS -lrt"])
|
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
|
# --disable-serial
|
||||||
AC_ARG_ENABLE(serial,
|
AC_ARG_ENABLE(serial,
|
||||||
AS_HELP_STRING([--disable-serial],[do not use serial reader.conf file]),
|
AS_HELP_STRING([--disable-serial],[do not use serial reader.conf file]),
|
||||||
|
@ -431,6 +442,7 @@ ATR parsing messages: ${debugatr}
|
||||||
ipcdir: ${ipcdir}
|
ipcdir: ${ipcdir}
|
||||||
use serial: ${use_serial}
|
use serial: ${use_serial}
|
||||||
use usb: ${use_usb}
|
use usb: ${use_usb}
|
||||||
|
use libsystemd: ${use_libsystemd}
|
||||||
systemd unit directory: ${with_systemdsystemunitdir}
|
systemd unit directory: ${with_systemdsystemunitdir}
|
||||||
serial config dir.: ${confdir_exp}
|
serial config dir.: ${confdir_exp}
|
||||||
filter: ${use_filter}
|
filter: ${use_filter}
|
||||||
|
|
|
@ -262,6 +262,8 @@ LEXLIB = @LEXLIB@
|
||||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
|
||||||
|
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
||||||
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
||||||
|
|
|
@ -219,6 +219,8 @@ LEXLIB = @LEXLIB@
|
||||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
|
||||||
|
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
||||||
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
||||||
|
|
|
@ -195,6 +195,8 @@ LEXLIB = @LEXLIB@
|
||||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
|
||||||
|
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
||||||
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
||||||
|
|
|
@ -63,8 +63,6 @@ pcscd_SOURCES = \
|
||||||
prothandler.h \
|
prothandler.h \
|
||||||
readerfactory.c \
|
readerfactory.c \
|
||||||
readerfactory.h \
|
readerfactory.h \
|
||||||
sd-daemon.c \
|
|
||||||
sd-daemon.h \
|
|
||||||
simclist.c \
|
simclist.c \
|
||||||
simclist.h \
|
simclist.h \
|
||||||
sys_generic.h \
|
sys_generic.h \
|
||||||
|
@ -79,9 +77,9 @@ pcscd_SOURCES = \
|
||||||
winscard_svc.c \
|
winscard_svc.c \
|
||||||
winscard_svc.h
|
winscard_svc.h
|
||||||
pcscd_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(LIBUSB_CFLAGS) $(LIBUDEV_CFLAGS) \
|
pcscd_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(LIBUSB_CFLAGS) $(LIBUDEV_CFLAGS) \
|
||||||
$(POLKIT_CFLAGS) \
|
$(POLKIT_CFLAGS) $(LIBSYSTEMD_CFLAGS) \
|
||||||
-DPCSCD -DSIMCLIST_NO_DUMPRESTORE
|
-DPCSCD -DSIMCLIST_NO_DUMPRESTORE
|
||||||
pcscd_LDFLAGS = $(LDFLAGS) -export-dynamic
|
pcscd_LDFLAGS = $(LDFLAGS) $(LIBSYSTEMD_LIBS) -export-dynamic
|
||||||
pcscd_LDADD = \
|
pcscd_LDADD = \
|
||||||
$(PTHREAD_LIBS) $(COREFOUNDATION) \
|
$(PTHREAD_LIBS) $(COREFOUNDATION) \
|
||||||
$(LIBUSB_LIBS) $(IOKIT) $(LIBUDEV_LIBS) \
|
$(LIBUSB_LIBS) $(IOKIT) $(LIBUDEV_LIBS) \
|
||||||
|
@ -92,10 +90,6 @@ fix-rights: install-sbinPROGRAMS
|
||||||
chgrp pcscd $(DESTDIR)$(sbindir)/pcscd
|
chgrp pcscd $(DESTDIR)$(sbindir)/pcscd
|
||||||
chmod g+s $(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_SOURCES = testpcsc.c
|
||||||
testpcsc_LDADD = libpcsclite.la
|
testpcsc_LDADD = libpcsclite.la
|
||||||
|
|
||||||
|
|
|
@ -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 \
|
parser.h pcscdaemon.c pcscd.h PCSC/debuglog.h \
|
||||||
PCSC/ifdhandler.h PCSC/pcsclite.h PCSC/winscard.h \
|
PCSC/ifdhandler.h PCSC/pcsclite.h PCSC/winscard.h \
|
||||||
PCSC/wintypes.h prothandler.c prothandler.h readerfactory.c \
|
PCSC/wintypes.h prothandler.c prothandler.h readerfactory.c \
|
||||||
readerfactory.h sd-daemon.c sd-daemon.h simclist.c simclist.h \
|
readerfactory.h simclist.c simclist.h sys_generic.h sys_unix.c \
|
||||||
sys_generic.h sys_unix.c tokenparser.l hotplug_libudev.c \
|
tokenparser.l hotplug_libudev.c hotplug_libusb.c \
|
||||||
hotplug_libusb.c hotplug_linux.c hotplug_macosx.c utils.c \
|
hotplug_linux.c hotplug_macosx.c utils.c utils.h winscard.c \
|
||||||
utils.h winscard.c winscard_msg.c winscard_msg.h \
|
winscard_msg.c winscard_msg.h winscard_msg_srv.c \
|
||||||
winscard_msg_srv.c winscard_svc.c winscard_svc.h
|
winscard_svc.c winscard_svc.h
|
||||||
@ENABLE_SERIAL_TRUE@am__objects_1 = pcscd-configfile.$(OBJEXT)
|
@ENABLE_SERIAL_TRUE@am__objects_1 = pcscd-configfile.$(OBJEXT)
|
||||||
@ENABLE_USB_TRUE@am__objects_2 = pcscd-tokenparser.$(OBJEXT) \
|
@ENABLE_USB_TRUE@am__objects_2 = pcscd-tokenparser.$(OBJEXT) \
|
||||||
@ENABLE_USB_TRUE@ pcscd-hotplug_libudev.$(OBJEXT) \
|
@ENABLE_USB_TRUE@ pcscd-hotplug_libudev.$(OBJEXT) \
|
||||||
|
@ -188,11 +188,11 @@ am_pcscd_OBJECTS = pcscd-auth.$(OBJEXT) pcscd-atrhandler.$(OBJEXT) \
|
||||||
pcscd-dyn_unix.$(OBJEXT) pcscd-eventhandler.$(OBJEXT) \
|
pcscd-dyn_unix.$(OBJEXT) pcscd-eventhandler.$(OBJEXT) \
|
||||||
pcscd-hotplug_generic.$(OBJEXT) pcscd-ifdwrapper.$(OBJEXT) \
|
pcscd-hotplug_generic.$(OBJEXT) pcscd-ifdwrapper.$(OBJEXT) \
|
||||||
pcscd-pcscdaemon.$(OBJEXT) pcscd-prothandler.$(OBJEXT) \
|
pcscd-pcscdaemon.$(OBJEXT) pcscd-prothandler.$(OBJEXT) \
|
||||||
pcscd-readerfactory.$(OBJEXT) pcscd-sd-daemon.$(OBJEXT) \
|
pcscd-readerfactory.$(OBJEXT) pcscd-simclist.$(OBJEXT) \
|
||||||
pcscd-simclist.$(OBJEXT) pcscd-sys_unix.$(OBJEXT) \
|
pcscd-sys_unix.$(OBJEXT) $(am__objects_2) \
|
||||||
$(am__objects_2) pcscd-utils.$(OBJEXT) \
|
pcscd-utils.$(OBJEXT) pcscd-winscard.$(OBJEXT) \
|
||||||
pcscd-winscard.$(OBJEXT) pcscd-winscard_msg.$(OBJEXT) \
|
pcscd-winscard_msg.$(OBJEXT) pcscd-winscard_msg_srv.$(OBJEXT) \
|
||||||
pcscd-winscard_msg_srv.$(OBJEXT) pcscd-winscard_svc.$(OBJEXT)
|
pcscd-winscard_svc.$(OBJEXT)
|
||||||
pcscd_OBJECTS = $(am_pcscd_OBJECTS)
|
pcscd_OBJECTS = $(am_pcscd_OBJECTS)
|
||||||
pcscd_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
|
pcscd_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
|
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
|
||||||
|
@ -366,6 +366,8 @@ LEXLIB = @LEXLIB@
|
||||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
|
||||||
|
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
||||||
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
||||||
|
@ -530,8 +532,6 @@ pcscd_SOURCES = \
|
||||||
prothandler.h \
|
prothandler.h \
|
||||||
readerfactory.c \
|
readerfactory.c \
|
||||||
readerfactory.h \
|
readerfactory.h \
|
||||||
sd-daemon.c \
|
|
||||||
sd-daemon.h \
|
|
||||||
simclist.c \
|
simclist.c \
|
||||||
simclist.h \
|
simclist.h \
|
||||||
sys_generic.h \
|
sys_generic.h \
|
||||||
|
@ -547,10 +547,10 @@ pcscd_SOURCES = \
|
||||||
winscard_svc.h
|
winscard_svc.h
|
||||||
|
|
||||||
pcscd_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(LIBUSB_CFLAGS) $(LIBUDEV_CFLAGS) \
|
pcscd_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(LIBUSB_CFLAGS) $(LIBUDEV_CFLAGS) \
|
||||||
$(POLKIT_CFLAGS) \
|
$(POLKIT_CFLAGS) $(LIBSYSTEMD_CFLAGS) \
|
||||||
-DPCSCD -DSIMCLIST_NO_DUMPRESTORE
|
-DPCSCD -DSIMCLIST_NO_DUMPRESTORE
|
||||||
|
|
||||||
pcscd_LDFLAGS = $(LDFLAGS) -export-dynamic
|
pcscd_LDFLAGS = $(LDFLAGS) $(LIBSYSTEMD_LIBS) -export-dynamic
|
||||||
pcscd_LDADD = \
|
pcscd_LDADD = \
|
||||||
$(PTHREAD_LIBS) $(COREFOUNDATION) \
|
$(PTHREAD_LIBS) $(COREFOUNDATION) \
|
||||||
$(LIBUSB_LIBS) $(IOKIT) $(LIBUDEV_LIBS) \
|
$(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-pcscdaemon.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-prothandler.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-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-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-sys_unix.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcscd-tokenparser.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@
|
@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`
|
@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
|
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_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
|
@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
|
chgrp pcscd $(DESTDIR)$(sbindir)/pcscd
|
||||||
chmod g+s $(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
|
# pcsc_wirecheck_CFLAGS := $(LIBPCSCLITE_CFLAGS) -DCOMPAT_64BIT_SERVER=1
|
||||||
|
|
||||||
$(srcdir)/pcsc-wirecheck-dist.c: pcsc-wirecheck-gen
|
$(srcdir)/pcsc-wirecheck-dist.c: pcsc-wirecheck-gen
|
||||||
|
|
|
@ -279,7 +279,7 @@ extern const SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci;
|
||||||
#define INFINITE 0xFFFFFFFF /**< Infinite timeout */
|
#define INFINITE 0xFFFFFFFF /**< Infinite timeout */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PCSCLITE_VERSION_NUMBER "1.8.22" /**< Current version */
|
#define PCSCLITE_VERSION_NUMBER "1.8.23" /**< Current version */
|
||||||
/** Maximum readers context (a slot is count as a reader) */
|
/** Maximum readers context (a slot is count as a reader) */
|
||||||
#define PCSCLITE_MAX_READERS_CONTEXTS 16
|
#define PCSCLITE_MAX_READERS_CONTEXTS 16
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
|
|
||||||
#define PCSCLITE_CSOCK_NAME PCSCLITE_IPC_DIR "/pcscd.comm"
|
#define PCSCLITE_CSOCK_NAME PCSCLITE_IPC_DIR "/pcscd.comm"
|
||||||
|
|
||||||
#define PCSCLITE_VERSION_NUMBER "1.8.22" /**< Current version */
|
#define PCSCLITE_VERSION_NUMBER "1.8.23" /**< Current version */
|
||||||
#define PCSCLITE_STATUS_POLL_RATE 400000 /**< Status polling rate */
|
#define PCSCLITE_STATUS_POLL_RATE 400000 /**< Status polling rate */
|
||||||
#define PCSCLITE_LOCK_POLL_RATE 100000 /**< Lock polling rate */
|
#define PCSCLITE_LOCK_POLL_RATE 100000 /**< Lock polling rate */
|
||||||
|
|
||||||
|
|
|
@ -53,12 +53,14 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
#include <systemd/sd-daemon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "pcsclite.h"
|
#include "pcsclite.h"
|
||||||
#include "pcscd.h"
|
#include "pcscd.h"
|
||||||
#include "debuglog.h"
|
#include "debuglog.h"
|
||||||
#include "sd-daemon.h"
|
|
||||||
#include "winscard_msg.h"
|
#include "winscard_msg.h"
|
||||||
#include "winscard_svc.h"
|
#include "winscard_svc.h"
|
||||||
#include "sys_generic.h"
|
#include "sys_generic.h"
|
||||||
|
@ -430,6 +432,7 @@ int main(int argc, char **argv)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
/*
|
/*
|
||||||
* Check if systemd passed us any file descriptors
|
* Check if systemd passed us any file descriptors
|
||||||
*/
|
*/
|
||||||
|
@ -449,6 +452,7 @@ int main(int argc, char **argv)
|
||||||
else
|
else
|
||||||
SocketActivated = FALSE;
|
SocketActivated = FALSE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* test the presence of /var/run/pcscd/pcscd.comm
|
* test the presence of /var/run/pcscd/pcscd.comm
|
||||||
|
@ -706,9 +710,11 @@ int main(int argc, char **argv)
|
||||||
/*
|
/*
|
||||||
* Initialize the comm structure
|
* Initialize the comm structure
|
||||||
*/
|
*/
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
if (SocketActivated)
|
if (SocketActivated)
|
||||||
rv = ListenExistingSocket(SD_LISTEN_FDS_START + 0);
|
rv = ListenExistingSocket(SD_LISTEN_FDS_START + 0);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
rv = InitializeSocket();
|
rv = InitializeSocket();
|
||||||
|
|
||||||
if (rv)
|
if (rv)
|
||||||
|
|
|
@ -410,13 +410,14 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
rv = IFDGetCapabilities((sReadersContexts[dwContext]),
|
rv = IFDGetCapabilities((sReadersContexts[dwContext]),
|
||||||
TAG_IFD_SLOTS_NUMBER, &dwGetSize, ucGetData);
|
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 does not have this defined. Must be a single slot
|
||||||
* reader so we can just return SCARD_S_SUCCESS. */
|
* reader so we can just return SCARD_S_SUCCESS. */
|
||||||
return SCARD_S_SUCCESS;
|
return SCARD_S_SUCCESS;
|
||||||
|
|
||||||
if (rv == IFD_SUCCESS && dwGetSize == 1 && ucGetData[0] == 1)
|
if (1 == nbSlots)
|
||||||
/* Reader has this defined and it only has one slot */
|
/* Reader has only one slot */
|
||||||
return SCARD_S_SUCCESS;
|
return SCARD_S_SUCCESS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -425,7 +426,7 @@ LONG RFAddReader(const char *readerNameLong, int port, const char *library,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Initialize the rest of the slots */
|
/* Initialize the rest of the slots */
|
||||||
for (j = 1; j < ucGetData[0]; j++)
|
for (j = 1; j < nbSlots; j++)
|
||||||
{
|
{
|
||||||
char *tmpReader = NULL;
|
char *tmpReader = NULL;
|
||||||
DWORD dwContextB = 0;
|
DWORD dwContextB = 0;
|
||||||
|
|
526
src/sd-daemon.c
526
src/sd-daemon.c
|
@ -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
|
|
||||||
}
|
|
277
src/sd-daemon.h
277
src/sd-daemon.h
|
@ -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
|
|
|
@ -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);
|
size_t datalen = l->attrs.meter(data);
|
||||||
lent->data = (struct list_entry_s *)malloc(datalen);
|
lent->data = (struct list_entry_s *)malloc(datalen);
|
||||||
if (NULL == lent->data)
|
if (NULL == lent->data)
|
||||||
|
{
|
||||||
|
free(lent);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
memcpy(lent->data, data, datalen);
|
memcpy(lent->data, data, datalen);
|
||||||
} else {
|
} else {
|
||||||
lent->data = (void*)data;
|
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 */
|
/* actually append element */
|
||||||
prec = list_findpos(l, pos-1);
|
prec = list_findpos(l, pos-1);
|
||||||
if (NULL == prec)
|
if (NULL == prec)
|
||||||
|
{
|
||||||
|
free(lent->data);
|
||||||
|
free(lent);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
succ = prec->next;
|
succ = prec->next;
|
||||||
|
|
||||||
prec->next = lent;
|
prec->next = lent;
|
||||||
|
|
|
@ -248,6 +248,8 @@ LEXLIB = @LEXLIB@
|
||||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LIBSYSTEMD_CFLAGS = @LIBSYSTEMD_CFLAGS@
|
||||||
|
LIBSYSTEMD_LIBS = @LIBSYSTEMD_LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
|
||||||
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
LIBUDEV_LIBS = @LIBUDEV_LIBS@
|
||||||
|
|
|
@ -13,7 +13,12 @@ DIR=$(echo $DIR | cut -d'=' -f2 | cut -d' ' -f2)
|
||||||
# get the directory part only: /usr/lib/x86_64-linux-gnu
|
# get the directory part only: /usr/lib/x86_64-linux-gnu
|
||||||
DIR=$(dirname $DIR)
|
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 "Using directory:" $DIR
|
||||||
|
echo "Spying library is:" $SPY
|
||||||
|
|
||||||
cd $DIR
|
cd $DIR
|
||||||
|
|
||||||
|
@ -28,5 +33,5 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# link to the spy library
|
# 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
|
ln -sf libpcsclite.so.1.0.0 libpcsclite.so.1
|
||||||
|
|
|
@ -651,8 +651,11 @@ class PCSCspy(object):
|
||||||
self.log_out2("mszReaderName")
|
self.log_out2("mszReaderName")
|
||||||
self.log_out2("dwState")
|
self.log_out2("dwState")
|
||||||
self.log_out2("dwProtocol")
|
self.log_out2("dwProtocol")
|
||||||
self.log_out2("bAtrLen")
|
data = self.log_out2("bAtrLen")
|
||||||
self.log_out2("bAtr")
|
if not data == "NULL":
|
||||||
|
self.log_out2("bAtr")
|
||||||
|
else:
|
||||||
|
self.log_out("bAtr")
|
||||||
self._log_rv()
|
self._log_rv()
|
||||||
|
|
||||||
def _SCardReconnect(self):
|
def _SCardReconnect(self):
|
||||||
|
|
|
@ -2081,7 +2081,8 @@ LONG SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout,
|
||||||
&waitStatusStruct, sizeof(waitStatusStruct),
|
&waitStatusStruct, sizeof(waitStatusStruct),
|
||||||
currentContextMap->dwClientID, dwTime);
|
currentContextMap->dwClientID, dwTime);
|
||||||
|
|
||||||
/* another thread can do SCardCancel() */
|
/* SCardCancel() will return immediatly with success
|
||||||
|
* because something changed on the daemon side. */
|
||||||
currentContextMap->cancellable = FALSE;
|
currentContextMap->cancellable = FALSE;
|
||||||
|
|
||||||
/* timeout */
|
/* timeout */
|
||||||
|
|
|
@ -57,10 +57,12 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifdef HAVE_SYS_FILIO_H
|
#ifdef HAVE_SYS_FILIO_H
|
||||||
#include <sys/filio.h>
|
#include <sys/filio.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
#include <systemd/sd-daemon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "pcscd.h"
|
#include "pcscd.h"
|
||||||
#include "sd-daemon.h"
|
|
||||||
#include "winscard.h"
|
#include "winscard.h"
|
||||||
#include "debuglog.h"
|
#include "debuglog.h"
|
||||||
#include "winscard_msg.h"
|
#include "winscard_msg.h"
|
||||||
|
@ -174,6 +176,7 @@ INTERNAL int32_t InitializeSocket(void)
|
||||||
* @retval 0 Success
|
* @retval 0 Success
|
||||||
* @retval -1 Passed FD is not an UNIX socket.
|
* @retval -1 Passed FD is not an UNIX socket.
|
||||||
*/
|
*/
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
INTERNAL int32_t ListenExistingSocket(int fd)
|
INTERNAL int32_t ListenExistingSocket(int fd)
|
||||||
{
|
{
|
||||||
if (!sd_is_socket(fd, AF_UNIX, SOCK_STREAM, -1))
|
if (!sd_is_socket(fd, AF_UNIX, SOCK_STREAM, -1))
|
||||||
|
@ -185,6 +188,7 @@ INTERNAL int32_t ListenExistingSocket(int fd)
|
||||||
commonSocket = fd;
|
commonSocket = fd;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Looks for messages sent by clients.
|
* @brief Looks for messages sent by clients.
|
||||||
|
|
Loading…
Reference in New Issue