예제 #1
0
파일: fbd.c 프로젝트: Hooman3/minix
/*===========================================================================*
 *				fbd_ioctl				     *
 *===========================================================================*/
static int fbd_ioctl(devminor_t UNUSED(minor), unsigned long request,
	endpoint_t endpt, cp_grant_id_t grant, endpoint_t UNUSED(user_endpt))
{
	/* Handle an I/O control request. */
	cp_grant_id_t gid;
	message m;
	int r;

	/* We only handle the FBD requests, and pass on everything else. */
	switch (request) {
	case FBDCADDRULE:
	case FBDCDELRULE:
	case FBDCGETRULE:
		return rule_ctl(request, endpt, grant);
	}

	assert(grant != GRANT_INVALID);

	gid = cpf_grant_indirect(driver_endpt, endpt, grant);
	assert(gid != GRANT_INVALID);

	memset(&m, 0, sizeof(m));
	m.m_type = BDEV_IOCTL;
	m.m_lbdev_lblockdriver_msg.minor = driver_minor;
	m.m_lbdev_lblockdriver_msg.request = request;
	m.m_lbdev_lblockdriver_msg.grant = gid;
	m.m_lbdev_lblockdriver_msg.user = NONE;
	m.m_lbdev_lblockdriver_msg.id = 0;

	if ((r = ipc_sendrec(driver_endpt, &m)) != OK)
		panic("ipc_sendrec to driver failed (%d)\n", r);

	if (m.m_type != BDEV_REPLY)
		panic("invalid reply from driver (%d)\n", m.m_type);

	cpf_revoke(gid);

	return m.m_lblockdriver_lbdev_reply.status;
}
예제 #2
0
파일: fbd.c 프로젝트: tworaz/minix
/*===========================================================================*
 *				fbd_ioctl				     *
 *===========================================================================*/
static int fbd_ioctl(dev_t UNUSED(minor), unsigned int request,
                     endpoint_t endpt, cp_grant_id_t grant)
{
    /* Handle an I/O control request. */
    cp_grant_id_t gid;
    message m;
    int r;

    /* We only handle the FBD requests, and pass on everything else. */
    switch (request) {
    case FBDCADDRULE:
    case FBDCDELRULE:
    case FBDCGETRULE:
        return rule_ctl(request, endpt, grant);
    }

    assert(grant != GRANT_INVALID);

    gid = cpf_grant_indirect(driver_endpt, endpt, grant);
    assert(gid != GRANT_INVALID);

    memset(&m, 0, sizeof(m));
    m.m_type = BDEV_IOCTL;
    m.BDEV_MINOR = driver_minor;
    m.BDEV_REQUEST = request;
    m.BDEV_GRANT = gid;
    m.BDEV_ID = 0;

    if ((r = sendrec(driver_endpt, &m)) != OK)
        panic("sendrec to driver failed (%d)\n", r);

    if (m.m_type != BDEV_REPLY)
        panic("invalid reply from driver (%d)\n", m.m_type);

    cpf_revoke(gid);

    return m.BDEV_STATUS;
}