From d7ab08338c3a55a71fefe5cf3f8af4ce1852e99a Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Wed, 27 May 2020 18:35:23 -0400 Subject: [PATCH] Implement patty_kiss_tnc_open_fd() Implement patty_kiss_tnc_open_fd() to create a TNC object for an existing Unix file descriptor --- include/patty/kiss.h | 2 ++ src/kiss.c | 34 +++++++++++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/include/patty/kiss.h b/include/patty/kiss.h index 69d71a9..eab42bf 100644 --- a/include/patty/kiss.h +++ b/include/patty/kiss.h @@ -29,6 +29,8 @@ enum patty_kiss_command { typedef struct _patty_kiss_tnc patty_kiss_tnc; +patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsize); + patty_kiss_tnc *patty_kiss_tnc_open(const char *device, size_t bufsize); int patty_kiss_tnc_fd_unix(patty_kiss_tnc *tnc); diff --git a/src/kiss.c b/src/kiss.c index 8ddb9dd..17d1926 100644 --- a/src/kiss.c +++ b/src/kiss.c @@ -18,8 +18,6 @@ enum kiss_flags { }; struct _patty_kiss_tnc { - const char * device; - int fd; void *buf, @@ -30,7 +28,7 @@ struct _patty_kiss_tnc { dropped; }; -patty_kiss_tnc *patty_kiss_tnc_open(const char *device, size_t bufsz) { +patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsz) { patty_kiss_tnc *tnc; if ((tnc = malloc(sizeof(*tnc))) == NULL) { @@ -45,20 +43,13 @@ patty_kiss_tnc *patty_kiss_tnc_open(const char *device, size_t bufsz) { goto error_malloc_frame; } - if ((tnc->fd = open(device, O_RDWR)) < 0) { - goto error_open; - } - - tnc->device = device; + tnc->fd = fd; tnc->bufsz = bufsz; tnc->buflen = 0; tnc->dropped = 0; return tnc; -error_open: - free(tnc->frame); - error_malloc_frame: free(tnc->buf); @@ -69,6 +60,27 @@ error_malloc_tnc: return NULL; } +patty_kiss_tnc *patty_kiss_tnc_open(const char *device, size_t bufsz) { + patty_kiss_tnc *tnc; + int fd; + + if ((fd = open(device, O_RDWR)) < 0) { + goto error_open; + } + + if ((tnc = patty_kiss_tnc_open_fd(fd, bufsz)) == NULL) { + goto error_tnc_open_fd; + } + + return tnc; + +error_tnc_open_fd: + close(fd); + +error_open: + return NULL; +} + int patty_kiss_tnc_fd_unix(patty_kiss_tnc *tnc) { return tnc->fd; }