#!/bin/bash

[ "$1" = D ] && { set -vx; read -p "debugging on" 2>&1; shift; DEBUG=1; }

ReportFile=`pwd`/ver_linux.Report
z=/dev/null

[ "$(echo $*|sed -n '/[^JHCRWjhdbcgmrwyB-]/p')" ] && set --

unset c; for i in 1 2 3; do eval t$i=/tmp/${0##*/}.$i; done

J=`echo $@|sed -n /J/p`			H=`echo $@|sed -n /H/p`
C=`echo $@|sed -n /C/p`			R=`echo $@|sed -n /R/p`
W=`echo $@|sed -n '/W/s/^.\+$/./p'`

pushd ${W:-/usr/src/linux}/Documentation &>$z

[ $C ] || case "`echo $@|sed 's/[JHCRW	 -]//g;s/^\(.\).*$/\1/'`" in
             b) c=4;; c) c=6;; g) c=2;; m) c=5;;
             r) c=1;; w) c=7;; y) c=3;; B) c=0;; esac

[ $C ] || { echo -n [s[3${c:-2}m; setterm -st; }

echo -en "\nRetrieving version information ..."

ldconfig -NXvp > $t1 2>/$z; strings /lib/libc.so.6 > $t2 2>/$z

cp $t1 $t3

items() {
#              Kernel="` uname   -a | cut -d' ' -f3,4,6,7,10-` `uname -s`"
       Kernel_modules="` insmod     -V 2>&1 | sed 's/.\+ //;q'`"
                Gnu_C="` gcc    --vers 2>&1 | sed 's/.*-//'`"
             Binutils="` ld         -V 2>&1 | sed 's/.\+ //;s/)//;q'`"
Linux_libc5_C_Library="` ls $(sed -n '/libc.so.5/{s/^.\+> //p;q;}' $t1)?*|sed 's/.\+so\.//'`"
Linux_libc6_C_Library="` sed -n '/GNU C/{s/,.\+//;s/.\+ //p;q;}' $t2`"
Dynamic_Linker_ld_so_="` ldd       --v 2>$z | sed 's/.\+ //;q'`"
    Linux_Cpp_Library="` sed -n '/libstdc++/!b;/libc6/p' $t1 |sort -r|sed -n 's/.\+so\.//;p;q'`"
               Procps="` ps  --version 2>$z | sed 's/.\+ //'`"
             Procinfo="` procinfo   -v 2>$z | sed 's/ (.*$//;s/.* //'`"
               Psmisc="` pstree     -V 2>&1 | sed 's/.* //'`"
            Net_tools="` arp -V 2>&1 | sed -n '/net-to/{s/.*ls //;s/ .*//;p;q;}'`"
             Sh_utils="` basename  --v 2>$z | sed 's/.* //'`"
               Autofs="` automount --v 2>$z | sed 's/.* //'`"
                  NFS="` showmount  -v 2>$z | sed 's/.* //'`"
                 Bash="` sh -version -c exit 2>/$z | sed 's/.*on //;s/-.*$//;q'`"
                Ncpfs="` ncpmount   -v 2>&1 | sed -n '/ncpfs/s/.* //p'`"
                  PPP="` pppd -- 2>&1 | sed -n '2{s/.*on //;s/ p.*l /./;p;q;}'`"
            Pcmcia_cs="` cardmgr    -V 2>&1 | sed -n '/not/q;s/.* //p'`"
           Util_linux="` fdisk      -v 2>$z | sed 's/.*[v-]//'`"
                  Kbd="` loadkeys   -h 2>&1 | sed 's/.* //;q'`"
       }

items 2>/$z

set -- `declare -f items | sed -n '/=/!b;s/^ \+//;s/=.\+$//p'`
for i in 5 6 10 13 15 `seq 18 40`; do unset A$i 2>$z; done

F=`[ -f Changes ] && echo Changes`

A1="CCuurrrreenntt KKeerrnneell::"
A2="`uname -rv | cut -d' ' -f1-2`"
A3="`uname -v  | cut -d' ' -f3,4,7`"
A4="`uname -a  | cut -d' ' -f11-` `uname -s`"
A7="This table lists "
A8="iinnssttaalllleedd and _r_e_q_u_i_r_e_d"
A9="package versions." 			
A11="SSeeee _D_o_c_u_m_e_n_t_a_t_i_o_n_/_C_h_a_n_g_e_s"
A12="for details." 		
A14="*** not found"
A16="--- not specified"
[ $F ] || A18="_=_=_> _E_R_R_O_R_!_"
[ $F ] || A19="_=_=_> _S_o_u_r_c_e _T_r_e_e _n_o_t _f_o_u_n_d"

declare -i L=0 a=0;	for i; do [ ${#i} -gt $L ] && L=${#i}; done; let L+=2

B='[	 ]\+';	b='[^	 ]\+';	N="\([0-9][0-9.][^ 	]*\)"
Req='/^Current \(Minimal R\|Releases (\)/,/^Upgrade notes/'
S="/.\+modutils-/{s/&//;s/$B$b$//;b h; };s/^-\($B$b\)\+$B$N\($B[^ 	]*\)*$/\2/"
#S="^-\($B$b\)\+\($B\|${B}modutils-\)$N\($B[^	 ]*\)*$"

echo -en "\r"

{ [ $F ] && printf "%${J:+-}${L}s   %s\n\n" \
                   "Source tree:" "`pwd|sed 's/Docu.\+$//;s/./&&/g'`"
for i; do
   let a+=1; eval 'A="$A'$a'"';
   V="`eval 'echo $'$i|sed 's/./&&/g'`"; v=$((${#V}/3*2+14))
   I="`echo $i|sed '/_/!b;s/_Cpp_/ C++ /;s/_\(libc[56]\)_C_/ \1 C /;s/l_m/l m/
                   s/u_C/u C/;/ld./s/.\+/Dynamic Linker (ld.so)/;s/_/-/g'`"

   [ $F ] && R=`sed -n "$Req!b;
                        /^- $I/!b;
                        s/$B[;].*$//;
                        s/^.\+$B//;
                        s/^[^0-9.]\+//;
                        s/./_&/g;
                        p" $F`

   r=$((${#R}/3*2+14))
   printf %${J:+-}$L\s\ \ \ %-$v\s%-$r\s%s\\n "$I" "${V:-***}" "${R:----}" "$A"
done; } | tee $t1 | { [ $H ] && cat || less -E; }

echo ReportFile=$ReportFile

sed 's/_//g;s/.//g' $t1 > $ReportFile

# rm $t1 $t2

popd &>$z

set +vx

[ $C ] || { echo -n "[u[50B"; setterm -st; }

