summaryrefslogtreecommitdiff
path: root/src/client/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/client.c')
-rw-r--r--src/client/client.c25
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;
}