Support module options set in /etc/module.d, amend cmdline options patch
[genkernel.git] / defaults / modprobe
1 #!/bin/ash
2 # Apparently, this is required for proper functionality with busybox 1.1.3
3 # Check out bug #197730 for more details.
4
5 . /etc/initrd.defaults
6
7 usage() {
8         echo 'Usage:'
9         echo '  modprobe moduleprefix'
10         echo
11         echo 'Example:'
12         echo '  modprobe eepro100'
13         echo
14         echo 'Note: Do not pass the suffix to modprobe!'
15         exit 1
16 }
17
18 # Pass module name to this function
19 modules_dep_list() {
20         if [ "$#" -lt '1' ]
21         then
22                 echo 'modules_dep_list(): Improper usage!'
23                 exit 1
24         fi
25         cat /lib/modules/${KV}/modules.dep | grep /"${1}${KSUFF}:" | cut -d':'  -f2
26 }
27
28
29 # Pass module deps list
30 strip_mod_paths() {
31         local x
32         local ret
33         local myret
34
35         [ "$#" -lt '1' ] && return
36
37         for x in ${*}
38         do
39                 ret=`basename ${x} | cut -d. -f1`
40                 myret="${myret} ${ret}"
41         done
42         echo "${myret}"
43 }
44
45 LOADED_MODULES=''
46 is_module_already_loaded() {
47         local x
48         if [ "$#" != '1' ]
49         then
50                 echo 'is_module_already_loaded(): Improper usage!'
51         fi
52
53         for x in ${LOADED_MODULES}
54         do
55                 if [ "${x}" = "${1}" ]
56                 then
57                         # Yep, module is loaded
58                         return 0
59                 fi
60         done
61         return 1
62 }
63
64 real_mod_path() {
65         # Find -name is no good since the return status is always zero
66         find "/lib/modules/${KV}" | grep /"${1}${KSUFF}"
67 }
68
69 modprobe2() {
70         local x
71         local deps
72         local real_path
73         local modlist
74         local ret
75
76         local echoAppend
77         local echoFlags
78
79         if [ "$#" -lt '1' ]
80         then
81                 usage
82                 exit 1
83         fi
84         real_path=`real_mod_path ${1}`
85         if [ "${real_path}" = '' -o "${real_path}" = ' ' ]
86         then
87                 [ "${2}" = '-n' ] && echo -n " -> $1"
88                 echo ' module not found.'
89                 exit 2
90         fi
91         modlist=`modules_dep_list ${1}`
92         if [ "${modlist}" != '' -a "${modlist}" != ' ' ]
93         then
94                 deps=`strip_mod_paths ${modlist}`
95         else
96                 deps=''
97         fi
98         # Make sure we don't do any endless loops!
99
100         LOADED_MODULES="${LOADED_MODULES} ${1}"
101         for x in ${deps}
102         do
103                 if ! is_module_already_loaded ${x}
104                 then
105                         if [ "${x}" != '' -a "${x}" != ' ' ]
106                         then
107                                 modprobe2 "${x}" -n
108                         fi
109                 else
110                         filler=1
111                 fi
112         done
113         # placing options into x
114         x="${real_path##*/}"
115         x="`cat "/etc/module_options/${x%.ko*}".* 2>/dev/null`"
116         ${INSMOD} ${real_path} ${x} > /dev/null 2>&1
117         ret=$?
118         if [ ${ret} -eq 0 ]
119         then
120                 echoAppend=' loaded.'
121                 [ "${2}" = '-n' ] && echoFlags='-n' && echoAppend=', '
122                 echo ${echoFlags} "${1}${echoAppend}"
123         fi
124         return $ret
125 }
126
127 if [ "$#" -lt '1' ]
128 then
129         usage
130 fi
131
132 [ -f '/modules.cache' ] || touch /modules.cache
133 for x in `cat /modules.cache`
134 do
135         LOADED_MODULES="${LOADED_MODULES} ${x}"
136 done
137
138 modprobe2 ${1}
139 modprobe_ret=$?
140
141 [ -f '/modules.cache' ] && rm -f /modules.cache > /dev/null 2>&1
142 for x in ${LOADED_MODULES}
143 do
144         echo $x >> /modules.cache
145 done
146
147 exit $modprobe_ret