@@ -983,9 +983,12 @@ static void usage(int status)
983
983
"\n"
984
984
" --module,-m Install kernel modules, instead of files\n"
985
985
" --kerneldir Specify the kernel module directory\n"
986
- " (default: /lib/modules/` uname -r` )\n"
986
+ " (default: /lib/modules/$( uname -r) )\n"
987
987
" --firmwaredirs Specify the firmware directory search path with : separation\n"
988
- " (default: DRACUT_FIRMWARE_PATH env var, /lib/firmware if not set)\n"
988
+ " (default: $DRACUT_FIRMWARE_PATH, otherwise kernel-compatible\n"
989
+ " $(</sys/module/firmware_class/parameters/path),\n"
990
+ " /lib/firmware/updates/$(uname -r), /lib/firmware/updates\n"
991
+ " /lib/firmware/$(uname -r), /lib/firmware)\n"
989
992
" --silent Don't display error messages for kernel module install\n"
990
993
" --modalias Only generate module list from /sys/devices modalias list\n"
991
994
" -o --optional If kernel module does not exist, do not fail\n"
@@ -1149,10 +1152,10 @@ static int parse_argv(int argc, char *argv[])
1149
1152
log_set_max_level (arg_loglevel );
1150
1153
}
1151
1154
1155
+ struct utsname buf = {0 };
1152
1156
if (!kerneldir ) {
1153
- struct utsname buf ;
1154
1157
uname (& buf );
1155
- _asprintf (& kerneldir , "%s%s" , " /lib/modules/" , buf .release );
1158
+ _asprintf (& kerneldir , "/lib/modules/%s " , buf .release );
1156
1159
}
1157
1160
1158
1161
if (arg_modalias ) {
@@ -1161,15 +1164,32 @@ static int parse_argv(int argc, char *argv[])
1161
1164
1162
1165
if (arg_module ) {
1163
1166
if (!firmwaredirs ) {
1164
- char * path = NULL ;
1165
-
1166
- path = getenv ("DRACUT_FIRMWARE_PATH" );
1167
+ char * path = getenv ("DRACUT_FIRMWARE_PATH" );
1167
1168
1168
1169
if (path ) {
1169
1170
log_debug ("DRACUT_FIRMWARE_PATH=%s" , path );
1170
1171
firmwaredirs = strv_split (path , ":" );
1171
1172
} else {
1172
- firmwaredirs = strv_new ("/lib/firmware" , NULL );
1173
+ if (!* buf .release )
1174
+ uname (& buf );
1175
+
1176
+ char fw_path_para [PATH_MAX + 1 ] = "" ;
1177
+ int path = open ("/sys/module/firmware_class/parameters/path" , O_RDONLY | O_CLOEXEC );
1178
+ if (path != -1 ) {
1179
+ ssize_t rd = read (path , fw_path_para , PATH_MAX );
1180
+ if (rd != -1 )
1181
+ fw_path_para [rd - 1 ] = '\0' ;
1182
+ close (path );
1183
+ }
1184
+ char uk [22 + sizeof (buf .release )], fk [14 + sizeof (buf .release )];
1185
+ sprintf (uk , "/lib/firmware/updates/%s" , buf .release );
1186
+ sprintf (fk , "/lib/firmware/%s" , buf .release );
1187
+ firmwaredirs = strv_new (STRV_IFNOTNULL (* fw_path_para ? fw_path_para : NULL ),
1188
+ uk ,
1189
+ "/lib/firmware/updates" ,
1190
+ fk ,
1191
+ "/lib/firmware" ,
1192
+ NULL );
1173
1193
}
1174
1194
}
1175
1195
}
0 commit comments