chiark / gitweb /
udev: usb_id: parse only 'size' bytes of the 'descriptors' buffer
[elogind.git] / src / udev / udev-builtin-firmware.c
index 69e1db980a10a5ea4d82f0ffc2f22dd91544b571..9cb42946332e96f74dc3dd263243d1d80b73ed71 100644 (file)
@@ -2,7 +2,7 @@
  * firmware - Kernel firmware loader
  *
  * Copyright (C) 2009 Piter Punk <piterpunk@slackware.com>
- * Copyright (C) 2009-2011 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2009-2011 Kay Sievers <kay@vrfy.org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -100,20 +100,20 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo
         /* lookup firmware file */
         uname(&kernel);
         for (i = 0; i < ELEMENTSOF(searchpath); i++) {
-                util_strscpyl(fwpath, sizeof(fwpath), searchpath[i], kernel.release, "/", firmware, NULL);
+                strscpyl(fwpath, sizeof(fwpath), searchpath[i], kernel.release, "/", firmware, NULL);
                 fwfile = fopen(fwpath, "re");
                 if (fwfile != NULL)
                         break;
 
-                util_strscpyl(fwpath, sizeof(fwpath), searchpath[i], firmware, NULL);
+                strscpyl(fwpath, sizeof(fwpath), searchpath[i], firmware, NULL);
                 fwfile = fopen(fwpath, "re");
                 if (fwfile != NULL)
                         break;
         }
 
         util_path_encode(firmware, fwencpath, sizeof(fwencpath));
-        util_strscpyl(misspath, sizeof(misspath), "/run/udev/firmware-missing/", fwencpath, NULL);
-        util_strscpyl(loadpath, sizeof(loadpath), udev_device_get_syspath(dev), "/loading", NULL);
+        strscpyl(misspath, sizeof(misspath), "/run/udev/firmware-missing/", fwencpath, NULL);
+        strscpyl(loadpath, sizeof(loadpath), udev_device_get_syspath(dev), "/loading", NULL);
 
         if (fwfile == NULL) {
                 int err;
@@ -121,7 +121,7 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo
                 /* This link indicates the missing firmware file and the associated device */
                 log_debug("did not find firmware file '%s'\n", firmware);
                 do {
-                        err = mkdir_parents_label(misspath, 0755);
+                        err = mkdir_parents(misspath, 0755);
                         if (err != 0 && err != -ENOENT)
                                 break;
                         err = symlink(udev_device_get_devpath(dev), misspath);
@@ -129,21 +129,30 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo
                                 err = -errno;
                 } while (err == -ENOENT);
                 rc = EXIT_FAILURE;
-                set_loading(udev, loadpath, "-1");
+                /*
+                 * Do not cancel the request in the initrd, the real root might have
+                 * the firmware file and the 'coldplug' run in the real root will find
+                 * this pending request and fulfill or cancel it.
+                 * */
+                if (!in_initrd())
+                        set_loading(udev, loadpath, "-1");
                 goto exit;
         }
 
         if (stat(fwpath, &statbuf) < 0 || statbuf.st_size == 0) {
+                if (!in_initrd())
+                        set_loading(udev, loadpath, "-1");
                 rc = EXIT_FAILURE;
                 goto exit;
         }
+
         if (unlink(misspath) == 0)
                 util_delete_path(udev, misspath);
 
         if (!set_loading(udev, loadpath, "1"))
                 goto exit;
 
-        util_strscpyl(datapath, sizeof(datapath), udev_device_get_syspath(dev), "/data", NULL);
+        strscpyl(datapath, sizeof(datapath), udev_device_get_syspath(dev), "/data", NULL);
         if (!copy_firmware(udev, fwpath, datapath, statbuf.st_size)) {
                 log_error("error sending firmware '%s' to device\n", firmware);
                 set_loading(udev, loadpath, "-1");