REAL_FUNCTION_POINTER(readdir);
REAL_FUNCTION_POINTER(readdir64);
REAL_FUNCTION_POINTER(readlink);
+REAL_FUNCTION_POINTER(realpath);
REAL_FUNCTION_POINTER(__xstat);
REAL_FUNCTION_POINTER(__xstat64);
REAL_FUNCTION_POINTER(__fxstat);
static char *render_node_path;
/* renderD* */
static char *render_node_dirent_name;
+/* /sys/dev/char/major:minor/device */
+static char *device_path;
/* /sys/dev/char/major:minor/device/subsystem */
static char *subsystem_path;
int render_node_minor = -1;
GET_FUNCTION_POINTER(readdir);
GET_FUNCTION_POINTER(readdir64);
GET_FUNCTION_POINTER(readlink);
+ GET_FUNCTION_POINTER(realpath);
GET_FUNCTION_POINTER(__xstat);
GET_FUNCTION_POINTER(__xstat64);
GET_FUNCTION_POINTER(__fxstat);
render_node_path);
}
+ asprintf(&device_path,
+ "/sys/dev/char/%d:%d/device",
+ DRM_MAJOR, render_node_minor);
+
asprintf(&subsystem_path,
"/sys/dev/char/%d:%d/device/subsystem",
DRM_MAJOR, render_node_minor);
return strlen(buf) + 1;
}
+/* Handles libdrm's realpath to figure out what kind of device we have. */
+PUBLIC char *
+realpath(const char *path, char *resolved_path)
+{
+ init_shim();
+
+ if (strcmp(path, device_path) != 0)
+ return real_realpath(path, resolved_path);
+
+ strcpy(resolved_path, path);
+
+ return resolved_path;
+}
+
/* Main entrypoint to DRM drivers: the ioctl syscall. We send all ioctls on
* our DRM fd to drm_shim_ioctl().
*/