static ssize_t state_write(struct file *filp, const char *source, size_t count, loff_t *ppos) { struct state_dev *dev = filp->private_data; unsigned long flags; unsigned char *temp; if (count > STATE_BLOCK_SIZE || count <= 0) return -EINVAL; copy_from_user_ret(dev->write_buffer, source, count, -EFAULT); if (hijack_force_pause_player) { dev->write_buffer[0x0c] &= ~0x02; } /* Now we've written, switch the buffers and copy */ save_flags_cli(flags); temp = dev->read_buffer; dev->read_buffer = dev->write_buffer; dev->write_buffer = temp; /* Mark as dirty */ dirty=1; restore_flags(flags); memcpy(dev->write_buffer, dev->read_buffer, count); return count; }
ci_noinline int ioctl_resource_prime (ci_private_char_t *priv, ulong arg) { ci_resource_prime_op_t local; copy_from_user_ret(&local, (caddr_t) arg, sizeof(local), -EFAULT); return efch_vi_prime(priv, local.crp_id, local.crp_current_ptr); }
ci_noinline int ioctl_resource_alloc (ci_private_char_t *priv, ulong arg) { int rc; ci_resource_alloc_t local; copy_from_user_ret(&local, (caddr_t) arg, sizeof(local), -EFAULT); rc = efch_resource_alloc(&priv->rt, &local); if( rc < 0 ) return rc; copy_to_user_ret((caddr_t) arg, &local, sizeof(local), -EFAULT); return rc; }
ci_noinline int ioctl_resource_op (ci_private_char_t *priv, ulong arg) { ci_resource_op_t local; int rc, copy_out = 0; copy_from_user_ret(&local, (caddr_t) arg, sizeof(local), -EFAULT); rc = efch_resource_op(&priv->rt, &local, ©_out); if( copy_out ) copy_to_user_ret((caddr_t) arg, &local, sizeof(local), -EFAULT); return rc; }
ci_noinline int ioctl_license_challenge (ci_private_char_t *priv, ulong arg) { struct ci_license_challenge_op_s local; int rc, copy_out = 0; copy_from_user_ret(&local, (caddr_t) arg, sizeof(local), -EFAULT); rc = efch_license_challenge(&priv->rt, &local, ©_out); if( copy_out ) copy_to_user_ret((caddr_t) arg, &local, sizeof(local), -EFAULT); return rc; }