~ubuntu-core-dev/module-init-tools/ubuntu

1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
1
#! /bin/sh -e
2
3
# Naive shell script to translate modules.conf + defaults to modprobe.conf
4
# Normal caveats apply, as with any machine translation.
90 by Mike Frysinger
generate-modprobe.conf: cleanup usage and add --assume-kernel
5
usage() {
6
	cat <<-EOF
7
		Usage: $0 [--assume-kernel=n.n.n] [--stdin] [modprobe.conf]
8
		   Converts your current modules setup to modprobe.conf.
9
		   Don't trust it too much.
10
		 Version 0.1
11
	EOF
12
	exit ${1:-1}
13
}
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
14
90 by Mike Frysinger
generate-modprobe.conf: cleanup usage and add --assume-kernel
15
KV=$(uname -r)
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
16
STDIN=
90 by Mike Frysinger
generate-modprobe.conf: cleanup usage and add --assume-kernel
17
while [ -n "$1" ] ; do
18
	case $1 in
19
	--assume-kernel)   KV=$2; shift;;
20
	--assume-kernel=*) KV=${1#*=};;
21
	--stdin)           STDIN=1;;
22
	-h|--help)         usage 0;;
23
	*)                 break;;
24
	esac
25
	shift
26
done
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
27
28
# Set up output if specified.
90 by Mike Frysinger
generate-modprobe.conf: cleanup usage and add --assume-kernel
29
if [ $# -eq 1 ] ; then
30
	exec > $1
31
else
32
	usage 1
33
fi
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
34
35
MODPROBECONF=`mktemp /tmp/modprobe.XXXXXX || tempfile || echo /tmp/modprobe.$$`
36
trap "rm -f $MODPROBECONF" 0
37
91 by Martin Schlemmer
generate-modprobe.conf: detect errors and abort
38
modprobe_abort()
39
{
40
    echo Failed to to run modprobe.  Giving up. 1>&2
41
    exit 1
42
}
43
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
44
if [ x"$TESTING_MODPROBE_CONF" != x ]; then
45
    cp $TESTING_MODPROBE_CONF $MODPROBECONF
46
elif [ "$STDIN" = "1" ]; then
47
    cat > $MODPROBECONF
48
elif [ -x /sbin/modprobe.old ]; then
49
    # In sbin.
91 by Martin Schlemmer
generate-modprobe.conf: detect errors and abort
50
    /sbin/modprobe.old -c > $MODPROBECONF || modprobe_abort
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
51
elif modprobe.old -c >/dev/null 2>&1; then
52
    # Somewhere in path.
91 by Martin Schlemmer
generate-modprobe.conf: detect errors and abort
53
    modprobe.old -c > $MODPROBECONF || modprobe_abort
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
54
elif /sbin/modprobe -V 2>/dev/null | grep -q 'modprobe version'; then
55
    # Running /sbin/modprobe gives old version.
91 by Martin Schlemmer
generate-modprobe.conf: detect errors and abort
56
    /sbin/modprobe -c > $MODPROBECONF || modprobe_abort
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
57
elif modprobe -V 2>/dev/null | grep -q 'modprobe version'; then
58
    # Running modprobe gives old version.
91 by Martin Schlemmer
generate-modprobe.conf: detect errors and abort
59
    modprobe -c > $MODPROBECONF || modprobe_abort
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
60
else
61
    echo Cannot find old version of modprobe.  Giving up. 2>&1
62
    exit 1
63
fi
64
65
# Resolve (possibly recursive) alias: args filename alias
66
resolve_alias()
67
{
68
    RA_RESOLVE=`grep "^alias[ 	][ 	]*$2[ 	]" -- $1 | awk '{ print $3 }'`
69
    if [ x"$RA_RESOLVE" = x ]; then
70
	echo $2
71
	return
72
    fi
73
    # Recurse.
74
    (resolve_alias $1 "$RA_RESOLVE")
75
}
76
77
# Parse alias: args filename modulename aliasto.
78
parse_alias()
79
{
80
    PA_ALIAS=`resolve_alias $1 $3`
81
    NAME=`echo $2|sed -e 's/\(block\|char\)-major-\([0-9]\+\)$/\1-major-\2-*/'`
82
83
    echo "alias $NAME $PA_ALIAS"
84
}
85
86
# Parse options: args modulename aliasto.
87
parse_options()
88
{
89
    # Second arg can be null if grab_noninstall options returns empty.
90
    [ x"$2" = x ] || echo "options $1 $2"
91
}
92
93
# Separate out the modprobe options from the module options
94
grab_install_options()
95
{
96
    GRAB_OPTS=""
97
    GRAB_NEXT=0
98
    for grab_i; do
99
	case "$grab_i" in
100
	-o) GRAB_OPTS="$GRAB_OPTS -o"; GRAB_NEXT=1;;
101
	-*) echo Warning: Ignoring unknown alias option "$grab_i" >&2;;
