X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Ffirmware%2Ffirmware.c;h=36ce79054c2a1c788e700611d9ee3feba087f885;hb=2a30eaa452ad614c1957735fef47a7bc200db9cd;hp=8f70be42ac2660b5e75e0dfa63228e9d5692a645;hpb=6fb1b637d4fc9e94d0c492d8a3049f30db88dd54;p=elogind.git diff --git a/extras/firmware/firmware.c b/extras/firmware/firmware.c index 8f70be42a..36ce79054 100644 --- a/extras/firmware/firmware.c +++ b/extras/firmware/firmware.c @@ -43,7 +43,7 @@ static bool set_loading(struct udev *udev, char *loadpath, const char *state) static bool copy_firmware(struct udev *udev, const char *source, const char *target, size_t size) { char *buf; - FILE *fsource, *ftarget; + FILE *fsource = NULL, *ftarget = NULL; bool ret = false; buf = malloc(size); @@ -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]; @@ -113,8 +112,6 @@ int main(int argc, char **argv) break; case 'h': printf("Usage: firmware --firmware= --devpath= [--help]\n\n"); - default: - rc = 1; goto exit; } } @@ -148,7 +145,8 @@ 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(misspath, sizeof(misspath), udev_get_run_path(udev), "/firmware-missing/", fwencpath, NULL); + util_strscpyl(loadpath, sizeof(loadpath), udev_get_sys_path(udev), devpath, "/loading", NULL); if (fwfile == NULL) { int err; @@ -159,13 +157,12 @@ int main(int argc, char **argv) err = util_create_path(udev, misspath); if (err != 0 && err != -ENOENT) break; - udev_selinux_setfscreatecon(udev, misspath, S_IFLNK); err = symlink(devpath, misspath); if (err != 0) err = -errno; - udev_selinux_resetfscreatecon(udev); } while (err == -ENOENT); rc = 2; + set_loading(udev, loadpath, "-1"); goto exit; } @@ -176,8 +173,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)) {