#include enum kiss_flags { KISS_NONE = 0x00, KISS_FRAME = 0x01, KISS_ESCAPE = 0x02 }; ssize_t patty_kiss_read(int fd, void *buf, size_t len, int *port) { int flags = KISS_NONE; size_t i, b = 0; if (read(fd, buf, len) < 0) { goto error_io; } *port = 0; for (i=0; i> 4; continue; } ((unsigned char *)buf)[b++] = c; } } return b + 1; error_io: return -1; } static inline ssize_t write_byte(int fd, unsigned char c) { return write(fd, &c, sizeof(c)); } static inline ssize_t write_command(int fd, int command, int port) { return write_byte(fd, ((port & 0x0f) << 4) | (command & 0x0f)); } ssize_t patty_kiss_write(int fd, const void *buf, size_t len, int port) { size_t i, start = 0, end = 0; unsigned char escape_fend[2] = { PATTY_KISS_FESC, PATTY_KISS_TFEND }; unsigned char escape_fesc[2] = { PATTY_KISS_FESC, PATTY_KISS_TFESC }; if (write_byte(fd, PATTY_KISS_FEND) < 0) { goto error_io; } if (write_command(PATTY_KISS_DATA, port) < 0) { goto error_io; } for (i=0; i