1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfgFile = pkgs.writeText "reader.conf" config.services.pcscd.readerConfig;
7
8 pluginEnv = pkgs.buildEnv {
9 name = "pcscd-plugins";
10 paths = map (p: "${p}/pcsc/drivers") config.services.pcscd.plugins;
11 };
12
13in {
14
15 ###### interface
16
17 options = {
18
19 services.pcscd = {
20 enable = mkEnableOption "PCSC-Lite daemon";
21
22 plugins = mkOption {
23 type = types.listOf types.package;
24 default = [ pkgs.ccid ];
25 defaultText = "[ pkgs.ccid ]";
26 example = literalExample "[ pkgs.pcsc-cyberjack ]";
27 description = "Plugin packages to be used for PCSC-Lite.";
28 };
29
30 readerConfig = mkOption {
31 type = types.lines;
32 default = "";
33 example = ''
34 FRIENDLYNAME "Some serial reader"
35 DEVICENAME /dev/ttyS0
36 LIBPATH /path/to/serial_reader.so
37 CHANNELID 1
38 '';
39 description = ''
40 Configuration for devices that aren't hotpluggable.
41
42 See <citerefentry><refentrytitle>reader.conf</refentrytitle>
43 <manvolnum>5</manvolnum></citerefentry> for valid options.
44 '';
45 };
46 };
47 };
48
49 ###### implementation
50
51 config = mkIf config.services.pcscd.enable {
52
53 systemd.sockets.pcscd = {
54 description = "PCSC-Lite Socket";
55 wantedBy = [ "sockets.target" ];
56 before = [ "multi-user.target" ];
57 socketConfig.ListenStream = "/run/pcscd/pcscd.comm";
58 };
59
60 systemd.services.pcscd = {
61 description = "PCSC-Lite daemon";
62 environment.PCSCLITE_HP_DROPDIR = pluginEnv;
63 serviceConfig = {
64 ExecStart = "${pkgs.pcsclite}/sbin/pcscd -f -x -c ${cfgFile}";
65 ExecReload = "${pkgs.pcsclite}/sbin/pcscd -H";
66 };
67 };
68 };
69}