Enscript Output

extractedLnx/linux/arch/sparc64/kernel/ioctl32.c_fd_ioctl_trans.c

static int fd_ioctl_trans(unsigned int fd, unsigned int cmd, u32 arg)
{
	mm_segment_t old_fs = get_fs();
	void *karg;
	unsigned int kcmd = 0;
	int i, err;

	for (i = 0; i < NR_FD_IOCTL_TRANS; i++)
		if (cmd == fd_ioctl_trans_table[i].cmd32) {
			kcmd = fd_ioctl_trans_table[i].cmd;
			break;
		}
	if (!kcmd)
		return -EINVAL;

	switch (cmd) {
		case FDSETPRM32:
		case FDDEFPRM32:
		case FDGETPRM32:
		{
			struct floppy_struct *f;

			f = karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_struct));
			if (!karg)
				return -ENOMEM;
			if (cmd == FDGETPRM32)
				break;
			if (__get_user(f->size, &((struct floppy_struct32 *)A(arg))->size) ||
			    __get_user(f->sect, &((struct floppy_struct32 *)A(arg))->sect) ||
			    __get_user(f->head, &((struct floppy_struct32 *)A(arg))->head) ||
			    __get_user(f->track, &((struct floppy_struct32 *)A(arg))->track) ||
			    __get_user(f->stretch, &((struct floppy_struct32 *)A(arg))->stretch) ||
			    __get_user(f->gap, &((struct floppy_struct32 *)A(arg))->gap) ||
			    __get_user(f->rate, &((struct floppy_struct32 *)A(arg))->rate) ||
			    __get_user(f->spec1, &((struct floppy_struct32 *)A(arg))->spec1) ||
			    __get_user(f->fmt_gap, &((struct floppy_struct32 *)A(arg))->fmt_gap) ||
			    __get_user((u64)f->name, &((struct floppy_struct32 *)A(arg))->name)) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		case FDSETDRVPRM32:
		case FDGETDRVPRM32:
		{
			struct floppy_drive_params *f;

			f = karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_drive_params));
			if (!karg)
				return -ENOMEM;
			if (cmd == FDGETDRVPRM32)
				break;
			if (__get_user(f->cmos, &((struct floppy_drive_params32 *)A(arg))->cmos) ||
			    __get_user(f->max_dtr, &((struct floppy_drive_params32 *)A(arg))->max_dtr) ||
			    __get_user(f->hlt, &((struct floppy_drive_params32 *)A(arg))->hlt) ||
			    __get_user(f->hut, &((struct floppy_drive_params32 *)A(arg))->hut) ||
			    __get_user(f->srt, &((struct floppy_drive_params32 *)A(arg))->srt) ||
			    __get_user(f->spinup, &((struct floppy_drive_params32 *)A(arg))->spinup) ||
			    __get_user(f->spindown, &((struct floppy_drive_params32 *)A(arg))->spindown) ||
			    __get_user(f->spindown_offset, &((struct floppy_drive_params32 *)A(arg))->spindown_offset) ||
			    __get_user(f->select_delay, &((struct floppy_drive_params32 *)A(arg))->select_delay) ||
			    __get_user(f->rps, &((struct floppy_drive_params32 *)A(arg))->rps) ||
			    __get_user(f->tracks, &((struct floppy_drive_params32 *)A(arg))->tracks) ||
			    __get_user(f->timeout, &((struct floppy_drive_params32 *)A(arg))->timeout) ||
			    __get_user(f->interleave_sect, &((struct floppy_drive_params32 *)A(arg))->interleave_sect) ||
			    __copy_from_user(&f->max_errors, &((struct floppy_drive_params32 *)A(arg))->max_errors, sizeof(f->max_errors)) ||
			    __get_user(f->flags, &((struct floppy_drive_params32 *)A(arg))->flags) ||
			    __get_user(f->read_track, &((struct floppy_drive_params32 *)A(arg))->read_track) ||
			    __copy_from_user(f->autodetect, ((struct floppy_drive_params32 *)A(arg))->autodetect, sizeof(f->autodetect)) ||
			    __get_user(f->checkfreq, &((struct floppy_drive_params32 *)A(arg))->checkfreq) ||
			    __get_user(f->native_format, &((struct floppy_drive_params32 *)A(arg))->native_format)) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		case FDGETDRVSTAT32:
		case FDPOLLDRVSTAT32:
			karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_drive_struct));
			if (!karg)
				return -ENOMEM;
			break;
		case FDGETFDCSTAT32:
			karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_fdc_state));
			if (!karg)
				return -ENOMEM;
			break;
		case FDWERRORGET32:
			karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_write_errors));
			if (!karg)
				return -ENOMEM;
			break;
		default:
			return -EINVAL;
	}
	set_fs (KERNEL_DS);
	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
	set_fs (old_fs);
	if (err) {
		kfree(karg);
		return err;
	}
	switch (cmd) {
		case FDGETPRM32:
		{
			struct floppy_struct *f = karg;

			if (__put_user(f->size, &((struct floppy_struct32 *)A(arg))->size) ||
			    __put_user(f->sect, &((struct floppy_struct32 *)A(arg))->sect) ||
			    __put_user(f->head, &((struct floppy_struct32 *)A(arg))->head) ||
			    __put_user(f->track, &((struct floppy_struct32 *)A(arg))->track) ||
			    __put_user(f->stretch, &((struct floppy_struct32 *)A(arg))->stretch) ||
			    __put_user(f->gap, &((struct floppy_struct32 *)A(arg))->gap) ||
			    __put_user(f->rate, &((struct floppy_struct32 *)A(arg))->rate) ||
			    __put_user(f->spec1, &((struct floppy_struct32 *)A(arg))->spec1) ||
			    __put_user(f->fmt_gap, &((struct floppy_struct32 *)A(arg))->fmt_gap) ||
			    __put_user((u64)f->name, &((struct floppy_struct32 *)A(arg))->name)) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		case FDGETDRVPRM32:
		{
			struct floppy_drive_params *f = karg;

			if (__put_user(f->cmos, &((struct floppy_drive_params32 *)A(arg))->cmos) ||
			    __put_user(f->max_dtr, &((struct floppy_drive_params32 *)A(arg))->max_dtr) ||
			    __put_user(f->hlt, &((struct floppy_drive_params32 *)A(arg))->hlt) ||
			    __put_user(f->hut, &((struct floppy_drive_params32 *)A(arg))->hut) ||
			    __put_user(f->srt, &((struct floppy_drive_params32 *)A(arg))->srt) ||
			    __put_user(f->spinup, &((struct floppy_drive_params32 *)A(arg))->spinup) ||
			    __put_user(f->spindown, &((struct floppy_drive_params32 *)A(arg))->spindown) ||
			    __put_user(f->spindown_offset, &((struct floppy_drive_params32 *)A(arg))->spindown_offset) ||
			    __put_user(f->select_delay, &((struct floppy_drive_params32 *)A(arg))->select_delay) ||
			    __put_user(f->rps, &((struct floppy_drive_params32 *)A(arg))->rps) ||
			    __put_user(f->tracks, &((struct floppy_drive_params32 *)A(arg))->tracks) ||
			    __put_user(f->timeout, &((struct floppy_drive_params32 *)A(arg))->timeout) ||
			    __put_user(f->interleave_sect, &((struct floppy_drive_params32 *)A(arg))->interleave_sect) ||
			    __copy_to_user(&((struct floppy_drive_params32 *)A(arg))->max_errors, &f->max_errors, sizeof(f->max_errors)) ||
			    __put_user(f->flags, &((struct floppy_drive_params32 *)A(arg))->flags) ||
			    __put_user(f->read_track, &((struct floppy_drive_params32 *)A(arg))->read_track) ||
			    __copy_to_user(((struct floppy_drive_params32 *)A(arg))->autodetect, f->autodetect, sizeof(f->autodetect)) ||
			    __put_user(f->checkfreq, &((struct floppy_drive_params32 *)A(arg))->checkfreq) ||
			    __put_user(f->native_format, &((struct floppy_drive_params32 *)A(arg))->native_format)) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		case FDGETDRVSTAT32:
		case FDPOLLDRVSTAT32:
		{
			struct floppy_drive_struct *f = karg;

			if (__put_user(f->flags, &((struct floppy_drive_struct32 *)A(arg))->flags) ||
			    __put_user(f->spinup_date, &((struct floppy_drive_struct32 *)A(arg))->spinup_date) ||
			    __put_user(f->select_date, &((struct floppy_drive_struct32 *)A(arg))->select_date) ||
			    __put_user(f->first_read_date, &((struct floppy_drive_struct32 *)A(arg))->first_read_date) ||
			    __put_user(f->probed_format, &((struct floppy_drive_struct32 *)A(arg))->probed_format) ||
			    __put_user(f->track, &((struct floppy_drive_struct32 *)A(arg))->track) ||
			    __put_user(f->maxblock, &((struct floppy_drive_struct32 *)A(arg))->maxblock) ||
			    __put_user(f->maxtrack, &((struct floppy_drive_struct32 *)A(arg))->maxtrack) ||
			    __put_user(f->generation, &((struct floppy_drive_struct32 *)A(arg))->generation) ||
			    __put_user(f->keep_data, &((struct floppy_drive_struct32 *)A(arg))->keep_data) ||
			    __put_user(f->fd_ref, &((struct floppy_drive_struct32 *)A(arg))->fd_ref) ||
			    __put_user(f->fd_device, &((struct floppy_drive_struct32 *)A(arg))->fd_device) ||
			    __put_user(f->last_checked, &((struct floppy_drive_struct32 *)A(arg))->last_checked) ||
			    __put_user((u64)f->dmabuf, &((struct floppy_drive_struct32 *)A(arg))->dmabuf) ||
			    __put_user((u64)f->bufblocks, &((struct floppy_drive_struct32 *)A(arg))->bufblocks)) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		case FDGETFDCSTAT32:
		{
			struct floppy_fdc_state *f = karg;

			if (__put_user(f->spec1, &((struct floppy_fdc_state32 *)A(arg))->spec1) ||
			    __put_user(f->spec2, &((struct floppy_fdc_state32 *)A(arg))->spec2) ||
			    __put_user(f->dtr, &((struct floppy_fdc_state32 *)A(arg))->dtr) ||
			    __put_user(f->version, &((struct floppy_fdc_state32 *)A(arg))->version) ||
			    __put_user(f->dor, &((struct floppy_fdc_state32 *)A(arg))->dor) ||
			    __put_user(f->address, &((struct floppy_fdc_state32 *)A(arg))->address) ||
			    __copy_to_user((char *)&((struct floppy_fdc_state32 *)A(arg))->address
			    		   + sizeof(((struct floppy_fdc_state32 *)A(arg))->address),
					   (char *)&f->address + sizeof(f->address), sizeof(int)) ||
			    __put_user(f->driver_version, &((struct floppy_fdc_state32 *)A(arg))->driver_version) ||
			    __copy_to_user(((struct floppy_fdc_state32 *)A(arg))->track, f->track, sizeof(f->track))) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		case FDWERRORGET32:
		{
			struct floppy_write_errors *f = karg;

			if (__put_user(f->write_errors, &((struct floppy_write_errors32 *)A(arg))->write_errors) ||
			    __put_user(f->first_error_sector, &((struct floppy_write_errors32 *)A(arg))->first_error_sector) ||
			    __put_user(f->first_error_generation, &((struct floppy_write_errors32 *)A(arg))->first_error_generation) ||
			    __put_user(f->last_error_sector, &((struct floppy_write_errors32 *)A(arg))->last_error_sector) ||
			    __put_user(f->last_error_generation, &((struct floppy_write_errors32 *)A(arg))->last_error_generation) ||
			    __put_user(f->badness, &((struct floppy_write_errors32 *)A(arg))->badness)) {
				kfree(karg);
				return -EFAULT;
			}
			break;
		}
		default:
			break;
	}
	kfree(karg);
	return 0;
}

Generated by GNU enscript 1.6.4.