1*1ab64a61SGleb Smirnoff# 2*1ab64a61SGleb Smirnoff# 3*1ab64a61SGleb Smirnoff 4*1ab64a61SGleb Smirnoffdocument netstat-anr 5*1ab64a61SGleb SmirnoffPrint routing tables as 'netstat -anr' does. 6*1ab64a61SGleb Smirnoffend 7*1ab64a61SGleb Smirnoff 8*1ab64a61SGleb Smirnoffset $debug = 0 9*1ab64a61SGleb Smirnoff 10*1ab64a61SGleb Smirnoffset $AF_INET = 2 11*1ab64a61SGleb Smirnoffset $AF_LINK = 18 12*1ab64a61SGleb Smirnoff 13*1ab64a61SGleb Smirnoffset $RNF_ROOT = 2 14*1ab64a61SGleb Smirnoffset $RNF_ACTIVE = 4 15*1ab64a61SGleb Smirnoff 16*1ab64a61SGleb Smirnoffset $RTF_UP = 0x1 17*1ab64a61SGleb Smirnoffset $RTF_GATEWAY = 0x2 18*1ab64a61SGleb Smirnoffset $RTF_HOST = 0x4 19*1ab64a61SGleb Smirnoffset $RTF_STATIC = 0x800 20*1ab64a61SGleb Smirnoff 21*1ab64a61SGleb Smirnoff# 22*1ab64a61SGleb Smirnoff# XXX: alas, we can't script "show endian" 23*1ab64a61SGleb Smirnoff# 24*1ab64a61SGleb Smirnoffif (machine[0] == 'a' && machine[1] == 'm' && machine[2] == 'd') || \ 25*1ab64a61SGleb Smirnoff (machine[0] == 'i' && machine[1] == '3' && machine[2] == '8') 26*1ab64a61SGleb Smirnoff set $byteswap = 1 27*1ab64a61SGleb Smirnoffelse 28*1ab64a61SGleb Smirnoff set $byteswap = 0 29*1ab64a61SGleb Smirnoffend 30*1ab64a61SGleb Smirnoff 31*1ab64a61SGleb Smirnoffdefine routename 32*1ab64a61SGleb Smirnoff if ($byteswap) 33*1ab64a61SGleb Smirnoff printf "%u.%u.%u.%u", \ 34*1ab64a61SGleb Smirnoff $arg0 & 0xff, ($arg0 >> 8) & 0xff, \ 35*1ab64a61SGleb Smirnoff ($arg0 >> 16) & 0xff, ($arg0 >> 24) & 0xff 36*1ab64a61SGleb Smirnoff else 37*1ab64a61SGleb Smirnoff printf "%u.%u.%u.%u", \ 38*1ab64a61SGleb Smirnoff ($arg0 >> 24) & 0xff, ($arg0 >> 16) & 0xff, \ 39*1ab64a61SGleb Smirnoff ($arg0 >> 8) & 0xff, $arg0 & 0xff 40*1ab64a61SGleb Smirnoff end 41*1ab64a61SGleb Smirnoffend 42*1ab64a61SGleb Smirnoff 43*1ab64a61SGleb Smirnoffdefine domask 44*1ab64a61SGleb Smirnoff set $i = 0 45*1ab64a61SGleb Smirnoff set $b = 0 46*1ab64a61SGleb Smirnoff while $b < 32 47*1ab64a61SGleb Smirnoff if ($arg0 & (1 << $b)) 48*1ab64a61SGleb Smirnoff set $i = $i + 1 49*1ab64a61SGleb Smirnoff end 50*1ab64a61SGleb Smirnoff set $b = $b + 1 51*1ab64a61SGleb Smirnoff end 52*1ab64a61SGleb Smirnoff printf "/%d", $i 53*1ab64a61SGleb Smirnoffend 54*1ab64a61SGleb Smirnoff 55*1ab64a61SGleb Smirnoffdefine p_flags 56*1ab64a61SGleb Smirnoff if ($arg0 & $RTF_UP) 57*1ab64a61SGleb Smirnoff printf "U" 58*1ab64a61SGleb Smirnoff end 59*1ab64a61SGleb Smirnoff if ($arg0 & $RTF_GATEWAY) 60*1ab64a61SGleb Smirnoff printf "G" 61*1ab64a61SGleb Smirnoff end 62*1ab64a61SGleb Smirnoff if ($arg0 & $RTF_HOST) 63*1ab64a61SGleb Smirnoff printf "H" 64*1ab64a61SGleb Smirnoff end 65*1ab64a61SGleb Smirnoff if ($arg0 & $RTF_STATIC) 66*1ab64a61SGleb Smirnoff printf "S" 67*1ab64a61SGleb Smirnoff end 68*1ab64a61SGleb Smirnoffend 69*1ab64a61SGleb Smirnoff 70*1ab64a61SGleb Smirnoffdefine p_sockaddr 71*1ab64a61SGleb Smirnoff set $sa = (struct sockaddr *)$arg0 72*1ab64a61SGleb Smirnoff set $flags = $arg2 73*1ab64a61SGleb Smirnoff if ($sa->sa_family == $AF_INET) 74*1ab64a61SGleb Smirnoff set $sin = (struct sockaddr_in *)$arg0 75*1ab64a61SGleb Smirnoff set $mask = (struct sockaddr_in *)$arg1 76*1ab64a61SGleb Smirnoff if ($flags & $RTF_HOST) 77*1ab64a61SGleb Smirnoff routename $sin->sin_addr.s_addr 78*1ab64a61SGleb Smirnoff else 79*1ab64a61SGleb Smirnoff routename $sin->sin_addr.s_addr 80*1ab64a61SGleb Smirnoff if ($mask != 0) 81*1ab64a61SGleb Smirnoff domask $mask->sin_addr.s_addr 82*1ab64a61SGleb Smirnoff else 83*1ab64a61SGleb Smirnoff domask 0 84*1ab64a61SGleb Smirnoff end 85*1ab64a61SGleb Smirnoff end 86*1ab64a61SGleb Smirnoff end 87*1ab64a61SGleb Smirnoff if ($sa->sa_family == $AF_LINK) 88*1ab64a61SGleb Smirnoff set $sdl = (struct sockaddr_dl *)$arg0 89*1ab64a61SGleb Smirnoff if ($sdl->sdl_nlen == 0 && $sdl->sdl_alen == 0 && \ 90*1ab64a61SGleb Smirnoff $sdl->sdl_slen == 0) 91*1ab64a61SGleb Smirnoff printf "link#%d", $sdl->sdl_index 92*1ab64a61SGleb Smirnoff end 93*1ab64a61SGleb Smirnoff end 94*1ab64a61SGleb Smirnoffend 95*1ab64a61SGleb Smirnoff 96*1ab64a61SGleb Smirnoffdefine p_rtentry 97*1ab64a61SGleb Smirnoff set $rte = (struct rtentry *)$arg0 98*1ab64a61SGleb Smirnoff set $rn = (struct radix_node *)$arg0 99*1ab64a61SGleb Smirnoff set $sa = ((struct sockaddr **)($rn->rn_u.rn_leaf.rn_Key)) 100*1ab64a61SGleb Smirnoff set $sam = ((struct sockaddr **)($rn->rn_u.rn_leaf.rn_Mask)) 101*1ab64a61SGleb Smirnoff set $gw = $rte->rt_gateway 102*1ab64a61SGleb Smirnoff 103*1ab64a61SGleb Smirnoff p_sockaddr $sa $sam $rte->rt_flags 104*1ab64a61SGleb Smirnoff printf "\t" 105*1ab64a61SGleb Smirnoff p_sockaddr $gw 0 $RTF_HOST 106*1ab64a61SGleb Smirnoff printf "\t" 107*1ab64a61SGleb Smirnoff p_flags $rte->rt_flags 108*1ab64a61SGleb Smirnoff printf "\t" 109*1ab64a61SGleb Smirnoff if ($rte->rt_ifp != 0) 110*1ab64a61SGleb Smirnoff printf "%s", $rte->rt_ifp->if_xname 111*1ab64a61SGleb Smirnoff end 112*1ab64a61SGleb Smirnoff printf "\n" 113*1ab64a61SGleb Smirnoffend 114*1ab64a61SGleb Smirnoff 115*1ab64a61SGleb Smirnoffdefine p_rtree 116*1ab64a61SGleb Smirnoff set $rn_$arg0 = (struct radix_node *)$arg1 117*1ab64a61SGleb Smirnoff set $left_$arg0 = $arg0 + 1 118*1ab64a61SGleb Smirnoff set $right_$arg0 = $arg0 + 2 119*1ab64a61SGleb Smirnoff set $duped_$arg0 = $arg0 + 3 120*1ab64a61SGleb Smirnoff 121*1ab64a61SGleb Smirnoff if ($rn_$arg0->rn_bit < 0 || ($rn_$arg0->rn_flags & $RNF_ACTIVE) == 0) 122*1ab64a61SGleb Smirnoff if ($debug == 1) 123*1ab64a61SGleb Smirnoff printf "print " 124*1ab64a61SGleb Smirnoff p $rn_$arg0 125*1ab64a61SGleb Smirnoff end 126*1ab64a61SGleb Smirnoff if (($rn_$arg0->rn_flags & ($RNF_ACTIVE | $RNF_ROOT)) == \ 127*1ab64a61SGleb Smirnoff $RNF_ACTIVE) 128*1ab64a61SGleb Smirnoff p_rtentry $rn_$arg0 129*1ab64a61SGleb Smirnoff end 130*1ab64a61SGleb Smirnoff if (($rn_$arg0->rn_flags & $RNF_ACTIVE) != 0 && \ 131*1ab64a61SGleb Smirnoff $rn_$arg0->rn_u.rn_leaf.rn_Dupedkey != 0) 132*1ab64a61SGleb Smirnoff if ($debug == 1) 133*1ab64a61SGleb Smirnoff printf "duped " 134*1ab64a61SGleb Smirnoff p $rn_$arg0 135*1ab64a61SGleb Smirnoff end 136*1ab64a61SGleb Smirnoff p_rtree $duped_$arg0 $rn_$arg0->rn_u.rn_leaf.rn_Dupedkey 137*1ab64a61SGleb Smirnoff end 138*1ab64a61SGleb Smirnoff else 139*1ab64a61SGleb Smirnoff if ($rn_$arg0->rn_u.rn_node.rn_R != 0) 140*1ab64a61SGleb Smirnoff if ($debug == 1) 141*1ab64a61SGleb Smirnoff printf "right " 142*1ab64a61SGleb Smirnoff p $rn_$arg0 143*1ab64a61SGleb Smirnoff end 144*1ab64a61SGleb Smirnoff p_rtree $right_$arg0 $rn_$arg0->rn_u.rn_node.rn_R 145*1ab64a61SGleb Smirnoff end 146*1ab64a61SGleb Smirnoff if ($rn_$arg0->rn_u.rn_node.rn_L != 0) 147*1ab64a61SGleb Smirnoff if ($debug == 1) 148*1ab64a61SGleb Smirnoff printf "left " 149*1ab64a61SGleb Smirnoff p $rn_$arg0 150*1ab64a61SGleb Smirnoff end 151*1ab64a61SGleb Smirnoff p_rtree $left_$arg0 $rn_$arg0->rn_u.rn_node.rn_L 152*1ab64a61SGleb Smirnoff end 153*1ab64a61SGleb Smirnoff end 154*1ab64a61SGleb Smirnoffend 155*1ab64a61SGleb Smirnoff 156*1ab64a61SGleb Smirnoffdefine netstat-anr 157*1ab64a61SGleb Smirnoff printf "Routing tables\n\nInternet:\n" 158*1ab64a61SGleb Smirnoff set $af = $AF_INET 159*1ab64a61SGleb Smirnoff set $rt = (struct radix_node_head **)rt_tables + $af 160*1ab64a61SGleb Smirnoff printf "Destination\tGateway\tFlags\tNetif\n" 161*1ab64a61SGleb Smirnoff p_rtree 0 $rt->rnh_treetop 162*1ab64a61SGleb Smirnoffend 163