fix compression negotiation
[ppp.git] / linux / kinstall.sh
1 #!/bin/sh
2 #
3 #  kinstall.sh -- install updated kernel PPP driver in Linux kernel source
4 #     Michael Callahan callahan@maths.ox.ac.uk 17 May 1995
5 #
6 #  This script is complicated because we want to avoid installing a driver
7 #  in a kernel if it won't work in that kernel.  This means two things:
8 #    1) we check the version of the kernel and refuse to install if the
9 #       kernel is too old;
10 #    2) we check that the files already in the kernel aren't more recent
11 #       than the one we're about to install.
12 #  If either 1) or 2) occurs then we exit with an error message and don't
13 #  touch anything.
14 #
15 #  In addition, we have to edit the Makefile in the drivers/net
16 #  directory to add support for the ppp-comp compression option.
17 #
18 #  Finally, we have to check that certain include file stubs in
19 #  /usr/include/net exist, or else pppd won't compile.  Phew!
20
21 LINUXSRC=/usr/src/linux
22
23 if [ $# -gt 1 ]; then
24    echo usage: $0 [linux-source-directory]
25    exit 1
26 fi
27
28 if [ $# -eq 1 ]; then
29    LINUXSRC=$1
30 fi
31
32 #
33 #  Make sure we can find the kernel source
34
35 LINUXMK=$LINUXSRC/Makefile
36
37 if [ ! -r $LINUXMK -o ! -d $LINUXSRC/drivers ]; then
38   echo There appears to be no kernel source distribution in $LINUXSRC.
39   echo Give the top-level kernel source directory as the argument to
40   echo this script.
41   echo usage: $0 [linux-source-directory]
42   exit 1
43 fi
44
45 #
46 #  Check that the kernel source Makefile includes the 
47 #    VERSION, PATCHLEVEL, SUBLEVEL version-numbering scheme
48 #    introduced in 1.0.1
49 if [ `egrep '^VERSION|^PATCHLEVEL|^SUBLEVEL' $LINUXMK | wc -l` -ne 3 ]; then
50   echo You appear to have a very old kernel. You must upgrade.
51   echo It is recommended that you upgrade to the most recent 2.0.x kernel.
52   exit 1
53 fi
54
55 #
56 #  Set the VERSION, PATCHLEVEL, SUBLEVEL variables
57 VERSION=`egrep '^VERSION' $LINUXMK | sed 's/[^0-9]//g'`
58 PATCHLEVEL=`egrep '^PATCHLEVEL' $LINUXMK | sed 's/[^0-9]//g'`
59 SUBLEVEL=`egrep '^SUBLEVEL' $LINUXMK | sed 's/[^0-9]//g'`
60
61 KERNEL=$VERSION.$PATCHLEVEL.$SUBLEVEL
62
63 #
64 #  Pass judgement on the kernel version
65 if [ $VERSION -lt 2 ]; then
66     echo You appear to be running $KERNEL. There is no support for
67     echo kernels predating 2.0.0.  It is recommended that you upgrade
68     echo to the most recent 2.0.x kernel.
69     exit 1
70 fi
71
72 #
73 # convenience function to exit if the last command failed
74
75 bombiffailed () {
76   STATUS=$?
77   if [ $STATUS -ne 0 ]; then
78     echo "=== kinstall.sh exiting with failure status $STATUS"
79     exit $STATUS
80   fi
81 }
82
83 #
84 # convenience function to compare two files marked with ==FILEVERSION
85 # version numbers; returns success if $1 is newer than $2
86
87 newer () {
88   file1=$1
89   file2=$2
90   pat='==FILEVERSION[ \t]+[0-9]+[ \t]*=='
91
92   # Find the revision in the kernel
93   f1rev=""
94   if [ -r $file1 ]; then
95     f1rev=`egrep "$pat" $file1 | head -1 | sed 's/[^0-9]//g'`
96   fi
97
98   # Find the revision of the local file
99   f2rev=""
100   if [ -r $file2 ]; then
101     f2rev=`egrep "$pat" $file2 | head -1 | sed 's/[^0-9]//g'`
102   fi
103
104   # Make the strings the same length to avoid comparison problems
105   f1rev=`echo "0000000000"$f1rev | tail -c 10`
106   f2rev=`echo "0000000000"$f2rev | tail -c 10`
107
108   # Test the order of the two revisions
109   if [ $f1rev -ge $f2rev ]; then
110     true ; return
111   fi
112
113   false ; return
114 }
115
116 #
117 #  Install the files.
118
119 installfile () {
120   BASE=`basename $1`
121   if newer $1 $BASE; then
122     echo $1 is newer than $BASE, skipping
123     return 0
124   fi
125   BACKUP=`echo $1 | sed 's/.c$/.old.c/;s/.h$/.old.h/'`
126   if [ -f $1 -a $BACKUP != $1 ]; then
127     echo Saving old $1 as `basename $BACKUP`
128     mv $1 $BACKUP
129     bombiffailed
130   fi
131   echo Installing new $1
132   cp $BASE $1
133   bombiffailed
134   touch $1
135   bombiffailed
136 }
137
138 #
139 # Patch the bad copies of the sys/types.h file
140 #
141 patch_include () {
142   echo -n "Ensuring that sys/types.h includes sys/bitypes.h"
143   fgrep "<sys/bitypes.h>" /usr/include/sys/types.h >/dev/null
144   if [ ! "$?" = "0" ]; then
145     echo -n '.'
146     rm -f /usr/include/sys/types.h.rej
147     (cd /usr/include/sys; patch -p0 -f -F30 -s) <patch-include
148     if [ ! "$?" = "0" ]; then
149        touch /usr/include/sys/types.h.rej
150     fi
151     if [ -f /usr/include/sys/types.h.rej ]; then
152        echo " --- FAILED!!!! You must fix this yourself!"
153        echo "The /usr/include/sys/types.h file must include the file"
154        echo "<sys/bitypes.h> after it includes the <linux/types.h> file."
155        echo -n "Please change it so that it does."
156        rm -f /usr/include/sys/types.h.rej
157     else
158        echo -n " -- completed"
159     fi
160   else
161     echo -n " -- skipping"
162   fi
163   echo ""
164 }
165
166 #
167 # Check for the root user
168 test_root() {
169   my_uid=`id -u`
170   my_name=`id -u -n`
171   if [ $my_uid -ne 0 ]; then
172     echo
173     echo "********************************************************************"
174     echo "Hello, $my_name. Since you are not running as the root user, it"
175     echo "is possible that this script will fail to install the needed files."
176     echo "If this happens then please use the root account and re-execute the"
177     echo "'make kernel' command.  (This script is paused for 10 seconds.)"
178     echo "********************************************************************"
179     echo
180     sleep 10s
181   fi
182 }
183
184 test_root
185
186 echo
187 echo "Notice to the user:"
188 echo
189 echo "It is perfectly legal for this script to run without making any changes"
190 echo "to your system. This means that the system currently contains the"
191 echo "necessary changes to support this package. Please do not attempt to"
192 echo "force this script to replace any file nor make any patch. If you do so"
193 echo "then it is probable that you are actually putting older, buggier, code"
194 echo "over the newer, fixed, code. Thank you."
195 echo
196 echo Installing into kernel version $KERNEL in $LINUXSRC
197 echo
198
199 if [ -f $LINUXSRC/drivers/net/ppp.h ]; then
200   echo Moving old $LINUXSRC/drivers/net/ppp.h file out of the way
201   mv $LINUXSRC/drivers/net/ppp.h $LINUXSRC/drivers/net/ppp.old.h
202   bombiffailed
203 fi
204
205 for FILE in $LINUXSRC/drivers/net/bsd_comp.c \
206             $LINUXSRC/drivers/net/ppp_deflate.c \
207             $LINUXSRC/drivers/net/zlib.c \
208             $LINUXSRC/drivers/net/zlib.h \
209             $LINUXSRC/include/linux/if_ppp.h \
210             $LINUXSRC/include/linux/if_pppvar.h \
211             $LINUXSRC/include/linux/ppp-comp.h \
212             $LINUXSRC/include/linux/ppp_defs.h
213   do
214   installfile $FILE no
215 done
216
217 installfile $LINUXSRC/drivers/net/ppp.c yes
218
219 for FILE in if.h if_arp.h route.h
220   do
221   if [ ! -f $LINUXSRC/include/linux/$FILE ]; then
222     echo Installing new $1
223     cp $FILE $LINUXSRC/include/linux/$FILE
224     bombiffailed
225     touch $LINUXSRC/include/linux/$FILE
226     bombiffailed
227   fi
228 done
229
230 echo -n 'Adding BSD compression module to drivers makefile...'
231 NETMK=$LINUXSRC/drivers/net/Makefile
232 fgrep bsd_comp.o $NETMK >/dev/null
233 if [ ! "$?" = "0" ]; then
234    if [ -f $NETMK.orig ]; then
235       mv $NETMK.orig $NETMK
236    fi
237    sed 's/ppp.o$/ppp.o bsd_comp.o/g' <$NETMK >$NETMK.temp
238    bombiffailed
239    echo -n '.'
240    mv $NETMK $NETMK.orig
241    bombiffailed
242    echo -n '.'
243    mv $NETMK.temp $NETMK
244    bombiffailed
245 else
246    echo -n '(already there--skipping)'
247 fi
248 echo
249 echo -n 'Adding Deflate compression module to drivers makefile...'
250 NETMK=$LINUXSRC/drivers/net/Makefile
251 fgrep ppp_deflate.o $NETMK >/dev/null
252 if [ ! "$?" = "0" ]; then
253    echo -n '.'
254    sed 's/bsd_comp.o$/bsd_comp.o ppp_deflate.o/g' <$NETMK >$NETMK.temp
255    bombiffailed
256    echo -n '.'
257    mv $NETMK $NETMK.orig
258    bombiffailed
259    echo -n '.'
260    mv $NETMK.temp $NETMK
261    bombiffailed
262 else
263    echo -n '(already there--skipping)'
264 fi
265 echo
266
267 #
268 # install header stub files in /usr/include/net
269
270 for FILE in if_ppp.h \
271             if_pppvar.h \
272             ppp-comp.h \
273             if.h \
274             if_arp.h \
275             route.h \
276             ppp_defs.h
277   do
278   if [ ! -f /usr/include/net/$FILE ]; then
279     echo Installing stub include file in /usr/include/net/$FILE
280     echo "#include <linux/$FILE>" > /usr/include/net/$FILE
281     bombiffailed
282     chown 0:0 /usr/include/net/$FILE
283     bombiffailed
284     chmod 444 /usr/include/net/$FILE
285     bombiffailed
286     touch /usr/include/net/$FILE
287     bombiffailed
288   fi
289 done
290
291 for FILE in ip.h \
292             tcp.h
293   do
294   if [ ! -f /usr/include/netinet/$FILE ]; then
295     echo Installing stub include file in /usr/include/netinet/$FILE
296     if [ ! -f $LINUXSRC/include/linux/$FILE ]; then
297       echo "#include \"$LINUXSRC/net/inet/$FILE\"" >/usr/include/netinet/$FILE
298     else
299       echo "#include <linux/$FILE>" > /usr/include/netinet/$FILE
300     fi
301     chown 0:0 /usr/include/netinet/$FILE
302     bombiffailed
303     chmod 444 /usr/include/netinet/$FILE
304     bombiffailed
305     touch /usr/include/netinet/$FILE
306     bombiffailed
307   fi
308 done
309
310 patch_include
311
312 echo "Kernel driver files installation done."
313
314 exit 0