102
	*)
103
	    [ $GRAB_NEXT = 0 ] || GRAB_OPTS="$GRAB_OPTS $grab_i"
104
	    GRAB_NEXT=0
105
	    ;;
106
	esac
107
    done
108
    echo "$GRAB_OPTS"
109
}
110
111
grab_noninstall_options()
112
{
113
    GRAB_OPTS=""
114
    GRAB_NEXT=0
115
    for grab_i; do
116
	case "$grab_i" in
117
	-o) GRAB_NEXT=1;;
118
	-*) ;;
119
	*)
120
	    [ $GRAB_NEXT = 1 ] || GRAB_OPTS="$GRAB_OPTS $grab_i"
121
	    GRAB_NEXT=0
122
	    ;;
123
	esac
124
    done
125
    echo "$GRAB_OPTS"
126
}
127
128
# Produce a multiple install/remove commands. Args: list, command, separator.
129
multi()
130
{
131
    mp_res=""
132
    for mp_arg in $1; do
133
	if [ x"$mp_res" = x ]; then mp_res="/sbin/$2 $mp_arg";
134
	else mp_res="$mp_res${3}/sbin/$2 $mp_arg";
135
	fi
136
    done
137
    echo "$mp_res"
138
}
139
140
# Install and remove commands frequently refer to insmod and rmmod.
141
# Use "modprobe --ignore-install " and "modprobe -r --ignore-remove" since 
142
# our versions of rmmod and insmod are deliberately stupid.
143
convert_command()
144
{
145
    echo "$@" | sed -e 's,insmod,/sbin/modprobe --ignore-install,' -e 's,rmmod,/sbin/modprobe -r --ignore-remove,'
146
}
147
148
while read ADD NAME MODULE REST; do
149
    # Ignore a spurious add, otherwise move them down.
150
    if [ x"$ADD" = x"add" ]; then :; else
151
	REST="`echo $MODULE $REST | sed 's/ *$//'`"
152
	MODULE="$NAME"
153
	NAME="$ADD";
154
    fi
155
    #echo "NAME=$NAME MODULE=$MODULE REST=$REST" >&2
156
157
    # MODNAME is the converted name for use in variables.
158
    MODNAME=`echo $MODULE | tr -c A-Za-z_0-9 _`
159
    case "$NAME" in
160
    '#'*) : ;; # Comment 
161
    '') : ;;   # Blank line
162
163
    keep) # Do nothing.
164
	;;
165
166
    alias)
167
	if [ x"$REST" = xoff ] || [ x"$REST" = xnull ]; then
168
	    INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
169
	    eval install_$MODNAME=\"/bin/true\"
170
	else
171
	    parse_alias $MODPROBECONF "$MODULE" $REST
172
	fi
173
	;;
174
175
    options) 
176
	# Options used to be able to contain extra args to insmod
177
	# (eg. -o foo).  Not any more.
178
	case " $REST" in
179
	*' '-[-a-z]*)
180
	    parse_options $MODULE `grab_noninstall_options $REST`
181
	    INSTALL_OPTIONS=`grab_install_options $REST`
182
	    INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
183
	    eval install_$MODNAME=\"/sbin/modprobe $INSTALL_OPTIONS --ignore-install `resolve_alias $MODPROBECONF $MODULE`\"
184
	    ;;
185
	*)
186
	    parse_options $MODULE "$REST"
187
	    ;;
188
	esac
189
	;;
190
191
    above)
192
	# Pull in these modules after me.
193
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
194
	eval post_install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\; /bin/true\"
195
	REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
196
	eval pre_remove_$MODNAME=\"`multi "$REST" 'modprobe -r' '; '`\"
197
	;;
198
    below)
199
	# Pull in these modules before me.
200
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
201
	eval pre_install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\"
202
	REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
203
	eval post_remove_$MODNAME=\"`multi "$REST" 'modprobe -r' '; '`\; /bin/true\"
204
	;;
205
    probe) 
206
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
207
	eval install_$MODNAME=\"`multi "$REST" 'modprobe' ' || '`\"
208
	;;
209
    probeall)
210
	# Not quite correct.  If they all fail, we should fail.
211
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
212
	eval install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\; /bin/true\"
213
	;;
214
    post-install)
215
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
216
	eval post_install_$MODNAME=\"`convert_command "$REST"`\"
217
	;;
218
    pre-install)
219
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
220
	eval pre_install_$MODNAME=\"`convert_command "$REST"`\"
221
	;;
222
    install)
223
	INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
