#include "slip.h" #include #include #include void die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fputs("libslip-test: ", stderr); vfprintf(stderr, fmt, ap); if (*fmt && fmt[strlen(fmt) - 1] == ':') { fputc(' ', stderr); perror(NULL); } else { fputc('\n', stderr); } va_end(ap); exit(1); } int slip_realloc(void **buf, size_t size) { *buf = realloc(*buf, size); if (!*buf) die("realloc:"); return 0; } void slip_restart(struct slip *slip, uint8_t b) { printf("RESTART due to '%02x' byte\n", b); } void slip_rx(struct slip *slip, uint8_t *data, size_t len, void *user) { printf("PACKET %.*s\n", (int) len, data); } int main(int argc, const char **argv) { uint8_t iobuf[BUFSIZ]; uint8_t encbuf[BUFSIZ * 2 + 2]; struct slip slip = { 0 }; size_t enclen, nread; int rc; slip.realloc = slip_realloc; slip.rx_packet = slip_rx; slip.rx_restart = slip_restart; slip.esc = '\\'; slip.start = '<'; slip.end = '>'; slip.esc_active['\\'] = true; slip.esc_enc['\\'] = '\\'; slip.esc_active['<'] = true; slip.esc_enc['<'] = '<'; slip.esc_active['>'] = true; slip.esc_enc['>'] = '>'; rc = slip_init(&slip); if (rc) die("slip_init"); if (argc == 2 && !strcmp(argv[1], "-d")) { while ((nread = fread(iobuf, 1, sizeof(iobuf), stdin))) { rc = slip_decode(&slip, iobuf, nread); if (rc) die("slip_decode"); } } else { while ((nread = fread(iobuf, 1, sizeof(iobuf), stdin))) { rc = slip_encode(&slip, encbuf, &enclen, sizeof(encbuf), iobuf, nread); if (rc) die("slip_encode"); fwrite(encbuf, 1, enclen, stdout); } } slip_deinit(&slip); }