chiark / gitweb /
configure.ac: ddd --with-firmware-path option
[elogind.git] / extras / firmware / firmware.c
index 8f70be42ac2660b5e75e0dfa63228e9d5692a645..76593bad3030cdfade41d1021ec5bab3f391a4ae 100644 (file)
@@ -63,8 +63,10 @@ static bool copy_firmware(struct udev *udev, const char *source, const char *tar
        if (fwrite(buf, size, 1, ftarget) == 1)
                ret = true;
 exit:
-       fclose(ftarget);
-       fclose(fsource);
+       if (ftarget != NULL)
+               fclose(ftarget);
+       if (fsource != NULL)
+               fclose(fsource);
        free(buf);
        return ret;
 }
@@ -77,10 +79,7 @@ int main(int argc, char **argv)
                { "help", no_argument, NULL, 'h' },
                {}
        };
-       static const char *searchpath[] = {
-               "/lib/firmware/updates/",
-               "/lib/firmware/"
-       };
+       static const char *searchpath[] = { FIRMWARE_PATH };
        char fwencpath[UTIL_PATH_SIZE];
        char misspath[UTIL_PATH_SIZE];
        char loadpath[UTIL_PATH_SIZE];
@@ -149,6 +148,7 @@ int main(int argc, char **argv)
 
        util_path_encode(firmware, fwencpath, sizeof(fwencpath));
        util_strscpyl(misspath, sizeof(misspath), udev_get_dev_path(udev), "/.udev/firmware-missing/", fwencpath, NULL);
+       util_strscpyl(loadpath, sizeof(loadpath), udev_get_sys_path(udev), devpath, "/loading", NULL);
 
        if (fwfile == NULL) {
                int err;
@@ -166,6 +166,7 @@ int main(int argc, char **argv)
                        udev_selinux_resetfscreatecon(udev);
                } while (err == -ENOENT);
                rc = 2;
+               set_loading(udev, loadpath, "-1");
                goto exit;
        }
 
@@ -176,8 +177,8 @@ int main(int argc, char **argv)
        if (unlink(misspath) == 0)
                util_delete_path(udev, misspath);
 
-       util_strscpyl(loadpath, sizeof(loadpath), udev_get_sys_path(udev), devpath, "/loading", NULL);
-       set_loading(udev, loadpath, "1");
+       if (!set_loading(udev, loadpath, "1"))
+               goto exit;
 
        util_strscpyl(datapath, sizeof(datapath), udev_get_sys_path(udev), devpath, "/data", NULL);
        if (!copy_firmware(udev, fwpath, datapath, statbuf.st_size)) {