int ioctl(int fd, unsigned long int request, ...) { if (!orig_ioctl) preload_init(); int ret = 0; va_list argp; va_start(argp, request); void* data = va_arg(argp, void*); if (fd == tty0fd) { TRACE("ioctl tty0 %d %lx %p\n", fd, request, data); if (request == VT_OPENQRY) { TRACE("OPEN\n"); *(int*)data = 7; } ret = 0; } else if (fd == tty7fd) { TRACE("ioctl tty7 %d %lx %p\n", fd, request, data); if (request == VT_GETSTATE) { TRACE("STATE\n"); struct vt_stat* stat = data; stat->v_active = 0; } if ((request == VT_RELDISP && (long)data == 1) || (request == VT_ACTIVATE && (long)data == 0)) { if (lockfd != -1) { TRACE("Telling Chromium OS to regain control\n"); ret = FREON_DBUS_METHOD_CALL(TakeDisplayOwnership); if (set_display_lock(0) < 0) { ERROR("Failed to release display lock\n"); } } } else if ((request == VT_RELDISP && (long)data == 2) || (request == VT_ACTIVATE && (long)data == 7)) { if (set_display_lock(getpid()) == 0) { TRACE("Telling Chromium OS to drop control\n"); ret = FREON_DBUS_METHOD_CALL(ReleaseDisplayOwnership); } else { ERROR("Unable to claim display lock\n"); ret = -1; } drm_disable_cursor(); } else { ret = 0; } } else { if (request == EVIOCGRAB) { TRACE("ioctl GRAB %d %lx %p\n", fd, request, data); /* Driver requested a grab: assume we have it already and report * success */ ret = 0; } else { ret = orig_ioctl(fd, request, data); } } va_end(argp); return ret; }
int open64(const char *pathname, int flags, ...) { if (!orig_open64) preload_init(); va_list argp; va_start(argp, flags); mode_t mode = va_arg(argp, mode_t); va_end(argp); return _open(orig_open64, "open64", pathname, flags, mode); }
int close(int fd) { if (!orig_close) preload_init(); TRACE("close %d\n", fd); if (fd == tty0fd) { tty0fd = -1; } else if (fd == tty7fd) { tty7fd = -1; } return orig_close(fd); }
/* Prevents some glitch if Chromium OS keeps cursor enabled (#2878). */ static void drm_disable_cursor() { int i, fd; drmModeRes* resources; if (!orig_open) preload_init(); fd = orig_open("/dev/dri/card0", O_RDWR, 0); TRACE("%s %d\n", __func__, fd); if (fd < 0) return; resources = drmModeGetResources(fd); if (!resources) goto closefd; TRACE("%s res=%p\n", __func__, resources); for (i = 0; i < resources->count_crtcs; i++) { drmModeCrtc* crtc; crtc = drmModeGetCrtc(fd, resources->crtcs[i]); TRACE("%s crtc %d %p\n", __func__, i, crtc); if (crtc) { drmModeSetCursor(fd, crtc->crtc_id, 0, 0, 0); drmModeFreeCrtc(crtc); } } drmModeFreeResources(resources); closefd: orig_close(fd); }