Here is an updated version of my patch which fixes the "tcp" vs. "udp" string in the protocol lookup bit of the unified tcpudp_one_end.
Ian. diff -Nru /tmp/BEfybKtWqd/net-tools-1.60/debian/changelog /tmp/BQGUuO9HrM/net-tools-1.60/debian/changelog --- /tmp/BEfybKtWqd/net-tools-1.60/debian/changelog 2005-09-30 14:14:34.000000000 +0100 +++ /tmp/BQGUuO9HrM/net-tools-1.60/debian/changelog 2005-09-29 18:02:28.000000000 +0100 @@ -1,3 +1,23 @@ +net-tools (1.60-15ubuntu2) breezy; urgency=low + + * Look up TCP/UDP protocol numbers using correct protocol, not + always UDP. (Bug introduced in 1.60-15ubuntu1.) + Ubuntu 7294, Debian #254243. + + -- Ian Jackson <[EMAIL PROTECTED]> Thu, 29 Sep 2005 18:02:23 +0100 + +net-tools (1.60-15ubuntu1) breezy; urgency=low + + * Do not truncate numeric IPv6 addresses in netstat TCP and UDP. + The new output format is not parseable with the same algorithms as + before because it will be flexible about field widths, but it will not + be used unless it is necessary to avoid truncating numeric addresses, + so no existing non-broken netstat-output parsing code will be broken. + (Also: made 4 copies(!) of endpoint formatting code into one + common function. Urgh.) Ubuntu 7294, Debian #254243. + + -- Ian Jackson <[EMAIL PROTECTED]> Tue, 20 Sep 2005 15:28:53 +0100 + net-tools (1.60-15) unstable; urgency=low * minor formating fix to ifconfig(8) diff -Nru /tmp/BEfybKtWqd/net-tools-1.60/netstat.c /tmp/BQGUuO9HrM/net-tools-1.60/netstat.c --- /tmp/BEfybKtWqd/net-tools-1.60/netstat.c 2005-09-30 14:14:34.000000000 +0100 +++ /tmp/BQGUuO9HrM/net-tools-1.60/netstat.c 2005-09-29 17:59:55.000000000 +0100 @@ -85,6 +85,7 @@ #include <sys/ioctl.h> #include <net/if.h> #include <dirent.h> +#include <assert.h> #include "net-support.h" #include "pathnames.h" @@ -704,11 +705,71 @@ igmp_do_one); } +static void tcpudp_one_end(char *result_buf, size_t result_buf_size, + struct aftype *ap, int end_port, + struct sockaddr *endaddr, const char *protostr) +{ + char buffer[8192]; + + snprintf(buffer, sizeof(buffer), "%s", + get_sname(htons(end_port), protostr, + flag_not & FLAG_NUM_PORT)); + + assert(result_buf_size > 23); + + safe_strncpy(result_buf, ap->sprint(endaddr, flag_not), result_buf_size); + if ((strlen(result_buf) + strlen(buffer)) > 22 && + !(flag_not & FLAG_NUM_HOST)) + result_buf[22 - strlen(buffer)] = '\0'; + + assert(strlen(result_buf) + strlen(buffer) + 1 < sizeof(buffer)); + strcat(result_buf, ":"); + strcat(result_buf, buffer); +} + +static void reduce_deficit(int *deficit, int *spc, int min_spc) +{ + int reduction; + reduction= netmin(*deficit, *spc - min_spc); + if (reduction <= 0) return; + *spc -= reduction; + *deficit -= reduction; +} + +static void tcpudp_write(const char *protname, + unsigned long rxq, unsigned long txq, + const char *local_addr, const char *rem_addr, + const char *state) { + int rxq_spc, txq_spc, local_addr_spc, rem_addr_spc, protname_spc; + int local_addr_len, rem_addr_len, deficit; + + protname_spc = 5; + rxq_spc = 6; + txq_spc = 6; + local_addr_spc = 23; + local_addr_len = strlen(local_addr); + rem_addr_spc = 23; + rem_addr_len = strlen(rem_addr); + deficit = netmax(local_addr_len - local_addr_spc, 0) + + netmax(rem_addr_len - rem_addr_spc, 0); + + reduce_deficit(&deficit, &rem_addr_spc, rem_addr_len); + reduce_deficit(&deficit, &local_addr_spc, local_addr_len); + reduce_deficit(&deficit, &txq_spc, 1); + reduce_deficit(&deficit, &rxq_spc, 1); + reduce_deficit(&deficit, &protname_spc, strlen(protname)); + + printf("%-*s %*ld %*ld %-*s %-*s %-11s", + protname_spc, protname, rxq_spc, rxq, txq_spc, txq, + local_addr_spc, local_addr, + rem_addr_spc, rem_addr, state); +} + static void tcp_do_one(int lnr, const char *line) { unsigned long rxq, txq, time_len, retr, inode; int num, local_port, rem_port, d, state, uid, timer_run, timeout; - char rem_addr[128], local_addr[128], timers[64], buffer[1024], more[512]; + char rem_addr[128], local_addr[128], timers[64], more[512]; char *protname; struct aftype *ap; #if HAVE_AFINET6 @@ -775,25 +836,15 @@ safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not), sizeof(rem_addr)); if (flag_all || (flag_lst && !rem_port) || (!flag_lst && rem_port)) { - snprintf(buffer, sizeof(buffer), "%s", - get_sname(htons(local_port), "tcp", - flag_not & FLAG_NUM_PORT)); - - if ((strlen(local_addr) + strlen(buffer)) > 22) - local_addr[22 - strlen(buffer)] = '\0'; + tcpudp_one_end(local_addr, sizeof(local_addr), + ap, local_port, (struct sockaddr *) &localaddr, + "tcp"); + + tcpudp_one_end(rem_addr, sizeof(rem_addr), + ap, rem_port, (struct sockaddr *) &remaddr, + "tcp"); - strcat(local_addr, ":"); - strcat(local_addr, buffer); - snprintf(buffer, sizeof(buffer), "%s", - get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT)); - - if ((strlen(rem_addr) + strlen(buffer)) > 22) - rem_addr[22 - strlen(buffer)] = '\0'; - - strcat(rem_addr, ":"); - strcat(rem_addr, buffer); timers[0] = '\0'; - if (flag_opt) switch (timer_run) { case 0: @@ -820,8 +871,11 @@ timer_run, (double) time_len / HZ, retr, timeout); break; } - printf("%-4s %6ld %6ld %-*s %-*s %-11s", - protname, rxq, txq, netmax(23,strlen(local_addr)), local_addr, netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state])); + + tcpudp_write(protname, + rxq, txq, + local_addr, rem_addr, + _(tcp_state[state])); finish_this_one(uid,inode,timers); } @@ -835,7 +889,7 @@ static void udp_do_one(int lnr, const char *line) { - char buffer[8192], local_addr[64], rem_addr[64]; + char local_addr[64], rem_addr[64]; char *udp_state, timers[64], more[512]; int num, local_port, rem_port, d, state, timer_run, uid, timeout; char *protname; @@ -927,24 +981,13 @@ if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst)) { - safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, - flag_not), sizeof(local_addr)); - snprintf(buffer, sizeof(buffer), "%s", - get_sname(htons(local_port), "udp", - flag_not & FLAG_NUM_PORT)); - if ((strlen(local_addr) + strlen(buffer)) > 22) - local_addr[22 - strlen(buffer)] = '\0'; - strcat(local_addr, ":"); - strcat(local_addr, buffer); - - snprintf(buffer, sizeof(buffer), "%s", - get_sname(htons(rem_port), "udp", flag_not & FLAG_NUM_PORT)); - safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, - flag_not), sizeof(rem_addr)); - if ((strlen(rem_addr) + strlen(buffer)) > 22) - rem_addr[22 - strlen(buffer)] = '\0'; - strcat(rem_addr, ":"); - strcat(rem_addr, buffer); + tcpudp_one_end(local_addr, sizeof(local_addr), + ap, local_port, (struct sockaddr *) &localaddr, + "udp"); + + tcpudp_one_end(rem_addr, sizeof(rem_addr), + ap, rem_port, (struct sockaddr *) &remaddr, + "udp"); timers[0] = '\0'; if (flag_opt) @@ -963,8 +1006,11 @@ retr, timeout); break; } - printf("%-4s %6ld %6ld %-23s %-23s %-11s", - protname, rxq, txq, local_addr, rem_addr, udp_state); + + tcpudp_write(protname, + rxq, txq, + local_addr, rem_addr, + udp_state); finish_this_one(uid,inode,timers); } -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]