void config_odev_free_attributes(struct OdevAttributes *attribs) { if (attribs->fd != -1) systemd_logind_release_fd(attribs->major, attribs->minor, attribs->fd); free(attribs->path); free(attribs->syspath); free(attribs->busid); free(attribs->driver); free(attribs); }
static Bool doPlatformProbe(struct xf86_platform_device *dev, DriverPtr drvp, GDevPtr gdev, int flags, intptr_t match_data) { Bool foundScreen = FALSE; int entity, fd, major, minor; if (gdev && gdev->screen == 0 && !xf86_check_platform_slot(dev)) return FALSE; entity = xf86ClaimPlatformSlot(dev, drvp, 0, gdev, gdev ? gdev->active : 0); if ((entity == -1) && gdev && (gdev->screen > 0)) { unsigned nent; for (nent = 0; nent < xf86NumEntities; nent++) { EntityPtr pEnt = xf86Entities[nent]; if (pEnt->bus.type != BUS_PLATFORM) continue; if (pEnt->bus.id.plat == dev) { entity = nent; xf86AddDevToEntity(nent, gdev); break; } } } if (entity != -1) { if ((dev->flags & XF86_PDEV_SERVER_FD) && (!drvp->driverFunc || !drvp->driverFunc(NULL, SUPPORTS_SERVER_FDS, NULL))) { fd = xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_FD, -1); major = xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_MAJOR, 0); minor = xf86_get_platform_device_int_attrib(dev, ODEV_ATTRIB_MINOR, 0); systemd_logind_release_fd(major, minor); close(fd); config_odev_add_int_attribute(dev->attribs, ODEV_ATTRIB_FD, -1); dev->flags &= ~XF86_PDEV_SERVER_FD; } if (drvp->platformProbe(drvp, entity, flags, dev, match_data)) foundScreen = TRUE; else xf86UnclaimPlatformSlot(dev, gdev); } return foundScreen; }