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
parent
5c1c91b3d3
commit
f189011b36
35
xf86drm.c
35
xf86drm.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue