hunk ./tsl-minimal.c 164 - seen[number] = MAXSENSOR+1; - for (i=0; i hunk ./tsl-minimal.c 83 + alarm(5); hunk ./tsl-minimal.c 85 + alarm(0); hunk ./tsl-minimal.c 110 + /* ignore SIGALRM */ + { + struct sigaction *sa = calloc(1, sizeof(struct sigaction)); + sa->sa_handler = SIG_IGN; + sigaction(SIGALRM, sa, NULL); + free(sa); + } + hunk ./tsl-minimal.c 30 +#include +#include +#include hunk ./tsl-minimal.c 43 -FILE *serial; +static int sfd; +static int cancel; hunk ./tsl-minimal.c 48 - int fd; hunk ./tsl-minimal.c 50 - serial = fopen(device, "r" ); - if (serial == NULL) { + sfd = open(device, O_RDONLY); + if (sfd < 0) { hunk ./tsl-minimal.c 54 - sprintf(buffer, "fopen: %s", device); + snprintf(buffer, 1024, "open: %s", device); hunk ./tsl-minimal.c 60 - fd = fileno(serial); - if (tcgetattr(fd, &termios) < 0) { + if (tcgetattr(sfd, &termios) < 0) { hunk ./tsl-minimal.c 75 - if (tcsetattr(fd, TCSANOW, &termios) < 0) { + if (tcsetattr(sfd, TCSANOW, &termios) < 0) { hunk ./tsl-minimal.c 84 + int s; hunk ./tsl-minimal.c 86 + cancel = 0; hunk ./tsl-minimal.c 88 - p = fgets(buffer, size, serial); - alarm(0); - if (p == NULL) { - perror("fgets"); - exit(1); + p = buffer; + s = size; + while (1) { + int n = read(sfd, p, 1); + if (cancel) break; + if (n == 0) { + sleep(1); + continue; + } + if (n < 0) { + perror("read"); + break; + } + if (*p == '\r' || *p == '\n') break; + p++; + s--; + if (s == 1) break; hunk ./tsl-minimal.c 106 + *p = '\0'; + alarm(0); hunk ./tsl-minimal.c 109 - return p; + return buffer; hunk ./tsl-minimal.c 114 - fclose(serial); + close(sfd); +} + +static void sigalrm(int signal) +{ + fprintf(stderr, "timeout cancel\n"); + cancel = 1; hunk ./tsl-minimal.c 134 - /* ignore SIGALRM */ + /* handle SIGALRM */ hunk ./tsl-minimal.c 137 - sa->sa_handler = SIG_IGN; + sa->sa_handler = sigalrm; hunk ./tsl-minimal.c 45 +static char *device; hunk ./tsl-minimal.c 47 -static void serial_open(char *device) +static void serial_open() hunk ./tsl-minimal.c 82 +static void serial_close() +{ + close(sfd); +} + hunk ./tsl-minimal.c 98 - if (cancel) break; + if (cancel) { + serial_close(); + sleep(10); + serial_open(); + break; + } hunk ./tsl-minimal.c 123 -static void serial_close() -{ - close(sfd); -} - hunk ./tsl-minimal.c 131 - char *device, *p, buffer[128]; + char *p, buffer[128]; hunk ./tsl-minimal.c 180 - serial_open(device); + serial_open();