Skip to content

systemd socket type for triggerhappy should be datagram #29

@holdenc

Description

@holdenc

Hi,

I'm using triggerhappy on a RaspberryPi 3 and the daemon starts fine:

holden@caledonian:~/src/triggerhappy $ systemctl status triggerhappy.service 
● triggerhappy.service - triggerhappy global hotkey daemon
   Loaded: loaded (/lib/systemd/system/triggerhappy.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-08-06 22:12:59 BST; 23h ago
 Main PID: 312 (thd)
   CGroup: /system.slice/triggerhappy.service
           └─312 /usr/sbin/thd --triggers /etc/triggerhappy/triggers.d/ --socket /run/thd.socket --user nobody --deviceglob /dev/input/event*

Aug 06 22:12:59 caledonian systemd[1]: Starting triggerhappy global hotkey daemon...
Aug 06 22:12:59 caledonian thd[312]: Found socket passed from systemd
Aug 06 22:12:59 caledonian systemd[1]: Started triggerhappy global hotkey daemon.

but I get the following error in syslog at startup:

Aug  6 22:12:59 caledonian systemd-udevd[144]: Process '/usr/sbin/th-cmd --socket /var/run/thd.socket --passfd --udev' failed with exit code 1.

I had a quick look at the source code and I can see triggerhappy uses only datagram sockets:

holden@caledonian:~/src/triggerhappy $ grep SOCK_ *.c
cmdsocket.c:	cmd_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
cmdsocket.c:	fd = socket(AF_UNIX, SOCK_DGRAM, 0);

but the .socket file for systemd configures a stream socket and not a datagram socket:

holden@caledonian:~/src/triggerhappy $ cat /lib/systemd/system/triggerhappy.socket
[Socket]
ListenStream=/run/thd.socket

[Install]
WantedBy=sockets.target

holden@caledonian:~/src/triggerhappy $ systemctl status triggerhappy.socket 
● triggerhappy.socket
   Loaded: loaded (/lib/systemd/system/triggerhappy.socket; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-08-06 22:12:59 BST; 23h ago
   Listen: /run/thd.socket (Stream)

Aug 06 22:12:59 caledonian systemd[1]: Listening on triggerhappy.socket.

The following patch should fix the issue:

diff --git a/systemd/triggerhappy.socket b/systemd/triggerhappy.socket
index 30a2c69..da37594 100644
--- a/systemd/triggerhappy.socket
+++ b/systemd/triggerhappy.socket
@@ -1,5 +1,5 @@
 [Socket]
-ListenStream=/run/thd.socket
+ListenDatagram=/run/thd.socket
 
 [Install]
 WantedBy=sockets.target

Also, the last argument of bind() and connect() calls is probably wrong and should be changed:

diff --git a/cmdsocket.c b/cmdsocket.c
index 1ba3af5..9f97dba 100644
--- a/cmdsocket.c
+++ b/cmdsocket.c
@@ -44,8 +44,7 @@ int bind_cmdsocket( char *name ) {
        cmd_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
        strcpy(addr.sun_path, name);
        addr.sun_family = AF_UNIX;
-       bind (cmd_fd, (struct sockaddr *) &addr, 
-               strlen(addr.sun_path) + sizeof (addr.sun_family));
+       bind (cmd_fd, (struct sockaddr *) &addr, sizeof(addr));
        return cmd_fd;
 }
 
@@ -55,8 +54,7 @@ int connect_cmdsocket( char *name ) {
        fd = socket(AF_UNIX, SOCK_DGRAM, 0);
        strcpy(server.sun_path, name);
        server.sun_family = AF_UNIX;
-       connect(fd, (struct sockaddr *) &server,
-               strlen(server.sun_path) + sizeof (server.sun_family));
+       connect(fd, (struct sockaddr *) &server, sizeof(server));
        return fd;
 }

and the return value from this call checked for errors (connect() is currently failing and returning EPROTOTYPE (Protocol wrong type for socket)).

All the above is almost certainly the cause of issue #22 and errors like this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions