diff options
Diffstat (limited to 'src/client/client.c')
-rw-r--r-- | src/client/client.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/client/client.c b/src/client/client.c index df90243..58b2db4 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -36,6 +36,7 @@ #include <signal.h> #include <pthread.h> #include <termios.h> +#include <stdbool.h> // #define CENTRAL_SERVER "127.0.0.1" #define CENTRAL_SERVER "149.248.6.149" @@ -46,6 +47,19 @@ static volatile int got_thread = 0; static char input[512]; static size_t input_i = 0; static struct termios orig_termios; +volatile bool lock; + +void +lock_acq(volatile bool *lp) +{ + while (__atomic_test_and_set(lp, __ATOMIC_ACQUIRE)); +} + +void +lock_rel(volatile bool *lp) +{ + __atomic_clear(lp, __ATOMIC_RELEASE); +} void set_title(const char *text) { @@ -73,11 +87,10 @@ enable_raw_mode(void) tcgetattr(STDIN_FILENO, &orig_termios); raw = orig_termios; - raw.c_lflag &= ~(ICANON | ECHO); - tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw); - - raw.c_lflag &= ~(ECHO | ICANON | ISIG); + raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); + raw.c_oflag &= ~(OPOST); raw.c_cflag |= (CS8); + raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); } static void @@ -93,12 +106,14 @@ recv_td(void *args) got_thread = 1; while (1) { + lock_acq(&lock); if (session_recv(buf, sizeof(buf) - 1, &s) < 0) { printf("session_recv() failure\n"); return NULL; } printf("\n\033[1F\033[2K%s\n>> %s", buf, input); fflush(stdout); + lock_rel(&lock); } } @@ -154,7 +169,7 @@ main(int argc, char **argv) continue; } else if (c == 0x7F && input_i > 0) { input[input_i--] = '\0'; - printf("\b \b", input_i); + printf("\b \b"); continue; } |