xf86drm: implement drmGetMinorNameForFD for non-sysfs

Implement drmGetMinorNameForFD for systems without sysfs by
adapting drm_get_device_name_for_fd() from the Mesa loader.

v2: use type parameter to select dev name instead of always
    using DRM_DEV_NAME

Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
main
Jonathan Gray 2016-12-01 15:18:39 +11:00 committed by Emil Velikov
parent 5c1c91b3d3
commit f189011b36
1 changed files with 34 additions and 1 deletions

View File

@ -2818,7 +2818,40 @@ static char *drmGetMinorNameForFD(int fd, int type)
out_close_dir: out_close_dir:
closedir(sysdir); closedir(sysdir);
#else #else
#warning "Missing implementation of drmGetMinorNameForFD" struct stat sbuf;
char buf[PATH_MAX + 1];
const char *dev_name;
unsigned int maj, min;
int n;
if (fstat(fd, &sbuf))
return NULL;
maj = major(sbuf.st_rdev);
min = minor(sbuf.st_rdev);
if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
return NULL;
switch (type) {
case DRM_NODE_PRIMARY:
dev_name = DRM_DEV_NAME;
break;
case DRM_NODE_CONTROL:
dev_name = DRM_CONTROL_DEV_NAME;
break;
case DRM_NODE_RENDER:
dev_name = DRM_RENDER_DEV_NAME;
break;
default:
return NULL;
};
n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
if (n == -1 || n >= sizeof(buf))
return NULL;
return strdup(buf);
#endif #endif
return NULL; return NULL;
} }