#include #include #include #include #include #include #include #include #include "iqbasic.h" #define DIE(...) error_at_line(1, errno, __FILE__, __LINE__, __VA_ARGS__) void vario_send(int fd, const char *line) { int len = strlen(line); char *buf = (char*)malloc(sizeof(char)*len+3); int rc; sprintf(buf, "%s\r\n", line); do { rc = write(fd, buf, len+2); } while (rc == -1 && errno == EINTR); if (rc == -1) DIE("write"); } int vario_recv(int fd, char *buf, int maxlen) { int pos = 0; int n; char c; do { do { n = read(fd, &c, 1); } while(n == -1 && errno == EINTR); if(n == -1) DIE("read"); if(n == 1) buf[pos++] = c; } while(c != '\n' && pos < maxlen); if(pos >= maxlen) DIE("buffer too small"); return pos; } int vario_open(char *device) { int fd = open(device, O_NOCTTY | O_NONBLOCK | O_RDWR); if (fd == -1) DIE("%s", device); if (tcflush(fd, TCIOFLUSH) == -1) error(1, errno, "tcflush %s", device, strerror(errno)); struct termios termios; memset(&termios, 0, sizeof termios); termios.c_iflag = IGNPAR; termios.c_cflag = CLOCAL | CREAD | CS8; cfsetispeed(&termios, B57600); cfsetospeed(&termios, B57600); if (tcsetattr(fd, TCSANOW, &termios) == -1) DIE("tcsetattr: %s: %s", device, strerror(errno)); return fd; } void vario_close(int fd) { if (close(fd) == -1) DIE("close: %s", strerror(errno)); }