drm: simplify device open

libdrm's open functions are just wrappers around open(), and our
detection of which parameter to pass to drmOpen() is not 100%
reliable.

Simplify the code and just call open() directly.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=71590
This commit is contained in:
Daniel Drake 2013-11-25 11:38:37 -06:00 committed by Ray Strode
parent 37d2e400d2
commit 10e0810976

View file

@ -399,42 +399,6 @@ destroy_backend (ply_renderer_backend_t *backend)
free (backend);
}
static char *
find_driver_for_device (const char *device_name)
{
char *driver;
int major_number, minor_number;
struct stat file_attributes;
char *device_path;
char device_link_path[PATH_MAX + 1] = "";
if (stat (device_name, &file_attributes) < 0)
return NULL;
if (!S_ISCHR (file_attributes.st_mode))
return NULL;
major_number = major (file_attributes.st_rdev);
minor_number = minor (file_attributes.st_rdev);
asprintf (&device_path, "/sys/dev/char/%d:%d/device/driver",
major_number, minor_number);
if (readlink (device_path, device_link_path, sizeof (device_link_path) - 1) < 0)
{
free (device_path);
return NULL;
}
free (device_path);
driver = strrchr (device_link_path, '/');
if (driver == NULL)
return NULL;
return strdup (driver + strlen ("/"));
}
static void
activate (ply_renderer_backend_t *backend)
{
@ -495,25 +459,20 @@ on_active_vt_changed (ply_renderer_backend_t *backend)
static bool
load_driver (ply_renderer_backend_t *backend)
{
char *driver_name;
int device_fd;
driver_name = find_driver_for_device (backend->device_name);
ply_trace ("Attempting to load driver '%s'", driver_name);
device_fd = drmOpen (driver_name, NULL);
ply_trace ("Opening '%s'", backend->device_name);
device_fd = open (backend->device_name, O_RDWR);
if (device_fd < 0)
{
ply_trace ("drmOpen failed");
free (driver_name);
ply_trace ("open failed: %m");
return false;
}
backend->driver_interface = ply_renderer_generic_driver_get_interface (device_fd);
backend->driver_supports_mapping_console = false;
free (driver_name);
if (backend->driver_interface == NULL)
{
close (device_fd);