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; }