From: John Tsiombikas Date: Sat, 7 Nov 2020 02:16:42 +0000 (+0200) Subject: fixed uninitialized keystate X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=sball;a=commitdiff_plain;h=8d35aa7775627c24b54db6883b4df7ba0cc65c34 fixed uninitialized keystate 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) --- diff --git a/src/sball.c b/src/sball.c index 951ff45..2a893de 100644 --- a/src/sball.c +++ b/src/sball.c @@ -11,6 +11,18 @@ #include #include +#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