mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-06-26 12:04:38 +08:00
Move client_t I/O and lifecycle out of ssh_server.c into a dedicated
module. ssh_server.c is now down to the listening socket, host key
setup, ssh_server_init / ssh_server_start, and the accept loop.
Migrated to client.{c,h}:
- client_send, client_printf
- client_addref, client_release (and the ssh_session / ssh_channel /
channel_cb teardown that fires on the final release)
- client_install_channel_callbacks
- client_channel_window_change / _eof / _close (the post-bootstrap
callbacks that target the client_t)
The client_t struct definition stays in ssh_server.h so we don't have
to revisit every existing #include chain. bootstrap, commands, exec,
input, and tui pick up the new client.h alongside their existing
ssh_server.h include.
ssh_server.c shrinks from 402 to 249 lines (-153).
Final per-module size after PR2:
ssh_server.c 249 accept loop + ssh_server_init/start + host key
bootstrap.c 493 per-connection SSH handshake / auth / channel
client.c 162 client_t I/O + lifecycle + channel callbacks
input.c 637 username read + handle_key + main loop +
notify_mentions + idle timeout
commands.c 269 vim ':' command dispatcher
exec.c 453 SSH exec subcommand dispatcher
ratelimit.c 197 IP rate limit + connection counters
tui.c 614 screen rendering
chat_room.c 151 room + client list
message.c 350 message log load/save/search
utf8.c 250 UTF-8 width / validation
common.c 133 buffer_*, env_int, is_valid_username,
sanitize_terminal_size, tnt_state_*
main.c 109 process entry
Total: ~4 000 lines of C across 13 files, no file over 650 lines, every
file is single-purpose. Behaviour is preserved: the migrated code is
byte-for-byte identical.
51 lines
1.5 KiB
C
51 lines
1.5 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;
|
|
char command_output[2048];
|
|
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 */
|