From fb58f3089bfdcb389ba17245e5f6e58d5dff0b8b Mon Sep 17 00:00:00 2001 From: Ryan Collier Date: Wed, 24 Jun 2026 14:56:16 -0400 Subject: [PATCH] New Version 52 all issues fix with better menu's and borders along with port names. --- Makefile_CLI | 4 +- README.md | 114 +++++++++++++ termtcp | Bin 51008 -> 51384 bytes termtcp_cli.c | 434 ++++++++++++++++++++++++++++++++++---------------- termtcp_cli.o | Bin 64560 -> 67888 bytes 5 files changed, 409 insertions(+), 143 deletions(-) create mode 100644 README.md diff --git a/Makefile_CLI b/Makefile_CLI index 117f154..8aeb06d 100644 --- a/Makefile_CLI +++ b/Makefile_CLI @@ -2,8 +2,8 @@ # Simple command-line TCP client CC = gcc -CFLAGS = -Wall -Wextra -O2 -std=gnu99 -LDFLAGS = -lm -lncurses +CFLAGS = -Wall -Wextra -O2 -std=gnu99 -D_XOPEN_SOURCE_EXTENDED +LDFLAGS = -lm -lncursesw TARGET = termtcp SOURCE = termtcp_cli.c diff --git a/README.md b/README.md new file mode 100644 index 0000000..a5afa57 --- /dev/null +++ b/README.md @@ -0,0 +1,114 @@ +# TermTCP CLI + +A terminal TCP client for BPQ32 packet radio nodes, written in C with an ncurses TUI. Connects via BPQTermTCP protocol, displays split output/monitor panes, and supports real-time RF frame monitoring with port filtering. + +## Features + +- ncurses TUI with split output and monitor panes +- BPQ packet radio node support (BPQTermTCP protocol) +- RF monitor with per-port and frame-type filtering +- Auto-populates port names from the BPQ server on connect +- Scrollable output and monitor windows with history +- Input history (Up/Down arrows) +- Session logging to timestamped files +- Multiple host configuration with quick connect +- Unicode box-drawing borders on all menus + +## Dependencies + +- GCC +- ncurses (wide character support — `libncursesw6`) + +### Install dependencies on Debian/Ubuntu + +```bash +sudo apt install gcc libncurses-dev +``` + +## Build + +```bash +make -f Makefile_CLI +``` + +The binary is `./termtcp`. + +### Other make targets + +``` +make -f Makefile_CLI clean # Remove build artifacts +make -f Makefile_CLI debug # Build with debug symbols +make -f Makefile_CLI install # Install to /usr/local/bin/ +``` + +### Manual compile + +```bash +gcc -Wall -Wextra -O2 -std=gnu99 -D_XOPEN_SOURCE_EXTENDED \ + -o termtcp termtcp_cli.c -lm -lncursesw +``` + +## Configuration + +On first run, `~/.termtcprc` is created automatically. Edit it to add BPQ nodes: + +```ini +[Host0] +Host=10.0.2.7 +Port=17023 +Username=kb8pmy +Password=yourpassword +Name=Home Node + +[Host1] +Host=10.121.15.68 +Port=17023 +Username=kb8pmy +Password=yourpassword +Name=Water Tower +``` + +Port names and monitor settings are also saved here automatically. + +## Usage + +```bash +./termtcp +``` + +### Key bindings + +| Key | Action | +|-----|--------| +| Ctrl+A | Open menu | +| Ctrl+A C | Connect | +| Ctrl+A D | Disconnect | +| Ctrl+A O | Config / host editor | +| Ctrl+A M | Monitor options | +| Ctrl+A L | Toggle session log | +| Ctrl+A H | Help | +| Ctrl+A Q | Quit | +| Up / Down | Input history | +| PgUp / PgDn | Scroll output window | +| Home / End | Scroll monitor window | +| Enter | Send line to server | + +### Monitor options (Ctrl+A M) + +- Toggle TX, supervisor, nodes, and UI-only filtering +- Toggle monitor pane visibility +- Select which RF ports to monitor (Tab to switch to port selection) + +Port names are auto-populated from the BPQ server when you connect. + +## BPQ Protocol Notes + +- Connects using BPQTermTCP protocol (same as QtTermTCP) +- Sends trace options on connect to enable RF monitoring +- Port list is requested automatically via P8=1 parameter +- Monitor frames delimited by `0xFF` / `0xFE` byte markers +- NODES broadcasts filtered client-side via `>NODES` detection in AX.25 header + +## Version + +Current: **0.0.52** diff --git a/termtcp b/termtcp index f3db602a882d969d6360bc150cf4c62d11094264..43e7c64502937e5bff9ad7e314592a9c3ec42028 100755 GIT binary patch literal 51384 zcmeFa33yc1`9FRq$v{|=8|InnZON97FJP|AxtJDC7YQE2^KLh ziE_W=0JT=JYKu!Pwc1i^5vaw4B>~rfR&gcncMMypg#g0*KkvEc&fJU{+u!&3|DNan ze;zN)obxW{J@0wXd-iiP_Y~Nt#uyBO_QVR41%lRJr(*IrVQV{&AjlK4g#>(?gfYS( zz;O(x((}{+RP{L+(?5*o_*jILZX`tp2rpOBf);8TQb_5dJ=vG46fG2zRG88kDQcoG zJSO%X3im8jVJ+0BWBIjk{)q6g5h`8__36kqnUAXU%s=!G#KlSedi6`~XW%hd;)R-M`T$DiN( z+MQSYQoQ=n*Z2E~hxDd2#6u79^C}O)MTij(vqw_L1%?(uAY3s%^z3)NS#$8Z`!B!v zC*BoTK6PJ$iXHg-DhRr80FpHdeja!S;$IMj|6wRU5dXtbB|Y?GbpvQ8=f_QSNGREva&QTn%%I@~i7=U31D7SGxpl)lbQza%cE{EIY5%6(3E6W;$ro~H_ zlnYH|<>k&w!a7`TCq$Jk7i#NV&dNHFJe~$eU9Hfx1ZgUT23L7QSrcW|w79MTS~Gby z%bMyNs%kw=OjNDg(;!rqxwVX4wdE{RMi3Rxae1*k=pQ#s)Xj**$CHity#Qirp0siUH-s#X_O10r>s0QS4AO#d)S-4>|rU}!Dp&DGyWuykPbOl2>9GIj!xqH- zsz}n4R8-ZLRae~wYu7o;s!1cNa0VdeX&_EA26U>c_fXVTyG*EXR@b41 zoOQLeE+<)`3Jf_p4!7G`R$BqsU8~clqN$n!RvJzGGa*je-`lWQC&RL$Mol(Ts3>Tt=2qoIiKg z?1I@79CHebrIdurf4F%_5@TpWa ztr2NS0^wB3FvN`v9u6FRwEW_Lr<@3*${=bi`)7bQmtv7Y>yCPSE~%=*dSRGwHOKw( z=MQ0-F+@n`@CZhaXX{K#^CF`U5~gsv=hCVnv??m%aN}hJ#|gIrrpJJP!#K?ZIJW2( z`W9RvdYo_ueJ;tSCnxV(*re|b@+>P{3acqZ*4JZst%v56B%XIwnb@)*_{30D*+dCw3r4CPP7wxIn;jhq;2%B~IF*hSAz zc>O$bgARYSj(?*LZ`R>A>F_B!{AL~g8XbPC4*wG!zFmh;)#3N*@M$`Hw+?@;4u4RG zzfOnm(cyWQ%BYGCpRVISuEUSj;rn#>OdVd}{Sx`VMTd{q;m7IlNjm%uI{Zi-e!LEE z(&4jo_*5N!f)1al!{4aGXY256BEV^RI(&|fU((?x>hPsH{7pLid>ww04!=l;&(+~8 zb@<6Te7z2Tvku>^!{_PnEjqkahhL+^PtoDm>+tzH{01G~ro(U4;iu~Gn{@bTI{aoG zUee*W>hOg+e7g=mU5DSR!_Uy+yLEWG4*z5HM+^LDfgdgKqXmAn!2h2u@GtR-Gm`gk zyyP>!zYfc|wsucUuv_x(j^D+K70g=f7ldF+Iljd)c>?iQ5+(3iFc_>@&tO`>1rCH^ zTDS#vhGAN;1zrflv``B?8HQUTiSI(?rv*vivoK5xk-&j4Obd{}&M-_1kH8CIm=+v?C&Mr;Gy)HV zVOn4WR)=9)SOglvFfAwoi^DK2Bm%R-FfAYgQ^GJU90KFQFfAAYSA}6(CJIBH-c(cxnVZIRc�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 diff --git a/termtcp_cli.c b/termtcp_cli.c index ef9fcbd..4b125bb 100644 --- a/termtcp_cli.c +++ b/termtcp_cli.c @@ -27,14 +27,17 @@ #include #include #include +#include #include +#include +#include #include #ifndef PATH_MAX #define PATH_MAX 4096 #endif -#define VERSION "0.0.49" +#define VERSION "0.0.52" #define MAX_HOSTS 4 #define INPUT_MAX 512 #define CONF_FILE ".termtcprc" @@ -88,6 +91,8 @@ int mon_colour = 1; int mon_ui_only = 1; int port_mask = 0xFFFF; int in_mon_frame = 0; +static char mon_fbuf[4096]; /* accumulates one complete 0xFF…0xFE monitor frame */ +static int mon_flen = 0; int port_seen = 0; /* bitmask: bit N-1 set when port N seen in monitor data */ char port_names[32][32]; /* names for ports 1-32, loaded from config or defaulted */ @@ -96,6 +101,7 @@ char port_names[32][32]; /* names for ports 1-32, loaded from config or defa static char ports_line_buf[256]; static int ports_line_len = 0; static int ports_parse_mode = 0; /* 1 while inside "} Ports" response */ +static int ports_loaded = 0; /* set when PORTS list fully received */ /* ── Scrollback buffers ──────────────────────────────────── */ static ScrlLine out_sbuf[SCRL_MAX]; @@ -361,8 +367,12 @@ void tcp_disconnect(void) connected = 0; connect_time = 0; in_mon_frame = 0; + mon_flen = 0; ports_parse_mode = 0; ports_line_len = 0; + ports_loaded = 0; + port_seen = 0; + for (int i = 0; i < 32; i++) snprintf(port_names[i], 32, "Port %d", i + 1); draw_status(); } @@ -381,6 +391,48 @@ void send_trace_options(void) send(sock, buf, len, 0); } +/* Same as send_trace_options but appends P8=1, which tells BPQ to call + * SendPortsForMonitor() — returns port list as 0xFF 0xFF N|num desc|... */ +static void send_trace_options_with_ports(void) +{ + if (sock < 0) return; + char buf[80]; + int len = snprintf(buf, sizeof(buf), + "\\\\\\\\%x %x %x %x %x %x 0 1\r", + port_mask, mon_tx, mon_com, + mon_nodes, mon_colour, mon_ui_only); + send(sock, buf, len, 0); +} + +/* Parse the 0xFF 0xFF port-info packet from SendPortsForMonitor. + * Format (after both 0xFF bytes): "N|portnum desc|portnum desc|..." + * N = total entries; portnum 0 = Mail Monitor (skipped). */ +static void parse_portinfo(const char *data, int len) +{ + const char *p = data, *e = data + len; + int nports = 0; + while (p < e && *p >= '0' && *p <= '9') nports = nports * 10 + (*p++ - '0'); + if (p >= e || *p != '|') return; + p++; + for (int i = 0; i < nports && p < e; i++) { + int n = 0; + while (p < e && *p >= '0' && *p <= '9') n = n * 10 + (*p++ - '0'); + if (p >= e || *p != ' ') break; + p++; + const char *desc = p; + while (p < e && *p != '|') p++; + int dlen = (int)(p - desc); + if (n >= 1 && n <= 32 && dlen > 0) { + int copy = dlen < 31 ? dlen : 31; + memcpy(port_names[n - 1], desc, copy); + port_names[n - 1][copy] = '\0'; + port_seen |= (1u << (n - 1)); + } + if (p < e && *p == '|') p++; + } + ports_loaded = 1; +} + static int bpq_color_attr(unsigned char color_byte) { /* Map BPQ Colours[] index (color_byte - 10) to nearest terminal color. @@ -459,7 +511,8 @@ static void parse_session_line(const char *line, int len) port_seen |= (1 << (n-1)); } } else { - ports_parse_mode = 0; /* Non-matching line ends the list */ + if (ports_parse_mode) ports_loaded = 1; /* list ended cleanly */ + ports_parse_mode = 0; } } @@ -497,17 +550,46 @@ void bpq_process(const char *buf, int len) feed_session_byte((unsigned char)*q); append_out(p, (int)(ff - p), COLOR_PAIR(CP_DEFAULT)); } - in_mon_frame = 1; + /* 0xFF 0xFF = SendPortsForMonitor response; 0xFF 0x1B = monitor frame */ p = ff + 1; + if (p < end && (unsigned char)*p == 0xFF) { + /* Port info packet — parse in place, consume to end of buffer */ + parse_portinfo(p + 1, (int)(end - p - 1)); + p = end; + } else { + in_mon_frame = 1; + mon_flen = 0; + } } else { const char *fe = memchr(p, 0xFE, end - p); int seg_len = fe ? (int)(fe - p) : (int)(end - p); if (seg_len > 0) { detect_port_number(p, seg_len); - append_mon(p, seg_len, COLOR_PAIR(CP_GREEN)); + /* Accumulate into the per-frame buffer */ + int room = (int)sizeof(mon_fbuf) - 1 - mon_flen; + if (room > 0) { + int add = seg_len < room ? seg_len : room; + memcpy(mon_fbuf + mon_flen, p, add); + mon_flen += add; + } + } + if (fe) { + /* Frame complete: apply client-side NODES filter then display */ + if (mon_flen > 0) { + mon_fbuf[mon_flen] = '\0'; + /* Detect NODES broadcast by AX.25 destination ">NODES" in header */ + int is_nodes = 0; + for (int i = 0; i <= mon_flen - 6 && !is_nodes; i++) + if (memcmp(mon_fbuf + i, ">NODES", 6) == 0) is_nodes = 1; + if (mon_nodes || !is_nodes) + append_mon(mon_fbuf, mon_flen, COLOR_PAIR(CP_GREEN)); + } + mon_flen = 0; + in_mon_frame = 0; + p = fe + 1; + } else { + break; } - if (fe) { in_mon_frame = 0; p = fe + 1; } - else { break; } } } @@ -534,27 +616,20 @@ void init_colors(void) init_pair(CP_SEP, COLOR_CYAN, COLOR_BLACK); } -/* Draw a plain ASCII border (+, -, |) around window w. - * Title (if any) is written over the top border by the caller after this. */ -static void ascii_box(WINDOW *w) + +/* Draw a box using Unicode cchar_t — bypasses ACS so it works on any UTF-8 terminal */ +static void draw_box(WINDOW *w) { - int rows, cols; - getmaxyx(w, rows, cols); - mvwaddch(w, 0, 0, '+'); - mvwaddch(w, 0, cols-1, '+'); - mvwaddch(w, rows-1, 0, '+'); - mvwaddch(w, rows-1, cols-1, '+'); - for (int c = 1; c < cols-1; c++) { - mvwaddch(w, 0, c, '-'); - mvwaddch(w, rows-1, c, '-'); - } - for (int r = 1; r < rows-1; r++) { - mvwaddch(w, r, 0, '|'); - mvwaddch(w, r, cols-1, '|'); - } + cchar_t vt, hz, ul, ur, ll, lr; + setcchar(&vt, L"│", 0, 0, NULL); /* │ */ + setcchar(&hz, L"─", 0, 0, NULL); /* ─ */ + setcchar(&ul, L"┌", 0, 0, NULL); /* ┌ */ + setcchar(&ur, L"┐", 0, 0, NULL); /* ┐ */ + setcchar(&ll, L"└", 0, 0, NULL); /* └ */ + setcchar(&lr, L"┘", 0, 0, NULL); /* ┘ */ + wborder_set(w, &vt, &vt, &hz, &hz, &ul, &ur, &ll, &lr); } - /* Fill a 1-row window with plain '-' dashes and an optional centred label. * No ACS — works on any terminal. */ static void fill_sep(WINDOW *w, const char *label) @@ -563,7 +638,9 @@ static void fill_sep(WINDOW *w, const char *label) werase(w); wbkgd(w, COLOR_PAIR(CP_SEP)); wattron(w, COLOR_PAIR(CP_SEP)); - whline(w, '-', COLS); + cchar_t hz; + setcchar(&hz, L"─", 0, 0, NULL); + whline_set(w, &hz, COLS); if (label && COLS > 4) { int llen = (int)strlen(label); int col = (COLS - llen) / 2; @@ -672,8 +749,9 @@ static void scrl_draw_window(WINDOW *win, ScrlLine *buf, int count, int head, int scroll_off) { if (!win) return; + scrollok(win, FALSE); /* disable scroll during batch redraw — prevents losing lines */ werase(win); - if (count == 0) { wrefresh(win); return; } + if (count == 0) { scrollok(win, TRUE); wrefresh(win); return; } int win_h, win_w; getmaxyx(win, win_h, win_w); @@ -702,8 +780,12 @@ static void scrl_draw_window(WINDOW *win, ScrlLine *buf, int count, int head, else { p++; } } wattroff(win, cur); - waddch(win, '\n'); + if (i < last) waddch(win, '\n'); } + /* Move cursor to start of next blank row so live appends begin on a fresh line */ + int drawn = last - first + 1; + if (drawn < win_h) wmove(win, drawn, 0); + scrollok(win, TRUE); /* re-enable for live appends */ wrefresh(win); } @@ -884,6 +966,19 @@ static void refresh_all(void) draw_input(); } +/* Full background repaint using redrawwin() — safe alternative to + * clearok(curscr) which resets ACS mode and breaks box() borders. */ +static void force_repaint(void) +{ + if (status_win) redrawwin(status_win); + if (sep_win) redrawwin(sep_win); + if (out_win) redrawwin(out_win); + if (mon_win) redrawwin(mon_win); + if (sep2_win) redrawwin(sep2_win); + if (input_win) redrawwin(input_win); + refresh_all(); +} + static void config_menu(void) { int mh = 18, mw = 64; @@ -926,7 +1021,7 @@ static void config_menu(void) strncpy(fields[3], hosts[cur_host].password, 79); fields[3][79]=0; strncpy(fields[4], hosts[cur_host].name, 49); fields[4][49]=0; - werase(w); ascii_box(w); + werase(w); draw_box(w); mvwprintw(w, 0, (mw-14)/2, " Config Hosts "); mvwprintw(w, 2, 2, "Host %d of %d PgUp/PgDn=switch N=new D=delete", cur_host+1, num_hosts); @@ -1002,18 +1097,17 @@ static void config_menu(void) #undef CF_COMMIT delwin(w); - touchwin(stdscr); refresh(); - refresh_all(); + force_repaint(); } /* ═══════════════════════════════════════════════════════════ * Monitor options (Ctrl+A -> M) * ═══════════════════════════════════════════════════════════ */ -static void monitor_options_menu(void) +/* Returns 'P' to switch to port page, 0 to close */ +static int mon_options_page(void) { - /* Two pages: 0 = options, 1 = ports. Tab switches between them. */ - static const char *opt_labels[] = { + static const char *labels[] = { "Monitor TX", "Monitor Supervisor", "Monitor Nodes", @@ -1021,120 +1115,125 @@ static void monitor_options_menu(void) "Enable Colour", "Show Monitor Pane", }; - int *opt_vals[] = { - &mon_tx, &mon_com, &mon_nodes, &mon_ui_only, &mon_colour, &mon_visible - }; - const int N_OPTS = 6; + int *vals[] = { &mon_tx, &mon_com, &mon_nodes, &mon_ui_only, &mon_colour, &mon_visible }; + const int N = 6; + int mh = N + 5, mw = 46; + int my = (LINES - mh) / 2; if (my < 0) my = 0; + int mx = (COLS - mw) / 2; if (mx < 0) mx = 0; - int mh = 14, mw = 46; - int my = (LINES-mh)/2; if (my<0) my=0; - int mx = (COLS-mw)/2; if (mx<0) mx=0; + force_repaint(); WINDOW *w = newwin(mh, mw, my, mx); wbkgd(w, COLOR_PAIR(CP_DEFAULT)); keypad(w, TRUE); nodelay(w, FALSE); - int page = 0; /* 0=options 1=ports */ - int cur = 0; - int running = 1; + int cur = 0; + for (;;) { + werase(w); + draw_box(w); + mvwprintw(w, 0, (mw - 18) / 2, " Monitor Options "); + for (int i = 0; i < N; i++) { + if (i == cur) wattron(w, A_REVERSE); + mvwprintw(w, 2 + i, 3, "[%c] %s", *vals[i] ? 'X' : ' ', labels[i]); + if (i == cur) wattroff(w, A_REVERSE); + } + mvwprintw(w, mh - 3, 3, "Up/Down=move Space=toggle"); + mvwprintw(w, mh - 2, 3, "Tab=Port Select Esc/Q=close"); + wrefresh(w); - while (running) { - werase(w); ascii_box(w); - - if (page == 0) { - mvwprintw(w, 0, (mw-18)/2, " Monitor Options "); - mvwprintw(w, 1, 2, "[Options] Ports Tab=switch"); - for (int i = 0; i < N_OPTS; i++) { - if (i == cur) wattron(w, A_REVERSE); - mvwprintw(w, 3+i, 3, "[%c] %s", - *opt_vals[i] ? 'X' : ' ', opt_labels[i]); - if (i == cur) wattroff(w, A_REVERSE); - } - mvwprintw(w, mh-3, 3, "Up/Down = navigate"); - mvwprintw(w, mh-2, 3, "Space = toggle Esc/Q = close"); - } else { - /* Build list of ports to show: detected ones, or 1-8 if none yet */ - int port_list[32], n_ports = 0; - for (int b = 0; b < 32; b++) - if (port_seen & (1 << b)) port_list[n_ports++] = b + 1; - if (n_ports == 0) - for (int b = 0; b < 8; b++) port_list[n_ports++] = b + 1; - - /* Resize window if needed */ - int need_h = 4 + n_ports + 1; - if (need_h < 8) need_h = 8; - if (need_h != mh) { - mh = need_h; + int ch = wgetch(w); + switch (ch) { + case KEY_UP: cur = (cur - 1 + N) % N; break; + case KEY_DOWN: cur = (cur + 1) % N; break; + case '\t': + delwin(w); + return 'P'; + case ' ': case '\r': case '\n': case KEY_ENTER: + if (cur == 5) { + mon_visible = !mon_visible; delwin(w); - my = (LINES-mh)/2; if (my<0) my=0; - mx = (COLS-mw)/2; if (mx<0) mx=0; - w = newwin(mh, mw, my, mx); - wbkgd(w, COLOR_PAIR(CP_DEFAULT)); - keypad(w, TRUE); - nodelay(w, FALSE); - werase(w); ascii_box(w); + create_windows(); + force_repaint(); + return 0; } + *vals[cur] = !(*vals[cur]); + send_trace_options(); + break; + case 27: case 'Q': case 'q': + delwin(w); + force_repaint(); + return 0; + } + } +} - mvwprintw(w, 0, (mw-16)/2, " Port Selection "); - mvwprintw(w, 1, 2, " Options [Ports] Tab=switch"); - if (port_seen == 0) - mvwprintw(w, 2, 3, "(connect to auto-detect ports)"); - for (int i = 0; i < n_ports; i++) { - int pn = port_list[i]; - if (i == cur) wattron(w, A_REVERSE); - mvwprintw(w, 3+i, 3, "[%c] %2d %-27s", - (port_mask >> (pn-1)) & 1 ? 'X' : ' ', - pn, port_names[pn-1]); - if (i == cur) wattroff(w, A_REVERSE); - } - mvwprintw(w, mh-2, 3, "Space = toggle Esc/Q = close"); +/* Returns 'O' to switch to options page, 0 to close */ +static int mon_ports_page(void) +{ + int port_list[32], n_ports = 0; + for (int b = 0; b < 32; b++) + if (port_seen & (1 << b)) port_list[n_ports++] = b + 1; + if (n_ports == 0) + for (int b = 0; b < 8; b++) port_list[n_ports++] = b + 1; + + int mh = n_ports + 5; if (mh < 10) mh = 10; + int mw = 54; + int my = (LINES - mh) / 2; if (my < 0) my = 0; + int mx = (COLS - mw) / 2; if (mx < 0) mx = 0; + + force_repaint(); + + WINDOW *w = newwin(mh, mw, my, mx); + wbkgd(w, COLOR_PAIR(CP_DEFAULT)); + keypad(w, TRUE); + nodelay(w, FALSE); + + int cur = 0; + for (;;) { + werase(w); + draw_box(w); + mvwprintw(w, 0, (mw - 16) / 2, " Port Selection "); + if (port_seen == 0) + mvwprintw(w, 2, 3, "(connect to auto-detect ports)"); + for (int i = 0; i < n_ports; i++) { + int pn = port_list[i]; + if (i == cur) wattron(w, A_REVERSE); + mvwprintw(w, 2 + i, 3, "[%c] %2d %-32s", + (port_mask >> (pn - 1)) & 1 ? 'X' : ' ', + pn, port_names[pn - 1]); + if (i == cur) wattroff(w, A_REVERSE); } + mvwprintw(w, mh - 3, 3, "Up/Down=move Space=toggle"); + mvwprintw(w, mh - 2, 3, "Tab=Monitor Opts Esc/Q=close"); wrefresh(w); - /* Build current port list for key handling */ - int port_list2[32], n_ports2 = 0; - if (page == 1) { - for (int b = 0; b < 32; b++) - if (port_seen & (1 << b)) port_list2[n_ports2++] = b + 1; - if (n_ports2 == 0) - for (int b = 0; b < 8; b++) port_list2[n_ports2++] = b + 1; - } - int max_items = (page == 0) ? N_OPTS : n_ports2; int ch = wgetch(w); switch (ch) { - case KEY_UP: - cur = (cur - 1 + max_items) % max_items; break; - case KEY_DOWN: - cur = (cur + 1) % max_items; break; + case KEY_UP: cur = (cur - 1 + n_ports) % n_ports; break; + case KEY_DOWN: cur = (cur + 1) % n_ports; break; case '\t': - page = 1 - page; cur = 0; break; + delwin(w); + return 'O'; case ' ': case '\r': case '\n': case KEY_ENTER: - if (page == 0) { - if (cur == 5) { /* Show Monitor Pane — needs window rebuild */ - mon_visible = !mon_visible; - delwin(w); - touchwin(stdscr); refresh(); - create_windows(); - refresh_all(); - return; - } - *opt_vals[cur] = !(*opt_vals[cur]); - send_trace_options(); - } else { - int pn = (cur < n_ports2) ? port_list2[cur] : cur + 1; - port_mask ^= (1 << (pn - 1)); - send_trace_options(); - } + port_mask ^= (1 << (port_list[cur] - 1)); + send_trace_options(); break; case 27: case 'Q': case 'q': - running = 0; break; + delwin(w); + force_repaint(); + return 0; } } +} - delwin(w); - touchwin(stdscr); refresh(); - refresh_all(); +static void monitor_options_menu(void) +{ + int next = 'O'; + while (next) { + if (next == 'O') next = mon_options_page(); + else next = mon_ports_page(); + } } /* ═══════════════════════════════════════════════════════════ @@ -1143,10 +1242,10 @@ static void monitor_options_menu(void) static void show_help(void) { - int mh = 18, mw = 52; + int mh = 19, mw = 52; WINDOW *w = newwin(mh, mw, (LINES-mh)/2, (COLS-mw)/2); wbkgd(w, COLOR_PAIR(CP_DEFAULT)); - ascii_box(w); + draw_box(w); mvwprintw(w, 0, (mw-8)/2, " Help "); mvwprintw(w, 2, 3, "Ctrl+A Open menu"); @@ -1160,15 +1259,15 @@ static void show_help(void) mvwprintw(w, 11, 3, "Enter Send line to server"); mvwprintw(w, 12, 3, "Up / Down Input history"); mvwprintw(w, 13, 3, "PgUp / PgDn Scroll output window"); - mvwprintw(w, 14, 3, "Backspace Delete char"); + mvwprintw(w, 14, 3, "Home / End Scroll monitor window"); + mvwprintw(w, 15, 3, "Backspace Delete char"); mvwprintw(w, mh-2, 3, "Press any key to close"); wrefresh(w); nodelay(w, FALSE); wgetch(w); delwin(w); - touchwin(stdscr); refresh(); - refresh_all(); + force_repaint(); } /* ═══════════════════════════════════════════════════════════ @@ -1212,9 +1311,33 @@ static void do_connect(int idx) COLOR_PAIR(CP_YELLOW)); } - send_trace_options(); - /* Ask the node for its port list; response is parsed in parse_session_line() */ - tcp_send("PORTS\r", 6); + /* P8=1 triggers BPQ's SendPortsForMonitor → arrives as 0xFF 0xFF packet */ + send_trace_options_with_ports(); + + /* Drain incoming data for up to 2 seconds waiting for PORTS response. + * A single recv() often gets only the login banner; loop until we have + * the full port list (ports_loaded) or the deadline passes. */ + { + char rbuf[4096]; + struct timeval t0, now; + gettimeofday(&t0, NULL); + for (;;) { + gettimeofday(&now, NULL); + long elapsed = (now.tv_sec - t0.tv_sec) * 1000000L + + (now.tv_usec - t0.tv_usec); + if (elapsed >= 2000000L) break; + if (ports_loaded) break; + long remain = 2000000L - elapsed; + fd_set rfds; + struct timeval tv = { remain / 1000000L, remain % 1000000L }; + FD_ZERO(&rfds); FD_SET(sock, &rfds); + if (select(sock + 1, &rfds, NULL, NULL, &tv) <= 0) break; + int n = recv(sock, rbuf, sizeof(rbuf) - 1, 0); + if (n <= 0) break; + bpq_process(rbuf, n); + } + } + draw_status(); } @@ -1230,7 +1353,7 @@ static void ctrl_a_menu(void) WINDOW *w = newwin(mh, mw, my, mx); wbkgd(w, COLOR_PAIR(CP_DEFAULT)); - ascii_box(w); + draw_box(w); mvwprintw(w, 0, (mw-14)/2, " TermTCP Menu "); mvwprintw(w, 2, 4, "C - Connect"); mvwprintw(w, 3, 4, "D - Disconnect"); @@ -1245,18 +1368,27 @@ static void ctrl_a_menu(void) nodelay(w, FALSE); int ch = wgetch(w); delwin(w); - touchwin(stdscr); refresh(); - refresh_all(); + force_repaint(); switch (ch | 0x20) { case 'c': if (num_hosts == 1) { do_connect(0); } else if (num_hosts > 1) { - int ph = num_hosts + 5, pw = 38; + /* Auto-size width to fit the longest entry */ + int pw = 20; + for (int i = 0; i < num_hosts; i++) { + int len = snprintf(NULL, 0, "%d - %s (%s:%s)", i, + hosts[i].name, hosts[i].host, hosts[i].port) + 6; + if (len > pw) pw = len; + } + int hint_w = snprintf(NULL, 0, "0-%d = pick Esc = cancel", num_hosts-1) + 6; + if (hint_w > pw) pw = hint_w; + if (pw > COLS) pw = COLS; + int ph = num_hosts + 5; WINDOW *hw = newwin(ph, pw, (LINES-ph)/2, (COLS-pw)/2); wbkgd(hw, COLOR_PAIR(CP_DEFAULT)); - box(hw, 0, 0); + draw_box(hw); mvwprintw(hw, 0, (pw-14)/2, " Select Host "); for (int i = 0; i < num_hosts; i++) mvwprintw(hw, 2+i, 3, "%d - %s (%s:%s)", i, @@ -1266,8 +1398,7 @@ static void ctrl_a_menu(void) nodelay(hw, FALSE); int hch = wgetch(hw); delwin(hw); - touchwin(stdscr); refresh(); - refresh_all(); + force_repaint(); if (hch >= '0' && hch < '0' + num_hosts) do_connect(hch - '0'); } @@ -1358,6 +1489,27 @@ static void handle_key(int ch) } return; + case KEY_HOME: /* Home — scroll monitor back */ + if (mon_win && mon_visible) { + int page = getmaxy(mon_win); + mon_scroll += page; + int max_scroll = mon_sbuf_count > 0 ? mon_sbuf_count - 1 : 0; + if (mon_scroll > max_scroll) mon_scroll = max_scroll; + scrl_redraw_mon(); + if (input_win) wrefresh(input_win); + } + return; + + case KEY_END: /* End — scroll monitor forward / return to live */ + if (mon_win && mon_visible && mon_scroll > 0) { + int page = getmaxy(mon_win); + mon_scroll -= page; + if (mon_scroll < 0) mon_scroll = 0; + scrl_redraw_mon(); + if (input_win) wrefresh(input_win); + } + return; + case '\r': case '\n': case KEY_ENTER: if (input_len == 0) return; input_buf[input_len] = '\0'; @@ -1401,8 +1553,7 @@ static void handle_key(int ch) if (hist_pos < 0) break; hist_pos--; if (hist_pos < 0) { - strncpy(input_buf, hist_save, INPUT_MAX - 1); - input_buf[INPUT_MAX - 1] = '\0'; + input_buf[0] = '\0'; /* always end with blank line */ } else { int idx = (hist_head - 1 - hist_pos + HIST_MAX * 2) % HIST_MAX; strncpy(input_buf, hist_buf[idx], INPUT_MAX - 1); @@ -1495,6 +1646,7 @@ int main(int argc, char *argv[]) load_config(); + setlocale(LC_ALL, ""); /* enable UTF-8 so ncursesw renders box chars correctly */ initscr(); cbreak(); noecho(); diff --git a/termtcp_cli.o b/termtcp_cli.o index a9935307fe65feb713f814c95d91b90354160027..83492ac2b1c7447c491074415507e6f1e87200a3 100644 GIT binary patch literal 67888 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