fixed uninitialized keystate
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 7 Nov 2020 02:16:42 +0000 (04:16 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 7 Nov 2020 02:16:42 +0000 (04:16 +0200)
SGI/IRIX fixes:
 - unaligned access in little endian conversion (which was erroneously done)
 - detect endianess and set appropriate macro
 - detect if CRTSCTS is defined before trying to use it (it's a BSD flag)
 - but first detect if the POSIX CCTS_OFLOW is available (hint: it's not on IRIX)

src/sball.c

index 951ff45..2a893de 100644 (file)
 #include <sys/time.h>
 #include <sys/ioctl.h>
 
+#if  defined(__i386__) || defined(__ia64__) || defined(WIN32) || \
+    (defined(__alpha__) || defined(__alpha)) || \
+     defined(__arm__) || \
+    (defined(__mips__) && defined(__MIPSEL__)) || \
+     defined(__SYMBIAN32__) || \
+     defined(__x86_64__) || \
+     defined(__LITTLE_ENDIAN__)
+#define SBALL_LITTLE_ENDIAN
+#else
+#define SBALL_BIG_ENDIAN
+#endif
+
 #define INP_BUF_SZ     256
 
 enum {
@@ -64,13 +76,11 @@ struct sball *sball_open(const char *dev)
                return 0;
        }
 
-       if(!(sb = malloc(sizeof *sb))) {
+       if(!(sb = calloc(1, sizeof *sb))) {
                fprintf(stderr, "sball_open: failed to allocate sball object\n");
                goto err;
        }
        sb->fd = fd;
-       sb->flags = 0;
-       sb->len = 0;
 
        stty_save(sb);
 
@@ -224,7 +234,12 @@ static int stty_mag(struct sball *sb)
        term.c_cc[VERASE] = 0;
        term.c_cc[VKILL] = 0;
 
-       term.c_cflag = CLOCAL | CREAD | CS8 | CSTOPB | HUPCL | CRTSCTS;
+       term.c_cflag = CLOCAL | CREAD | CS8 | CSTOPB | HUPCL;
+#ifdef CCTS_OFLOW
+       term.c_cflag |= CCTS_OFLOW;
+#elif defined(CRTSCTS)
+       term.c_cflag |= CRTSCTS;
+#endif
        term.c_iflag = IGNBRK | IGNPAR;
 
        cfsetispeed(&term, B9600);
@@ -370,16 +385,15 @@ static int sball_parsepkt(struct sball *sb, int id, char *data, int len)
                }
 
 #ifndef SBALL_BIG_ENDIAN
+               rd = data;
                for(i=0; i<6; i++) {
-                       data += 2;
-                       c = data[0];
-                       data[0] = data[1];
-                       data[1] = c;
-                       sb->mot[i] = *(short*)data;
+                       rd += 2;
+                       c = rd[0];
+                       rd[0] = rd[1];
+                       rd[1] = c;
                }
-#else
-               memcpy(sb->mot, data + 2, 12);
 #endif
+               memcpy(sb->mot, data + 2, 12);
                print_state(sb);
                break;
 
@@ -427,7 +441,7 @@ static int sball_parsepkt(struct sball *sb, int id, char *data, int len)
        case 'E':
                fprintf(stderr, "sball: error:");
                for(i=0; i<len; i++) {
-                       if(isprint(data[i])) {
+                       if(isprint((int)data[i])) {
                                fprintf(stderr, " %c", data[i]);
                        } else {
                                fprintf(stderr, " %02xh", (unsigned int)data[i]);