mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-06-26 07:54:39 +08:00
ESC in INSERT mode used to switch straight to NORMAL. Now it follows the same arrow-key probe COMMAND mode already does: if the next two bytes are "[A" or "[B", treat as Up / Down and walk through the last 16 messages this client has sent. A plain ESC still falls through to NORMAL — the 50 ms probe timeout keeps that path responsive. Storage: new client_t fields char insert_history[16][MAX_MESSAGE_LEN]; int insert_history_count; int insert_history_pos; Recording: every Enter that broadcasts a message pushes the input buffer onto the ring (with FIFO eviction at 16) and resets pos. Down at the bottom of the ring returns to an empty input. This is the standard chat-client recall that vim users (and anyone who's ever used a shell) expect.
57 lines
1.8 KiB
C
57 lines
1.8 KiB
C
#ifndef SSH_SERVER_H
|
|
#define SSH_SERVER_H
|
|
|
|
#include "common.h"
|
|
#include "chat_room.h"
|
|
#include <arpa/inet.h>
|
|
#include <libssh/libssh.h>
|
|
#include <libssh/server.h>
|
|
|
|
/* Client connection structure */
|
|
typedef struct client {
|
|
ssh_session session; /* SSH session */
|
|
ssh_channel channel; /* SSH channel */
|
|
char username[MAX_USERNAME_LEN];
|
|
char client_ip[INET6_ADDRSTRLEN];
|
|
_Atomic int width;
|
|
_Atomic int height;
|
|
client_mode_t mode;
|
|
help_lang_t help_lang;
|
|
int scroll_pos;
|
|
int help_scroll_pos;
|
|
bool show_help;
|
|
char command_input[256];
|
|
char command_history[16][256];
|
|
int command_history_count;
|
|
int command_history_pos;
|
|
/* INSERT mode chat-message history. Last 16 messages this client
|
|
* sent, oldest first. Up/Down in INSERT mode walks through it. */
|
|
char insert_history[16][MAX_MESSAGE_LEN];
|
|
int insert_history_count;
|
|
int insert_history_pos;
|
|
char command_output[2048];
|
|
bool show_motd; /* command_output holds MOTD text */
|
|
char exec_command[MAX_EXEC_COMMAND_LEN];
|
|
char ssh_login[MAX_USERNAME_LEN];
|
|
time_t connect_time;
|
|
time_t last_active;
|
|
atomic_bool redraw_pending;
|
|
bool mute_joins;
|
|
pthread_t thread;
|
|
atomic_bool connected;
|
|
int ref_count; /* Reference count for safe cleanup */
|
|
pthread_mutex_t ref_lock; /* Lock for ref_count */
|
|
pthread_mutex_t io_lock; /* Serialize SSH channel writes */
|
|
struct ssh_channel_callbacks_struct *channel_cb;
|
|
} client_t;
|
|
|
|
/* Initialize SSH server */
|
|
int ssh_server_init(int port);
|
|
|
|
/* Start SSH server (blocking) */
|
|
int ssh_server_start(int listen_fd);
|
|
|
|
/* Read-only accessor for the server start time (used by exec stats). */
|
|
time_t ssh_server_start_time(void);
|
|
|
|
#endif /* SSH_SERVER_H */
|