summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-02-24 20:03:22 -0500
committerIan Moffett <ian@osmora.org>2025-02-24 20:03:22 -0500
commit35f6afddc220eacdb0ede22f63cabc5f58e2cf66 (patch)
treeb22e184f3d54ee1620377ce870a6094ba9ac10ff
parent0a11a88075bc6e44c473d54334b61e7bc973e163 (diff)
Fix up cursor issues and race conditionsmain
Signed-off-by: Ian Moffett <ian@osmora.org>
-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;
}