⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioctl32.c

📁 linux-2.4.29操作系统的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			err |= __get_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);			err |= __get_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);			err |= __copy_from_user(&f->max_errors, &((struct floppy_drive_params32 *)arg)->max_errors, sizeof(f->max_errors));			err |= __get_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);			err |= __get_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);			err |= __copy_from_user(f->autodetect, ((struct floppy_drive_params32 *)arg)->autodetect, sizeof(f->autodetect));			err |= __get_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);			err |= __get_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);			if (err) {				err = -EFAULT;				goto out;			}			break;		}		case FDGETDRVSTAT32:		case FDPOLLDRVSTAT32:			karg = kmalloc(sizeof(struct floppy_drive_struct), GFP_KERNEL);			if (!karg)				return -ENOMEM;			break;		case FDGETFDCSTAT32:			karg = kmalloc(sizeof(struct floppy_fdc_state), GFP_KERNEL);			if (!karg)				return -ENOMEM;			break;		case FDWERRORGET32:			karg = kmalloc(sizeof(struct floppy_write_errors), GFP_KERNEL);			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)		goto out;	switch (cmd) {		case FDGETPRM32:		{			struct floppy_struct *f = karg;			err = __put_user(f->size, &((struct floppy_struct32 *)arg)->size);			err |= __put_user(f->sect, &((struct floppy_struct32 *)arg)->sect);			err |= __put_user(f->head, &((struct floppy_struct32 *)arg)->head);			err |= __put_user(f->track, &((struct floppy_struct32 *)arg)->track);			err |= __put_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);			err |= __put_user(f->gap, &((struct floppy_struct32 *)arg)->gap);			err |= __put_user(f->rate, &((struct floppy_struct32 *)arg)->rate);			err |= __put_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);			err |= __put_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);			err |= __put_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);			break;		}		case FDGETDRVPRM32:		{			struct floppy_drive_params *f = karg;			err = __put_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);			err |= __put_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);			err |= __put_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);			err |= __put_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);			err |= __put_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);			err |= __put_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);			err |= __put_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);			err |= __put_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);			err |= __put_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);			err |= __put_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);			err |= __put_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);			err |= __put_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);			err |= __put_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);			err |= __copy_to_user(&((struct floppy_drive_params32 *)arg)->max_errors, &f->max_errors, sizeof(f->max_errors));			err |= __put_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);			err |= __put_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);			err |= __copy_to_user(((struct floppy_drive_params32 *)arg)->autodetect, f->autodetect, sizeof(f->autodetect));			err |= __put_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);			err |= __put_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);			break;		}		case FDGETDRVSTAT32:		case FDPOLLDRVSTAT32:		{			struct floppy_drive_struct *f = karg;			err = __put_user(f->flags, &((struct floppy_drive_struct32 *)arg)->flags);			err |= __put_user(f->spinup_date, &((struct floppy_drive_struct32 *)arg)->spinup_date);			err |= __put_user(f->select_date, &((struct floppy_drive_struct32 *)arg)->select_date);			err |= __put_user(f->first_read_date, &((struct floppy_drive_struct32 *)arg)->first_read_date);			err |= __put_user(f->probed_format, &((struct floppy_drive_struct32 *)arg)->probed_format);			err |= __put_user(f->track, &((struct floppy_drive_struct32 *)arg)->track);			err |= __put_user(f->maxblock, &((struct floppy_drive_struct32 *)arg)->maxblock);			err |= __put_user(f->maxtrack, &((struct floppy_drive_struct32 *)arg)->maxtrack);			err |= __put_user(f->generation, &((struct floppy_drive_struct32 *)arg)->generation);			err |= __put_user(f->keep_data, &((struct floppy_drive_struct32 *)arg)->keep_data);			err |= __put_user(f->fd_ref, &((struct floppy_drive_struct32 *)arg)->fd_ref);			err |= __put_user(f->fd_device, &((struct floppy_drive_struct32 *)arg)->fd_device);			err |= __put_user(f->last_checked, &((struct floppy_drive_struct32 *)arg)->last_checked);			err |= __put_user((u64)f->dmabuf, &((struct floppy_drive_struct32 *)arg)->dmabuf);			err |= __put_user((u64)f->bufblocks, &((struct floppy_drive_struct32 *)arg)->bufblocks);			break;		}		case FDGETFDCSTAT32:		{			struct floppy_fdc_state *f = karg;			err = __put_user(f->spec1, &((struct floppy_fdc_state32 *)arg)->spec1);			err |= __put_user(f->spec2, &((struct floppy_fdc_state32 *)arg)->spec2);			err |= __put_user(f->dtr, &((struct floppy_fdc_state32 *)arg)->dtr);			err |= __put_user(f->version, &((struct floppy_fdc_state32 *)arg)->version);			err |= __put_user(f->dor, &((struct floppy_fdc_state32 *)arg)->dor);			err |= __put_user(f->address, &((struct floppy_fdc_state32 *)arg)->address);			err |= __copy_to_user((char *)&((struct floppy_fdc_state32 *)arg)->address			    		   + sizeof(((struct floppy_fdc_state32 *)arg)->address),					   (char *)&f->address + sizeof(f->address), sizeof(int));			err |= __put_user(f->driver_version, &((struct floppy_fdc_state32 *)arg)->driver_version);			err |= __copy_to_user(((struct floppy_fdc_state32 *)arg)->track, f->track, sizeof(f->track));			break;		}		case FDWERRORGET32:		{			struct floppy_write_errors *f = karg;			err = __put_user(f->write_errors, &((struct floppy_write_errors32 *)arg)->write_errors);			err |= __put_user(f->first_error_sector, &((struct floppy_write_errors32 *)arg)->first_error_sector);			err |= __put_user(f->first_error_generation, &((struct floppy_write_errors32 *)arg)->first_error_generation);			err |= __put_user(f->last_error_sector, &((struct floppy_write_errors32 *)arg)->last_error_sector);			err |= __put_user(f->last_error_generation, &((struct floppy_write_errors32 *)arg)->last_error_generation);			err |= __put_user(f->badness, &((struct floppy_write_errors32 *)arg)->badness);			break;		}		default:			break;	}	if (err)		err = -EFAULT;out:	if (karg) kfree(karg);	return err;}struct ppp_option_data32 {	__kernel_caddr_t32	ptr;	__u32			length;	int			transmit;};#define PPPIOCSCOMPRESS32	_IOW('t', 77, struct ppp_option_data32)struct ppp_idle32 {	__kernel_time_t32 xmit_idle;	__kernel_time_t32 recv_idle;};#define PPPIOCGIDLE32		_IOR('t', 63, struct ppp_idle32)static int ppp_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg){	mm_segment_t old_fs = get_fs();	struct ppp_option_data32 data32;	struct ppp_option_data data;	struct ppp_idle32 idle32;	struct ppp_idle idle;	unsigned int kcmd;	void *karg;	int err = 0;	switch (cmd) {	case PPPIOCGIDLE32:		kcmd = PPPIOCGIDLE;		karg = &idle;		break;	case PPPIOCSCOMPRESS32:		if (copy_from_user(&data32, (struct ppp_option_data32 *)arg, sizeof(struct ppp_option_data32)))			return -EFAULT;		data.ptr = kmalloc (data32.length, GFP_KERNEL);		if (!data.ptr)			return -ENOMEM;		if (copy_from_user(data.ptr, (__u8 *)A(data32.ptr), data32.length)) {			kfree(data.ptr);			return -EFAULT;		}		data.length = data32.length;		data.transmit = data32.transmit;		kcmd = PPPIOCSCOMPRESS;		karg = &data;		break;	default:		do {			static int count = 0;			if (++count <= 20)				printk(KERN_WARNING					"ppp_ioctl: Unknown cmd fd(%d) "					"cmd(%08x) arg(%08x)\n",					(int)fd, (unsigned int)cmd, (unsigned int)arg);		} while(0);		return -EINVAL;	}	set_fs (KERNEL_DS);	err = sys_ioctl (fd, kcmd, (unsigned long)karg);	set_fs (old_fs);	switch (cmd) {	case PPPIOCGIDLE32:		if (err)			return err;		idle32.xmit_idle = idle.xmit_idle;		idle32.recv_idle = idle.recv_idle;		if (copy_to_user((struct ppp_idle32 *)arg, &idle32, sizeof(struct ppp_idle32)))			return -EFAULT;		break;	case PPPIOCSCOMPRESS32:		kfree(data.ptr);		break;	default:		break;	}	return err;}struct mtget32 {	__u32	mt_type;	__u32	mt_resid;	__u32	mt_dsreg;	__u32	mt_gstat;	__u32	mt_erreg;	__kernel_daddr_t32	mt_fileno;	__kernel_daddr_t32	mt_blkno;};#define MTIOCGET32	_IOR('m', 2, struct mtget32)struct mtpos32 {	__u32	mt_blkno;};#define MTIOCPOS32	_IOR('m', 3, struct mtpos32)struct mtconfiginfo32 {	__u32	mt_type;	__u32	ifc_type;	__u16	irqnr;	__u16	dmanr;	__u16	port;	__u32	debug;	__u32	have_dens:1;	__u32	have_bsf:1;	__u32	have_fsr:1;	__u32	have_bsr:1;	__u32	have_eod:1;	__u32	have_seek:1;	__u32	have_tell:1;	__u32	have_ras1:1;	__u32	have_ras2:1;	__u32	have_ras3:1;	__u32	have_qfa:1;	__u32	pad1:5;	char	reserved[10];};#define	MTIOCGETCONFIG32	_IOR('m', 4, struct mtconfiginfo32)#define	MTIOCSETCONFIG32	_IOW('m', 5, struct mtconfiginfo32)static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg){	mm_segment_t old_fs = get_fs();	struct mtconfiginfo info;	struct mtget get;	struct mtpos pos;	unsigned long kcmd;	void *karg;	int err = 0;	switch(cmd) {	case MTIOCPOS32:		kcmd = MTIOCPOS;		karg = &pos;		break;	case MTIOCGET32:		kcmd = MTIOCGET;		karg = &get;		break;	case MTIOCGETCONFIG32:		kcmd = MTIOCGETCONFIG;		karg = &info;		break;	case MTIOCSETCONFIG32:		kcmd = MTIOCSETCONFIG;		karg = &info;		err = __get_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);		err |= __get_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);		err |= __get_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);		err |= __get_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);		err |= __get_user(info.port, &((struct mtconfiginfo32 *)arg)->port);		err |= __get_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);		err |= __copy_from_user((char *)&info.debug + sizeof(info.debug),				     (char *)&((struct mtconfiginfo32 *)arg)->debug				     + sizeof(((struct mtconfiginfo32 *)arg)->debug), sizeof(__u32));		if (err)			return -EFAULT;		break;	default:		do {			static int count = 0;			if (++count <= 20)				printk(KERN_WARNING					"mt_ioctl: Unknown cmd fd(%d) "					"cmd(%08x) arg(%08x)\n",					(int)fd, (unsigned int)cmd, (unsigned int)arg);		} while(0);		return -EINVAL;	}	set_fs (KERNEL_DS);	err = sys_ioctl (fd, kcmd, (unsigned long)karg);	set_fs (old_fs);	if (err)		return err;	switch (cmd) {	case MTIOCPOS32:		err = __put_user(pos.mt_blkno, &((struct mtpos32 *)arg)->mt_blkno);		break;	case MTIOCGET32:		err = __put_user(get.mt_type, &((struct mtget32 *)arg)->mt_type);		err |= __put_user(get.mt_resid, &((struct mtget32 *)arg)->mt_resid);		err |= __put_user(get.mt_dsreg, &((struct mtget32 *)arg)->mt_dsreg);		err |= __put_user(get.mt_gstat, &((struct mtget32 *)arg)->mt_gstat);		err |= __put_user(get.mt_erreg, &((struct mtget32 *)arg)->mt_erreg);		err |= __put_user(get.mt_fileno, &((struct mtget32 *)arg)->mt_fileno);		err |= __put_user(get.mt_blkno, &((struct mtget32 *)arg)->mt_blkno);		break;	case MTIOCGETCONFIG32:		err = __put_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);		err |= __put_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);		err |= __put_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);		err |= __put_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);		err |= __put_user(info.port, &((struct mtconfiginfo32 *)arg)->port);		err |= __put_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);		err |= __copy_to_user((char *)&((struct mtconfiginfo32 *)arg)->debug			    		   + sizeof(((struct mtconfiginfo32 *)arg)->debug),					   (char *)&info.debug + sizeof(info.debug), sizeof(__u32));		break;	case MTIOCSETCONFIG32:		break;	}	return err ? -EFAULT: 0;}struct cdrom_read32 {	int			cdread_lba;	__kernel_caddr_t32	cdread_bufaddr;	int			cdread_buflen;};struct cdrom_read_audio32 {	union cdrom_addr	addr;	u_char			addr_format;	int			nframes;	__kernel_caddr_t32	buf;};struct cdrom_generic_command32 {	unsigned char		cmd[CDROM_PACKET_SIZE];	__kernel_caddr_t32	buffer;	unsigned int		buflen;	int			stat;	__kernel_caddr_t32	sense;	__kernel_caddr_t32	reserved[3];};static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg){	mm_segment_t old_fs = get_fs();	struct cdrom_read cdread;	struct cdrom_read_audio cdreadaudio;	struct cdrom_generic_command cgc;	__kernel_caddr_t32 addr;	char *data = 0;	void *karg;	int err = 0;	switch(cmd) {	case CDROMREADMODE2:	case CDROMREADMODE1:	case CDROMREADRAW:	case CDROMREADCOOKED:		karg = &cdread;		err = __get_user(cdread.cdread_lba, &((struct cdrom_read32 *)arg)->cdread_lba);		err |= __get_user(addr, &((struct cdrom_read32 *)arg)->cdread_bufaddr);		err |= __get_user(cdread.cdread_buflen, &((struct cdrom_read32 *)arg)->cdread_buflen);		if (err)			return -EFAULT;		data = kmalloc(cdread.cdread_buflen, GFP_KERNEL);		if (!data)			return -ENOMEM;		cdread.cdread_bufaddr = data;		break;	case CDROMREADAUDIO:		karg = &cdreadaudio;		err = copy_from_user(&cdreadaudio.addr, &((struct cdrom_read_audio32 *)arg)->addr, sizeof(cdreadaudio.addr));		err |= __get_user(cdreadaudio.addr_format, &((struct cdrom_read_audio32 *)arg)->addr_format);		err |= __get_user(cdreadaudio.nframes, &((struct cdrom_read_audio32 *)arg)->nframes); 		err |= __get_user(addr, &((struct cdrom_read_audio32 *)arg)->buf);		if (err)			return -EFAULT;		data = kmalloc(cdreadaudio.nframes * 2352, GFP_KERNEL);		if (!data)			return -ENOMEM;		cdreadaudio.buf = data;		break;	case CDROM_SEND_PACKET:		karg = &cgc;		err = copy_from_user(cgc.cmd, &((struct cdrom_generic_command32 *)arg)->cmd, sizeof(cgc.cmd));		err |= __get_user(addr, &((struct cdrom_generic_command32 *)arg)->buffer);		err |= __get_user(cgc.buflen, &((struct cdrom_generic_command32 *)arg)->buflen);		if (err)			return -EFAULT;		if ((data = kmalloc(cgc.buflen, GFP_KERNEL)) == NULL)			return -ENOMEM;		cgc.buffer = data;		break;	default:		do {			static int count = 0;			if (++count <= 20)				printk(KERN_WARNING					"cdrom_ioctl: Unknown cmd fd(%d) "					"cmd(%08x) arg(%08x)\n",					(int)fd, (unsigned int)cmd, (unsigned int)arg);		} while(0);		return -EINVAL;	}	set_fs (KERNEL_DS);	err = sys_ioctl (fd, cmd, (unsigned long)karg);	set_fs (old_fs);	if (err)		goto out;	switch (cmd) {	case CDROMREADMODE2:	case CDROMREADMODE1:	case CDROMREADRAW:	case CDROMREADCOOKED:		err = copy_to_user((char *)A(addr), data, cdread.cdread_buflen);		break;	case CDROMREADAUDIO:		err = copy_to_user((char *)A(addr), data, cdreadaudio.nframes * 2352);		break;	case CDROM_SEND_PACKET:		err = copy_to_user((char *)A(addr), data, cgc.buflen);		break;	default:		break;	}out:	if (data)		kfree(data);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -