0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 PNAME=patch-kernel
0063
0064
0065 sourcedir=${1-/usr/src/linux}
0066 patchdir=${2-.}
0067 stopvers=${3-default}
0068
0069 if [ "$1" = -h -o "$1" = --help -o ! -r "$sourcedir/Makefile" ]; then
0070 cat << USAGE
0071 usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
0072 source directory defaults to /usr/src/linux,
0073 patch directory defaults to the current directory,
0074 stopversion defaults to <all in patchdir>.
0075 USAGE
0076 exit 1
0077 fi
0078
0079
0080 for PARM in $*
0081 do
0082 case $PARM in
0083 -ac*)
0084 gotac=$PARM;
0085
0086 esac;
0087 done
0088
0089
0090
0091 noFile () {
0092 echo "cannot find patch file: ${patch}"
0093 exit 1
0094 }
0095
0096
0097 backwards () {
0098 echo "$PNAME does not support reverse patching"
0099 exit 1
0100 }
0101
0102
0103
0104
0105 findFile () {
0106 filebase=$1;
0107
0108 if [ -r ${filebase}.gz ]; then
0109 ext=".gz"
0110 name="gzip"
0111 uncomp="gunzip -dc"
0112 elif [ -r ${filebase}.bz ]; then
0113 ext=".bz"
0114 name="bzip"
0115 uncomp="bunzip -dc"
0116 elif [ -r ${filebase}.bz2 ]; then
0117 ext=".bz2"
0118 name="bzip2"
0119 uncomp="bunzip2 -dc"
0120 elif [ -r ${filebase}.xz ]; then
0121 ext=".xz"
0122 name="xz"
0123 uncomp="xz -dc"
0124 elif [ -r ${filebase}.zip ]; then
0125 ext=".zip"
0126 name="zip"
0127 uncomp="unzip -d"
0128 elif [ -r ${filebase}.Z ]; then
0129 ext=".Z"
0130 name="uncompress"
0131 uncomp="uncompress -c"
0132 elif [ -r ${filebase} ]; then
0133 ext=""
0134 name="plaintext"
0135 uncomp="cat"
0136 else
0137 return 1;
0138 fi
0139
0140 return 0;
0141 }
0142
0143
0144
0145
0146
0147 applyPatch () {
0148 echo -n "Applying $1 (${name})... "
0149 if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir
0150 then
0151 echo "done."
0152 else
0153 echo "failed. Clean up yourself."
0154 return 1;
0155 fi
0156 if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
0157 then
0158 echo "Aborting. Reject files found."
0159 return 1;
0160 fi
0161
0162 find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
0163
0164 return 0;
0165 }
0166
0167
0168
0169 reversePatch () {
0170 echo -n "Reversing $1 (${name}) ... "
0171 if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir
0172 then
0173 echo "done."
0174 else
0175 echo "failed. Clean it up."
0176 exit 1
0177 fi
0178 if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
0179 then
0180 echo "Aborting. Reject files found."
0181 return 1
0182 fi
0183
0184 find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
0185
0186 return 0
0187 }
0188
0189
0190
0191
0192 TMPFILE=`mktemp ./.tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
0193 grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
0194 tr -d [:blank:] < $TMPFILE > $TMPFILE.1
0195 . $TMPFILE.1
0196 rm -f $TMPFILE*
0197 if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
0198 then
0199 echo "unable to determine current kernel version" >&2
0200 exit 1
0201 fi
0202
0203 NAME=`grep ^NAME $sourcedir/Makefile`
0204 NAME=${NAME
0205
0206 echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION} ($NAME)"
0207
0208
0209 EXTRAVER=
0210 if [ x$EXTRAVERSION != "x" ]
0211 then
0212 EXTRAVER=${EXTRAVERSION
0213 EXTRAVER=${EXTRAVER%%[[:punct:]]*}
0214
0215 fi
0216
0217
0218 if [ $stopvers != "default" ]; then
0219 STOPSUBLEVEL=`echo $stopvers | cut -d. -f3`
0220 STOPEXTRA=`echo $stopvers | cut -d. -f4`
0221 STOPFULLVERSION=${stopvers%%.$STOPEXTRA}
0222
0223 else
0224 STOPSUBLEVEL=9999
0225 STOPEXTRA=9999
0226 fi
0227
0228
0229
0230 if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then
0231 backwards
0232 fi
0233
0234 if [ x$EXTRAVER != "x" ]; then
0235 CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
0236 else
0237 CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
0238 fi
0239
0240 if [ x$EXTRAVER != "x" ]; then
0241 echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL"
0242 patch="patch-${CURRENTFULLVERSION}"
0243 findFile $patchdir/${patch} || noFile ${patch}
0244 reversePatch ${patch} || exit 1
0245 fi
0246
0247
0248
0249
0250
0251
0252
0253 if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then
0254 while :
0255 do
0256 CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
0257 EXTRAVER=
0258 if [ x$STOPFULLVERSION = x$CURRENTFULLVERSION ]; then
0259 echo "Stopping at $CURRENTFULLVERSION base as requested."
0260 break
0261 fi
0262
0263 SUBLEVEL=$(($SUBLEVEL + 1))
0264 FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
0265
0266
0267 if [ $(($SUBLEVEL)) -gt $(($STOPSUBLEVEL)) ]; then
0268 echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)"
0269 exit 1
0270 fi
0271
0272 patch=patch-$FULLVERSION
0273
0274 findFile $patchdir/${patch} || noFile ${patch}
0275
0276
0277 applyPatch $patch || break
0278 done
0279
0280 fi
0281
0282
0283 if [ "$STOPEXTRA" != "" ]; then
0284 while :
0285 do
0286
0287 FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA"
0288
0289 patch=patch-$FULLVERSION
0290
0291
0292 findFile $patchdir/${patch} || noFile ${patch}
0293
0294
0295 applyPatch $patch || break
0296
0297 break
0298 done
0299 fi
0300
0301 if [ x$gotac != x ]; then
0302
0303
0304 if [ $gotac = "-ac" ]; then
0305
0306 HIGHESTPATCH=0
0307 for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*\.*
0308 do
0309 ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac\([0-9]*\).*/\1/'`
0310
0311 findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break
0312
0313 if [ $ACVALUE -gt $HIGHESTPATCH ]; then
0314 HIGHESTPATCH=$ACVALUE
0315 fi
0316 done
0317
0318 if [ $HIGHESTPATCH -ne 0 ]; then
0319 findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break
0320 applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH}
0321 else
0322 echo "No -ac patches found"
0323 fi
0324 else
0325
0326 findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || {
0327 echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION. Hohum."
0328 exit 1
0329 }
0330 applyPatch patch-${CURRENTFULLVERSION}${gotac}
0331 fi
0332 fi