+
+
+static int decode_sball(struct sball *sb, char *line)
+{
+ return -1;
+}
+
+static int decode_mag(struct sball *sb, char *line)
+{
+ return -1;
+}
+
+static void make_printable(char *buf, int len)
+{
+ int i, c;
+ char *wr = buf;
+
+ for(i=0; i<len; i++) {
+ c = *buf++;
+ if(c == '\r') {
+ *wr++ = '\n';
+ if(*buf == '\n') buf++;
+ } else {
+ *wr++ = c;
+ }
+ }
+ *wr = 0;
+}
+
+static int read_timeout(int fd, char *buf, int bufsz, long tm_usec)
+{
+ int res;
+ long usec, sz = 0;
+ struct timeval tv0, tv;
+ fd_set rdset;
+
+ if(!buf || bufsz <= 0) return -1;
+
+ usec = tm_usec;
+ gettimeofday(&tv0, 0);
+
+ while(sz < bufsz && usec > 0) {
+ tv.tv_sec = usec / 1000000;
+ tv.tv_usec = usec % 1000000;
+
+ FD_ZERO(&rdset);
+ FD_SET(fd, &rdset);
+ if((res = select(fd + 1, &rdset, 0, 0, &tv)) > 0 && FD_ISSET(fd, &rdset)) {
+ sz += read(fd, buf + sz, bufsz - sz);
+ buf[sz] = 0;
+ tm_usec = usec = 128000; /* wait 128ms for the rest of the message to appear */
+ gettimeofday(&tv0, 0);
+ continue;
+ }
+ if(res == -1 && (errno == EWOULDBLOCK || errno == EAGAIN)) {
+ break;
+ }
+ gettimeofday(&tv, 0);
+ usec = tm_usec - ((tv.tv_sec - tv0.tv_sec) * 1000000 + (tv.tv_usec - tv0.tv_usec));
+ }
+
+ return sz > 0 ? sz : -1;
+}
+