sifdefaultroute now gets both local and remote addresses
[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 1.2.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 echo
73 echo Installing into kernel version $KERNEL in $LINUXSRC
74 echo
75
76 echo "Notice to the user:"
77 echo
78 echo "It is perfectly legal for this script to run without making any changes"
79 echo "to your system. This only means that the system currently contains the"
80 echo "necessary changes to support this package. Please do not attempt to"
81 echo "force this script to replace any file or make any patch. If you do so"
82 echo "then it is probable that you are actually putting older, buggier, code"
83 echo "over newer, fixed, code. Thank you."
84 echo
85 echo Installing into kernel version $KERNEL in $LINUXSRC
86 echo
87
88 #
89 # convenience function to exit if the last command failed
90
91 bombiffailed () {
92   STATUS=$?
93   if [ $STATUS -ne 0 ]; then
94     echo "=== kinstall.sh exiting with failure status $STATUS"
95     exit $STATUS
96   fi
97 }
98
99 #
100 # convenience function to compare two files marked with ==FILEVERSION
101 # version numbers; returns success if $1 is newer than $2
102
103 newer () {
104   file1=$1
105   file2=$2
106   pat='==FILEVERSION[ \t]+[0-9]+[ \t]*=='
107
108   # Find the revision in the kernel
109   f1rev=""
110   if [ -r $file1 ]; then
111     f1rev=`egrep "$pat" $file1 | head -1 | sed 's/[^0-9]//g'`
112   fi
113
114   # Find the revision of the local file
115   f2rev=""
116   if [ -r $file2 ]; then
117     f2rev=`egrep "$pat" $file2 | head -1 | sed 's/[^0-9]//g'`
118   fi
119
120   # Make the strings the same length to avoid comparison problems
121   f1rev=`echo "0000000000"$f1rev | tail -c 10`
122   f2rev=`echo "0000000000"$f2rev | tail -c 10`
123
124   # Test the order of the two revisions
125   if [ $f1rev -ge $f2rev ]; then
126     true ; return
127   fi
128
129   false ; return
130 }
131
132 #
133 #  Install the files.
134
135 installfile () {
136   BASE=`basename $1`
137   if newer $1 $BASE; then
138     echo $1 is newer than $BASE, skipping
139     return 0
140   fi
141   BACKUP=`echo $1 | sed 's/.c$/.old.c/;s/.h$/.old.h/'`
142   if [ -f $1 -a $BACKUP != $1 ]; then
143     echo Saving old $1 as `basename $BACKUP`
144     mv $1 $BACKUP
145     bombiffailed
146   fi
147   echo Installing new $1
148   cp $BASE $1
149   bombiffailed
150   touch $1
151   bombiffailed
152 }
153
154 #
155 # Patch the bad copies of the sys/types.h file
156 #
157 patch_include () {
158   echo -n "Ensuring that sys/types.h includes sys/bitypes.h"
159   fgrep "<sys/bitypes.h>" /usr/include/sys/types.h >/dev/null
160   if [ ! "$?" = "0" ]; then
161     echo -n '.'
162     rm -f /usr/include/sys/types.h.rej
163     (cd /usr/include/sys; patch -p0 -f -F30 -s) <patch-include
164     if [ ! "$?" = "0" ]; then
165        touch /usr/include/sys/types.h.rej
166     fi
167     if [ -f /usr/include/sys/types.h.rej ]; then
168        echo " --- FAILED!!!! You must fix this yourself!"
169        echo "The /usr/include/sys/types.h file must include the file"
170        echo "<sys/bitypes.h> after it includes the <linux/types.h> file."
171        echo -n "Please change it so that it does."
172        rm -f /usr/include/sys/types.h.rej
173     else
174        echo -n " -- completed"
175     fi
176   else
177     echo -n " -- skipping"
178   fi
179   echo ""
180 }
181
182 #
183 # Check for the root user
184 test_root() {
185   my_uid=`id -u`
186   my_name=`id -u -n`
187   if [ $my_uid -ne 0 ]; then
188     echo
189     echo "********************************************************************"
190     echo "Hello, $my_name. Since you are not running as the root user, it"
191     echo "is possible that this script will fail to install the needed files."
192     echo "If this happens then please use the root account and re-execute the"
193     echo "'make kernel' command.  (This script is paused for 10 seconds.)"
194     echo "********************************************************************"
195     echo
196     sleep 10s
197   fi
198 }
199
200 test_root
201
202 echo
203 echo "Notice to the user:"
204 echo
205 echo "It is perfectly legal for this script to run without making any changes"
206 echo "to your system. This means that the system currently contains the"
207 echo "necessary changes to support this package. Please do not attempt to"
208 echo "force this script to replace any file nor make any patch. If you do so"
209 echo "then it is probable that you are actually putting older, buggier, code"
210 echo "over the newer, fixed, code. Thank you."
211 echo
212 echo Installing into kernel version $KERNEL in $LINUXSRC
213 echo
214
215 if [ -f $LINUXSRC/drivers/net/ppp.h ]; then
216   echo Moving old $LINUXSRC/drivers/net/ppp.h file out of the way
217   mv $LINUXSRC/drivers/net/ppp.h $LINUXSRC/drivers/net/ppp.old.h
218   bombiffailed
219 fi
220
221 for FILE in $LINUXSRC/drivers/net/bsd_comp.c \
222             $LINUXSRC/drivers/net/ppp_deflate.c \
223             $LINUXSRC/drivers/net/zlib.c \
224             $LINUXSRC/drivers/net/zlib.h \
225             $LINUXSRC/include/linux/if_ppp.h \
226             $LINUXSRC/include/linux/if_pppvar.h \
227             $LINUXSRC/include/linux/ppp-comp.h \
228             $LINUXSRC/include/linux/ppp_defs.h
229   do
230   installfile $FILE no
231 done
232
233 installfile $LINUXSRC/drivers/net/ppp.c yes
234
235 for FILE in if.h if_arp.h route.h
236   do
237   if [ ! -f $LINUXSRC/include/linux/$FILE ]; then
238     echo Installing new $1
239     cp $FILE $LINUXSRC/include/linux/$FILE
240     bombiffailed
241     touch $LINUXSRC/include/linux/$FILE
242     bombiffailed
243   fi
244 done
245
246 echo -n 'Adding BSD compression module to drivers makefile...'
247 NETMK=$LINUXSRC/drivers/net/Makefile
248 fgrep bsd_comp.o $NETMK >/dev/null
249 if [ ! "$?" = "0" ]; then
250    if [ -f $NETMK.orig ]; then
251       mv $NETMK.orig $NETMK
252    fi
253    sed 's/ppp.o$/ppp.o bsd_comp.o/g' <$NETMK >$NETMK.temp
254    bombiffailed
255    echo -n '.'
256    mv $NETMK $NETMK.orig
257    bombiffailed
258    echo -n '.'
259    mv $NETMK.temp $NETMK
260    bombiffailed
261 else
262    echo -n '(already there--skipping)'
263 fi
264 echo
265 echo -n 'Adding Deflate compression module to drivers makefile...'
266 NETMK=$LINUXSRC/drivers/net/Makefile
267 fgrep ppp_deflate.o $NETMK >/dev/null
268 if [ ! "$?" = "0" ]; then
269    echo -n '.'
270    sed 's/bsd_comp.o$/bsd_comp.o ppp_deflate.o/g' <$NETMK >$NETMK.temp
271    bombiffailed
272    echo -n '.'
273    mv $NETMK $NETMK.orig
274    bombiffailed
275    echo -n '.'
276    mv $NETMK.temp $NETMK
277    bombiffailed
278 else
279    echo -n '(already there--skipping)'
280 fi
281 echo
282
283 #
284 # install header stub files in /usr/include/net
285
286 for FILE in if_ppp.h \
287             if_pppvar.h \
288             ppp-comp.h \
289             if.h \
290             if_arp.h \
291             route.h \
292             ppp_defs.h
293   do
294   if [ ! -f /usr/include/net/$FILE ]; then
295     echo Installing stub include file in /usr/include/net/$FILE
296     echo "#include <linux/$FILE>" > /usr/include/net/$FILE
297     bombiffailed
298     chown 0:0 /usr/include/net/$FILE
299     bombiffailed
300     chmod 444 /usr/include/net/$FILE
301     bombiffailed
302     touch /usr/include/net/$FILE
303     bombiffailed
304   fi
305 done
306
307 for FILE in ip.h \
308             tcp.h
309   do
310   if [ ! -f /usr/include/netinet/$FILE ]; then
311     echo Installing stub include file in /usr/include/netinet/$FILE
312     if [ ! -f $LINUXSRC/include/linux/$FILE ]; then
313       echo "#include \"$LINUXSRC/net/inet/$FILE\"" >/usr/include/netinet/$FILE
314     else
315       echo "#include <linux/$FILE>" > /usr/include/netinet/$FILE
316     fi
317     chown 0:0 /usr/include/netinet/$FILE
318     bombiffailed
319     chmod 444 /usr/include/netinet/$FILE
320     bombiffailed
321     touch /usr/include/netinet/$FILE
322     bombiffailed
323   fi
324 done
325
326 patch_include
327
328 echo "Kernel driver files installation done."
329
330 exit 0