Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
/* 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);
}