224
	eval install_$MODNAME=\"`convert_command "$REST"`\"
225
	;;
226
    post-remove)
227
	REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
228
	eval post_remove_$MODNAME=\"`convert_command "$REST"`\"
229
	;;
230
    pre-remove)
231
	REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
232
	eval pre_remove_$MODNAME=\"`convert_command "$REST"`\"
233
	;;
234
    remove)
235
	REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
236
	eval remove_$MODNAME=\"`convert_command "$REST"`\"
237
	;;
238
    include)
239
	# Recurse.
240
	($0 $MODULE)
241
	;;
242
    # Ignore default lines which are not required any more.
90 by Mike Frysinger
generate-modprobe.conf: cleanup usage and add --assume-kernel
243
    "path[boot]=/lib/modules/boot"|"path[toplevel]=/lib/modules/$KV"|"path[toplevel]=/lib/modules/2.4"|"path[kernel]=/lib/modules/kernel"|"path[fs]=/lib/modules/fs"|"path[net]=/lib/modules/net"|"path[scsi]=/lib/modules/scsi"|"path[block]=/lib/modules/block"|"path[cdrom]=/lib/modules/cdrom"|"path[ipv4]=/lib/modules/ipv4"|"path[ipv6]=/lib/modules/ipv6"|"path[sound]=/lib/modules/sound"|"path[fc4]=/lib/modules/fc4"|"path[video]=/lib/modules/video"|"path[misc]=/lib/modules/misc"|"path[pcmcia]=/lib/modules/pcmcia"|"path[atm]=/lib/modules/atm"|"path[usb]=/lib/modules/usb"|"path[ide]=/lib/modules/ide"|"path[ieee1394]=/lib/modules/ieee1394"|"path[mtd]=/lib/modules/mtd"|"generic_stringfile=/lib/modules/$KV/modules.generic_string"|"pcimapfile=/lib/modules/$KV/modules.pcimap"|"isapnpmapfile=/lib/modules/$KV/modules.isapnpmap"|"usbmapfile=/lib/modules/$KV/modules.usbmap"|"parportmapfile=/lib/modules/$KV/modules.parportmap"|"ieee1394mapfile=/lib/modules/$KV/modules.ieee1394map"|"pnpbiosmapfile=/lib/modules/$KV/modules.pnpbiosmap"|"depfile=/lib/modules/$KV/modules.dep"|"persistdir=/var/lib/modules/persist")
1 by Jonathan Masters
Begin tracking post-3.3-pre3 development with git.
244
	;;
245
246
    # Ignore prune lines unless they end in .o or .ko, which would
247
    # have an effect.
248
    prune)
249
	case "$MODULE" in
250
	*.ko|*.o)
251
	    echo "Warning: not translating $NAME $MODULE $REST" >&2
252
	    ;;
253
	esac
254
	;;
255
    *)
256
	echo "Warning: not translating $NAME $MODULE $REST" >&2
257
	;;
258
    esac
259
done < $MODPROBECONF
260
261
for mod in `echo $INSTALL_COMMANDS | tr ' ' '\n' | sort -u`; do
262
    # MODNAME is the converted name for use in variables.
263
    MODNAME=`echo $mod | tr -c A-Za-z_0-9 _`
264
    eval PREINSTALL=\"\$pre_install_$MODNAME\"
265
    eval POSTINSTALL=\"\$post_install_$MODNAME\"
266
    eval INSTALL=\"\$\{install_$MODNAME:-/sbin/modprobe --first-time --ignore-install $mod}\"
267
    if [ -n "$PREINSTALL" ]; then PREINSTALL="{ $PREINSTALL; } ; "; fi
268
    if [ -n "$POSTINSTALL" ]; then POSTINSTALL="&& { $POSTINSTALL; }"; fi
269
    echo install $mod $PREINSTALL $INSTALL $POSTINSTALL
270
done
271
272
for mod in `echo $REMOVE_COMMANDS | tr ' ' '\n' | sort -u`; do
273
    # MODNAME is the converted name for use in variables.
274
    MODNAME=`echo $mod | tr -c A-Za-z_0-9 _`
275
    eval PREREMOVE=\"\$pre_remove_$MODNAME\"
276
    eval POSTREMOVE=\"\$post_remove_$MODNAME\"
277
    eval REMOVE=\"\$\{remove_$MODNAME:-/sbin/modprobe -r --first-time --ignore-remove $mod}\"
278
    if [ -n "$PREREMOVE" ]; then PREREMOVE="{ $PREREMOVE; } ; "; fi
279
    if [ -n "$POSTREMOVE" ]; then POSTREMOVE="&& { $POSTREMOVE; }"; fi
280
    echo remove $mod $PREREMOVE $REMOVE $POSTREMOVE
281
done