Package: wavemon Version: 0.9.1-1+b1 Severity: normal Tags: patch Dear Maintainer,
Despite what the NEWS file says, Wavemon does not actually use the curtail() function it defines to prevent long lines from spilling into the next line. While this is noticeable mostly on the rx/tx rate line -- which can be extremely long -- almost all printed lines will show the bug when the terminal is resized to a narrower width. I've included a patch which creates a new wrapper for waddstr() called border_waddstr() which first checks if the text would overwrite the border on the right side and then truncates the string to be precisely the right size. Truncation is done using the curtail() function which puts a ~ in the middle of the line to represent elision. Additionally, I've split Rx rate and Tx rate onto separate lines as each one is plenty long on its own. *** End of the template - remove these template lines *** -- System Information: Debian Release: 11.1 APT prefers stable-security APT policy: (500, 'stable-security'), (500, 'stable') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 5.10.0-8-amd64 (SMP w/48 CPU threads) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages wavemon depends on: ii libc6 2.31-13+deb11u2 ii libncurses6 6.2+20201114-2 ii libnl-3-200 3.4.0-1+b1 ii libnl-genl-3-200 3.4.0-1+b1 ii libtinfo6 6.2+20201114-2 wavemon recommends no packages. wavemon suggests no packages. -- no debconf information
Common subdirectories: wavemon-0.9.1.orig/config and wavemon-0.9.1/config Only in wavemon-0.9.1: config.log Only in wavemon-0.9.1: config.status Common subdirectories: wavemon-0.9.1.orig/debian and wavemon-0.9.1/debian diff -u wavemon-0.9.1.orig/info_scr.c wavemon-0.9.1/info_scr.c --- wavemon-0.9.1.orig/info_scr.c 2019-12-29 15:45:44.000000000 -0800 +++ wavemon-0.9.1/info_scr.c 2021-10-16 23:21:59.135328910 -0700 @@ -119,9 +119,9 @@ mvwaddstr(w_levels, line++, 1, "link quality: "); sprintf(tmp, "%0.f%% ", (1e2 * qual)/sig_qual_max); - waddstr_b(w_levels, tmp); + border_waddstr_b(w_levels, tmp); sprintf(tmp, "(%0.f/%d) ", qual, sig_qual_max); - waddstr(w_levels, tmp); + border_waddstr(w_levels, tmp); waddbar(w_levels, line++, qual, 0, sig_qual_max, lvlscale, true); } @@ -136,7 +136,7 @@ mvwaddstr(w_levels, line++, 1, "signal level: "); sprintf(tmp, "%.0f dBm (%s)", signal, dbm2units(signal)); - waddstr_b(w_levels, tmp); + border_waddstr_b(w_levels, tmp); waddbar(w_levels, line, signal, conf.sig_min, conf.sig_max, lvlscale, true); @@ -155,7 +155,7 @@ mvwaddstr(w_levels, line++, 1, "noise level: "); sprintf(tmp, "%.0f dBm (%s)", noise, dbm2units(noise)); - waddstr_b(w_levels, tmp); + border_waddstr_b(w_levels, tmp); waddbar(w_levels, line++, noise, conf.noise_min, conf.noise_max, nscale, false); @@ -167,7 +167,7 @@ mvwaddstr(w_levels, line++, 1, "SNR: "); sprintf(tmp, "%.0f dB", ssnr); - waddstr_b(w_levels, tmp); + border_waddstr_b(w_levels, tmp); } wrefresh(w_levels); @@ -185,15 +185,15 @@ if (linkstat.data.rx_packets) { sprintf(tmp, "%s (%s)", int_counts(linkstat.data.rx_packets), byte_units(linkstat.data.rx_bytes)); - waddstr_b(w_stats, tmp); + border_waddstr_b(w_stats, tmp); } else { - waddstr(w_stats, "n/a"); + border_waddstr(w_stats, "n/a"); } if (iw_nl80211_have_survey_data(&linkstat.data)) { if (linkstat.data.rx_bitrate[0]) { - waddstr(w_stats, ", rate: "); - waddstr_b(w_stats, linkstat.data.rx_bitrate); + border_waddstr(w_stats, ", rate: "); + border_waddstr_b(w_stats, linkstat.data.rx_bitrate); } if (linkstat.data.expected_thru) { @@ -201,15 +201,15 @@ sprintf(tmp, " (expected: %.1f MB/s)", linkstat.data.expected_thru/1024.0); else sprintf(tmp, " (expected: %u kB/s)", linkstat.data.expected_thru); - waddstr(w_stats, tmp); + border_waddstr(w_stats, tmp); } } if (linkstat.data.rx_drop_misc) { - waddstr(w_stats, ", drop: "); + border_waddstr(w_stats, ", drop: "); sprintf(tmp, "%'llu (%.1f%%)", (unsigned long long)linkstat.data.rx_drop_misc, (1e2 * linkstat.data.rx_drop_misc)/linkstat.data.rx_packets); - waddstr_b(w_stats, tmp); + border_waddstr_b(w_stats, tmp); } wclrtoborder(w_stats); @@ -222,26 +222,26 @@ if (linkstat.data.tx_packets) { sprintf(tmp, "%s (%s)", int_counts(linkstat.data.tx_packets), byte_units(linkstat.data.tx_bytes)); - waddstr_b(w_stats, tmp); + border_waddstr_b(w_stats, tmp); } else { - waddstr(w_stats, "n/a"); + border_waddstr(w_stats, "n/a"); } if (iw_nl80211_have_survey_data(&linkstat.data) && linkstat.data.tx_bitrate[0]) { - waddstr(w_stats, ", rate: "); - waddstr_b(w_stats, linkstat.data.tx_bitrate); + border_waddstr(w_stats, ", rate: "); + border_waddstr_b(w_stats, linkstat.data.tx_bitrate); } if (linkstat.data.tx_retries) { - waddstr(w_stats, ", retries: "); + border_waddstr(w_stats, ", retries: "); sprintf(tmp, "%s (%.1f%%)", int_counts(linkstat.data.tx_retries), (1e2 * linkstat.data.tx_retries)/linkstat.data.tx_packets); - waddstr_b(w_stats, tmp); + border_waddstr_b(w_stats, tmp); } if (linkstat.data.tx_failed) { - waddstr(w_stats, ", failed: "); - waddstr_b(w_stats, int_counts(linkstat.data.tx_failed)); + border_waddstr(w_stats, ", failed: "); + border_waddstr_b(w_stats, int_counts(linkstat.data.tx_failed)); } wclrtoborder(w_stats); wrefresh(w_stats); @@ -264,28 +264,28 @@ * Interface Part */ wmove(w_if, 1, 1); - waddstr_b(w_if, conf_ifname()); + border_waddstr_b(w_if, conf_ifname()); sprintf(tmp, " (%s)", info.name); - waddstr(w_if, tmp); + border_waddstr(w_if, tmp); /* PHY */ - waddstr(w_if, ", phy "); + border_waddstr(w_if, ", phy "); sprintf(tmp, "%d", ifs.phy); - waddstr_b(w_if, tmp); + border_waddstr_b(w_if, tmp); /* Regulatory domain */ - waddstr(w_if, ", reg: "); + border_waddstr(w_if, ", reg: "); if (ir.region > 0) { - waddstr_b(w_if, ir.country); + border_waddstr_b(w_if, ir.country); sprintf(tmp, " (%s)", dfs_domain_name(ir.region)); - waddstr(w_if, tmp); + border_waddstr(w_if, tmp); } else { - waddstr_b(w_if, "n/a"); + border_waddstr_b(w_if, "n/a"); } if (ifs.ssid[0]) { - waddstr(w_if, ", SSID: "); - waddstr_b(w_if, ifs.ssid); + border_waddstr(w_if, ", SSID: "); + border_waddstr_b(w_if, ifs.ssid); } wclrtoborder(w_if); @@ -295,35 +295,35 @@ * Info window: */ wmove(w_info, 1, 1); - waddstr(w_info, "mode: "); - waddstr_b(w_info, iftype_name(ifs.iftype)); + border_waddstr(w_info, "mode: "); + border_waddstr_b(w_info, iftype_name(ifs.iftype)); if (!ether_addr_is_zero(&linkstat.data.bssid)) { - waddstr_b(w_info, ", "); + border_waddstr_b(w_info, ", "); switch (linkstat.data.status) { case NL80211_BSS_STATUS_ASSOCIATED: - waddstr(w_info, "connected to: "); + border_waddstr(w_info, "connected to: "); break; case NL80211_BSS_STATUS_AUTHENTICATED: - waddstr(w_info, "authenticated with: "); + border_waddstr(w_info, "authenticated with: "); break; case NL80211_BSS_STATUS_IBSS_JOINED: - waddstr(w_info, "joined IBSS: "); + border_waddstr(w_info, "joined IBSS: "); break; default: - waddstr(w_info, "station: "); + border_waddstr(w_info, "station: "); } - waddstr_b(w_info, ether_lookup(&linkstat.data.bssid)); + border_waddstr_b(w_info, ether_lookup(&linkstat.data.bssid)); if (linkstat.data.status == NL80211_BSS_STATUS_ASSOCIATED) { - waddstr_b(w_info, ","); - waddstr(w_info, " time: "); - waddstr_b(w_info, pretty_time(linkstat.data.connected_time)); + border_waddstr_b(w_info, ","); + border_waddstr(w_info, " time: "); + border_waddstr_b(w_info, pretty_time(linkstat.data.connected_time)); - waddstr(w_info, ", inactive: "); + border_waddstr(w_info, ", inactive: "); sprintf(tmp, "%.1fs", (float)linkstat.data.inactive_time/1e3); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } } wclrtoborder(w_info); @@ -331,203 +331,204 @@ wmove(w_info, 2, 1); /* Frequency / channel */ if (ifs.freq) { - waddstr(w_info, "freq: "); + border_waddstr(w_info, "freq: "); sprintf(tmp, "%d MHz", ifs.freq); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); /* The following condition should in theory never happen */ if (linkstat.data.survey.freq && linkstat.data.survey.freq != ifs.freq) { sprintf(tmp, " [survey freq: %d MHz]", linkstat.data.survey.freq); - waddstr(w_info, tmp); + border_waddstr(w_info, tmp); } if (ifs.freq_ctr1 && ifs.freq_ctr1 != ifs.freq) { - waddstr(w_info, ", ctr1: "); + border_waddstr(w_info, ", ctr1: "); sprintf(tmp, "%d MHz", ifs.freq_ctr1); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } if (ifs.freq_ctr2 && ifs.freq_ctr2 != ifs.freq_ctr1 && ifs.freq_ctr2 != ifs.freq) { - waddstr(w_info, ", ctr2: "); + border_waddstr(w_info, ", ctr2: "); sprintf(tmp, "%d MHz", ifs.freq_ctr2); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } - waddstr(w_info, ", channel: "); + border_waddstr(w_info, ", channel: "); sprintf(tmp, "%d", ieee80211_frequency_to_channel(ifs.freq)); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); if (ifs.chan_width >= 0) { sprintf(tmp, " (width: %s)", channel_width_name(ifs.chan_width)); - waddstr(w_info, tmp); + border_waddstr(w_info, tmp); } else if (ifs.chan_type >= 0) { sprintf(tmp, " (%s)", channel_type_name(ifs.chan_type)); - waddstr(w_info, tmp); + border_waddstr(w_info, tmp); } } else if (iw_nl80211_have_survey_data(&linkstat.data)) { - waddstr(w_info, "freq: "); + border_waddstr(w_info, "freq: "); sprintf(tmp, "%d MHz", linkstat.data.survey.freq); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } else { - waddstr(w_info, "frequency/channel: n/a"); + border_waddstr(w_info, "frequency/channel: n/a"); } wclrtoborder(w_info); /* Channel data */ wmove(w_info, 3, 1); if (iw_nl80211_have_survey_data(&linkstat.data)) { - waddstr(w_info, "channel "); - waddstr(w_info, "active: "); - waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.active)); + border_waddstr(w_info, "channel "); + border_waddstr(w_info, "active: "); + border_waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.active)); - waddstr(w_info, ", busy: "); - waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.busy)); + border_waddstr(w_info, ", busy: "); + border_waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.busy)); if (linkstat.data.survey.time.ext_busy) { - waddstr(w_info, ", ext-busy: "); - waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.ext_busy)); + border_waddstr(w_info, ", ext-busy: "); + border_waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.ext_busy)); } - waddstr(w_info, ", rx: "); - waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.rx)); + border_waddstr(w_info, ", rx: "); + border_waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.rx)); - waddstr(w_info, ", tx: "); - waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.tx)); + border_waddstr(w_info, ", tx: "); + border_waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.tx)); if (linkstat.data.survey.time.scan) { - waddstr(w_info, ", scan: "); - waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.scan)); + border_waddstr(w_info, ", scan: "); + border_waddstr_b(w_info, pretty_time_ms(linkstat.data.survey.time.scan)); } } else if (linkstat.data.tx_bitrate[0] && linkstat.data.rx_bitrate[0]) { - waddstr(w_info, "rx rate: "); - waddstr_b(w_info, linkstat.data.rx_bitrate); + border_waddstr(w_info, "rx rate: "); + border_waddstr_b(w_info, linkstat.data.rx_bitrate); if (linkstat.data.expected_thru) { if (linkstat.data.expected_thru >= 1024) sprintf(tmp, " (exp: %.1f MB/s)", linkstat.data.expected_thru/1024.0); else sprintf(tmp, " (exp: %u kB/s)", linkstat.data.expected_thru); - waddstr(w_info, tmp); + border_waddstr(w_info, tmp); } - waddstr(w_info, ", tx rate: "); - waddstr_b(w_info, linkstat.data.tx_bitrate); + wmove(w_info, 4, 1); + border_waddstr(w_info, "tx rate: "); + border_waddstr_b(w_info, linkstat.data.tx_bitrate); } /* Beacons */ - wmove(w_info, 4, 1); + wmove(w_info, 5, 1); if (linkstat.data.beacons) { - waddstr(w_info, "beacons: "); + border_waddstr(w_info, "beacons: "); sprintf(tmp, "%'llu", (unsigned long long)linkstat.data.beacons); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); if (linkstat.data.beacon_loss) { - waddstr(w_info, ", lost: "); - waddstr_b(w_info, int_counts(linkstat.data.beacon_loss)); + border_waddstr(w_info, ", lost: "); + border_waddstr_b(w_info, int_counts(linkstat.data.beacon_loss)); } - waddstr(w_info, ", avg sig: "); + border_waddstr(w_info, ", avg sig: "); sprintf(tmp, "%d dBm", (int8_t)linkstat.data.beacon_avg_sig); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); - waddstr(w_info, ", interval: "); + border_waddstr(w_info, ", interval: "); sprintf(tmp, "%.1fs", (linkstat.data.beacon_int * 1024.0)/1e6); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); - waddstr(w_info, ", DTIM: "); + border_waddstr(w_info, ", DTIM: "); sprintf(tmp, "%u", linkstat.data.dtim_period); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } else { - waddstr(w_info, "station flags:"); + border_waddstr(w_info, "station flags:"); if (linkstat.data.cts_protection) - waddstr_b(w_info, " CTS"); + border_waddstr_b(w_info, " CTS"); if (linkstat.data.wme) - waddstr_b(w_info, " WME"); + border_waddstr_b(w_info, " WME"); if (linkstat.data.tdls) - waddstr_b(w_info, " TDLS"); + border_waddstr_b(w_info, " TDLS"); if (linkstat.data.mfp) - waddstr_b(w_info, " MFP"); + border_waddstr_b(w_info, " MFP"); if (!(linkstat.data.cts_protection | linkstat.data.wme | linkstat.data.tdls | linkstat.data.mfp)) - waddstr_b(w_info, " (none)"); - waddstr(w_info, ", preamble:"); + border_waddstr_b(w_info, " (none)"); + border_waddstr(w_info, ", preamble:"); if (linkstat.data.long_preamble) - waddstr_b(w_info, " long"); + border_waddstr_b(w_info, " long"); else - waddstr_b(w_info, " short"); - waddstr(w_info, ", slot:"); + border_waddstr_b(w_info, " short"); + border_waddstr(w_info, ", slot:"); if (linkstat.data.short_slot_time) - waddstr_b(w_info, " short"); + border_waddstr_b(w_info, " short"); else - waddstr_b(w_info, " long"); + border_waddstr_b(w_info, " long"); } if (info.cap_sens) { - waddstr(w_info, ", sensitivity: "); + border_waddstr(w_info, ", sensitivity: "); if (info.sens < 0) sprintf(tmp, "%d dBm", info.sens); else sprintf(tmp, "%d/%d", info.sens, range.sensitivity); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } wclrtoborder(w_info); - wmove(w_info, 5, 1); - waddstr(w_info, "power mgt: "); + wmove(w_info, 6, 1); + border_waddstr(w_info, "power mgt: "); if (info.cap_power) - waddstr_b(w_info, format_power(&info.power, &range)); + border_waddstr_b(w_info, format_power(&info.power, &range)); else - waddstr(w_info, "n/a"); + border_waddstr(w_info, "n/a"); if (info.cap_txpower && info.txpower.disabled) { - waddstr(w_info, ", tx-power: off"); + border_waddstr(w_info, ", tx-power: off"); } else if (info.cap_txpower) { /* * Convention: auto-selected values start with a capital * letter, otherwise with a small letter. */ if (info.txpower.fixed) - waddstr(w_info, ", tx-power: "); + border_waddstr(w_info, ", tx-power: "); else - waddstr(w_info, ", TX-power: "); - waddstr_b(w_info, format_txpower(&info.txpower)); + border_waddstr(w_info, ", TX-power: "); + border_waddstr_b(w_info, format_txpower(&info.txpower)); } wclrtoborder(w_info); - wmove(w_info, 6, 1); - waddstr(w_info, "retry: "); + wmove(w_info, 7, 1); + border_waddstr(w_info, "retry: "); if (info.cap_retry) - waddstr_b(w_info, format_retry(&info.retry, &range)); + border_waddstr_b(w_info, format_retry(&info.retry, &range)); else - waddstr(w_info, "n/a"); + border_waddstr(w_info, "n/a"); - waddstr(w_info, ", "); + border_waddstr(w_info, ", "); if (info.cap_rts) { - waddstr(w_info, info.rts.fixed ? "rts/cts: " : "RTS/cts: "); + border_waddstr(w_info, info.rts.fixed ? "rts/cts: " : "RTS/cts: "); if (info.rts.disabled) sprintf(tmp, "off"); else sprintf(tmp, "%d B", info.rts.value); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } else { - waddstr(w_info, "rts/cts: n/a"); + border_waddstr(w_info, "rts/cts: n/a"); } - waddstr(w_info, ", "); + border_waddstr(w_info, ", "); if (info.cap_frag) { - waddstr(w_info, info.frag.fixed ? "frag: " : "Frag: "); + border_waddstr(w_info, info.frag.fixed ? "frag: " : "Frag: "); if (info.frag.disabled) sprintf(tmp, "off"); else sprintf(tmp, "%d B", info.frag.value); - waddstr_b(w_info, tmp); + border_waddstr_b(w_info, tmp); } else { - waddstr(w_info, "frag: n/a"); + border_waddstr(w_info, "frag: n/a"); } wclrtoborder(w_info); /* FIXME: re-enable encryption information (issue #8) - wmove(w_info, 7, 1); - waddstr(w_info, "encryption: "); + wmove(w_info, 8, 1); + border_waddstr(w_info, "encryption: "); */ wclrtoborder(w_info); @@ -544,83 +545,83 @@ wmove(w_net, 1, 1); wclrtoborder(w_net); if (getmaxy(w_net) == WH_NET_MAX) { - waddstr(w_net, conf_ifname()); + border_waddstr(w_net, conf_ifname()); - waddstr_b(w_net, " ("); - waddstr(w_net, info.flags & IFF_UP ? "UP" : "DOWN"); + border_waddstr_b(w_net, " ("); + border_waddstr(w_net, info.flags & IFF_UP ? "UP" : "DOWN"); if (info.flags & IFF_RUNNING) /* Interface RFC2863 OPER_UP */ - waddstr(w_net, " RUNNING"); + border_waddstr(w_net, " RUNNING"); #ifdef IFF_LOWER_UP /* Linux 2.6.17 */ if (info.flags & IFF_LOWER_UP) /* Driver signals L1 up */ - waddstr(w_net, " LOWER_UP"); + border_waddstr(w_net, " LOWER_UP"); #endif #ifdef IFF_DORMANT /* Linux 2.6.17 */ if (info.flags & IFF_DORMANT) /* Driver signals dormant */ - waddstr(w_net, " DORMANT"); + border_waddstr(w_net, " DORMANT"); #endif if (info.flags & IFF_MASTER) /* Master of a load balancer */ - waddstr(w_net, " MASTER"); + border_waddstr(w_net, " MASTER"); if (info.flags & IFF_SLAVE) /* Slave of a load balancer */ - waddstr(w_net, " SLAVE"); + border_waddstr(w_net, " SLAVE"); if (info.flags & IFF_POINTOPOINT) /* Is a point-to-point link */ - waddstr(w_net, " POINTOPOINT"); + border_waddstr(w_net, " POINTOPOINT"); if (info.flags & IFF_DYNAMIC) /* Address is volatile */ - waddstr(w_net, " DYNAMIC"); + border_waddstr(w_net, " DYNAMIC"); if (info.flags & IFF_BROADCAST) /* Valid broadcast address set */ - waddstr(w_net, " BROADCAST"); + border_waddstr(w_net, " BROADCAST"); if (info.flags & IFF_MULTICAST) /* Supports multicast */ - waddstr(w_net, " MULTICAST"); + border_waddstr(w_net, " MULTICAST"); if (info.flags & IFF_ALLMULTI) /* Receive all mcast packets */ - waddstr(w_net, " ALLMULTI"); + border_waddstr(w_net, " ALLMULTI"); if (info.flags & IFF_NOARP) /* No ARP protocol */ - waddstr(w_net, " NOARP"); + border_waddstr(w_net, " NOARP"); if (info.flags & IFF_NOTRAILERS) /* Avoid use of trailers */ - waddstr(w_net, " NOTRAILERS"); + border_waddstr(w_net, " NOTRAILERS"); if (info.flags & IFF_PROMISC) /* Is in promiscuous mode */ - waddstr(w_net, " PROMISC"); + border_waddstr(w_net, " PROMISC"); if (info.flags & IFF_DEBUG) /* Internal debugging flag */ - waddstr(w_net, " DEBUG"); - waddstr_b(w_net, ")"); + border_waddstr(w_net, " DEBUG"); + border_waddstr_b(w_net, ")"); wmove(w_net, 2, 1); wclrtoborder(w_net); } - waddstr(w_net, "mac: "); - waddstr_b(w_net, ether_lookup(&info.hwaddr)); + border_waddstr(w_net, "mac: "); + border_waddstr_b(w_net, ether_lookup(&info.hwaddr)); if (getmaxy(w_net) == WH_NET_MAX) { - waddstr(w_net, ", qlen: "); + border_waddstr(w_net, ", qlen: "); sprintf(tmp, "%u", info.txqlen); - waddstr_b(w_net, tmp); + border_waddstr_b(w_net, tmp); wmove(w_net, 3, 1); wclrtoborder(w_net); } else { - waddstr(w_net, ", "); + border_waddstr(w_net, ", "); } - waddstr(w_net, "ip: "); + border_waddstr(w_net, "ip: "); if (!info.addr.s_addr) { - waddstr(w_net, "n/a"); + border_waddstr(w_net, "n/a"); } else { sprintf(tmp, "%s/%u", inet_ntoa(info.addr), prefix_len(&info.netmask)); - waddstr_b(w_net, tmp); + border_waddstr_b(w_net, tmp); /* only show bcast address if not set to the obvious default */ if (info.bcast.s_addr != (info.addr.s_addr | ~info.netmask.s_addr)) { - waddstr(w_net, ", bcast: "); - waddstr_b(w_net, inet_ntoa(info.bcast)); + border_waddstr(w_net, ", bcast: "); + border_waddstr_b(w_net, inet_ntoa(info.bcast)); } } wclrtoborder(w_net); /* 802.11 MTU may be greater than Ethernet MTU (1500) */ if (info.mtu && info.mtu != ETH_DATA_LEN) { - waddstr(w_net, ", mtu: "); + border_waddstr(w_net, ", mtu: "); sprintf(tmp, "%u", info.mtu); - waddstr_b(w_net, tmp); + border_waddstr_b(w_net, tmp); } wrefresh(w_net); Only in wavemon-0.9.1: Makefile Common subdirectories: wavemon-0.9.1.orig/.pc and wavemon-0.9.1/.pc diff -u wavemon-0.9.1.orig/ui.c wavemon-0.9.1/ui.c --- wavemon-0.9.1.orig/ui.c 2019-12-29 15:45:44.000000000 -0800 +++ wavemon-0.9.1/ui.c 2021-10-16 23:26:30.813584303 -0700 @@ -46,7 +46,6 @@ wattrset(win, COLOR_PAIR(CP_WTITLE)); mvwaddstr(win, 0, 2, title); wattroff(win, COLOR_PAIR(CP_WTITLE)); - return win; } @@ -110,6 +109,26 @@ return out_buf; } +/* Print @str in @win, but curtail 1 character before the window's right edge */ +int border_waddstr(WINDOW *win, const char *str) +{ + int cur_x, max_x, dummy; + getyx(win, dummy, cur_x); + getmaxyx(win, dummy, max_x); + if ((max_x - cur_x - 1) <= 0) return 0; + return (waddstr(win, curtail(str, NULL, max_x-cur_x-1))); +} + +/* Same as border_waddstr, but in bold */ +void border_waddstr_b(WINDOW *win, const char *str) +{ + int cur_x, max_x, dummy; + getyx(win, dummy, cur_x); + getmaxyx(win, dummy, max_x); + if ((max_x - cur_x - 1) <= 0) return; + waddstr_b(win, curtail(str, NULL, max_x-cur_x-1)); +} + static double interpolate(const double val, const double min, const double max) { return val < min ? 0 : diff -u wavemon-0.9.1.orig/wavemon.h wavemon-0.9.1/wavemon.h --- wavemon-0.9.1.orig/wavemon.h 2019-12-29 15:45:44.000000000 -0800 +++ wavemon-0.9.1/wavemon.h 2021-10-16 23:24:17.348565296 -0700 @@ -51,7 +51,7 @@ WH_IFACE = 2, /* 'Interface' area at the top */ WH_LEVEL = 9, /* Level meters */ WH_STATS = 3, /* WiFi statistics area */ - WH_INFO_MIN = 7, /* WiFi information area */ + WH_INFO_MIN = 8, /* WiFi information area */ WH_NET_MIN = 3, /* Network interface information area */ WH_NET_MAX = 5, /* Network interface information area */ WH_MENU = 1 /* Menu bar at the bottom */ @@ -235,6 +235,8 @@ { wadd_attr_str(win, A_BOLD, s); } +extern int border_waddstr(WINDOW * win, const char *s); +extern void border_waddstr_b(WINDOW * win, const char *s); extern void waddstr_center(WINDOW * win, int y, const char *s); extern const char *curtail(const char *str, const char *sep, int len);