From 216bd91050fe8d7c3c14a04d33e4ab15a03f5dba Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sun, 19 Jul 2020 23:36:35 -0400 Subject: [PATCH] Let patty_kiss_tnc_new() use Unix domain sockets Modify patty_kiss_tnc_new() to connect to a Unix domain socket --- src/kiss.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/kiss.c b/src/kiss.c index 0f734e2..897396c 100644 --- a/src/kiss.c +++ b/src/kiss.c @@ -5,7 +5,8 @@ #include #include #include -#include +#include +#include #include #include @@ -66,9 +67,36 @@ error_malloc_tnc: patty_kiss_tnc *patty_kiss_tnc_new(const char *device) { patty_kiss_tnc *tnc; int fd; + struct stat st; - if ((fd = open(device, O_RDWR)) < 0) { - goto error_open; + if (stat(device, &st) < 0) { + goto error_stat; + } + + if (st.st_mode & S_IFSOCK) { + struct sockaddr_un addr; + + if (strlen(device) > sizeof(addr.sun_path)) { + errno = EOVERFLOW; + + goto error_overflow; + } + + if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { + goto error_socket; + } + + memset(&addr, '\0', sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, device, sizeof(addr.sun_path)); + + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + goto error_connect; + } + } else { + if ((fd = open(device, O_RDWR)) < 0) { + goto error_open; + } } if ((tnc = patty_kiss_tnc_new_fd(fd)) == NULL) { @@ -80,9 +108,13 @@ patty_kiss_tnc *patty_kiss_tnc_new(const char *device) { return tnc; error_tnc_new_fd: +error_connect: close(fd); +error_socket: +error_overflow: error_open: +error_stat: return NULL; }