freebsd_network: Check non-packaged data dir for firmware.

When loading firmware, check the system non-packaged data dir first,
then the system data directory (as before). This allows loading of
firmware that doesn't reside in the system package.
This commit is contained in:
Michael Lotz
2014-10-18 18:48:19 +02:00
parent cd506e763c
commit 8635eef042
+21 -9
View File
@@ -53,6 +53,11 @@ firmware_get(const char* fbsdFirmwareName)
char* firmwarePath = NULL;
const char* haikuFirmwareName = NULL;
ssize_t readCount = 0;
directory_which checkDirs[] = { B_SYSTEM_NONPACKAGED_DATA_DIRECTORY,
B_SYSTEM_DATA_DIRECTORY };
size_t numCheckDirs
= sizeof(checkDirs) / sizeof(checkDirs[0]);
size_t i = 0;
haikuFirmwareName = getHaikuFirmwareName(fbsdFirmwareName,
fbsdFirmwareName);
@@ -61,17 +66,24 @@ firmware_get(const char* fbsdFirmwareName)
if (firmwarePath == NULL)
goto cleanup;
if (find_directory(B_SYSTEM_DATA_DIRECTORY, -1, false,
firmwarePath, B_PATH_NAME_LENGTH) != B_OK)
goto cleanup;
strlcat(firmwarePath, "/firmware/", B_PATH_NAME_LENGTH);
strlcat(firmwarePath, gDriverName, B_PATH_NAME_LENGTH);
strlcat(firmwarePath, "/", B_PATH_NAME_LENGTH);
strlcat(firmwarePath, haikuFirmwareName, B_PATH_NAME_LENGTH);
for (; i < numCheckDirs; i++) {
if (find_directory(checkDirs[i], -1, false, firmwarePath,
B_PATH_NAME_LENGTH) != B_OK) {
continue;
}
fileDescriptor = open(firmwarePath, B_READ_ONLY);
if (fileDescriptor == -1)
strlcat(firmwarePath, "/firmware/", B_PATH_NAME_LENGTH);
strlcat(firmwarePath, gDriverName, B_PATH_NAME_LENGTH);
strlcat(firmwarePath, "/", B_PATH_NAME_LENGTH);
strlcat(firmwarePath, haikuFirmwareName, B_PATH_NAME_LENGTH);
fileDescriptor = open(firmwarePath, B_READ_ONLY);
if (fileDescriptor >= 0)
break;
}
if (fileDescriptor < 0)
goto cleanup;
firmwareFileSize = lseek(fileDescriptor, 0, SEEK_END);