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

📄 ioctl32.c

📁 linux-2.4.29操作系统的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			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;}typedef struct sg_io_hdr32 {	s32 interface_id;	/* [i] 'S' for SCSI generic (required) */	s32 dxfer_direction;	/* [i] data transfer direction  */	u8  cmd_len;		/* [i] SCSI command length ( <= 16 bytes) */	u8  mx_sb_len;		/* [i] max length to write to sbp */	u16 iovec_count;	/* [i] 0 implies no scatter gather */	u32 dxfer_len;		/* [i] byte count of data transfer */	u32 dxferp;		/* [i], [*io] points to data transfer memory					      or scatter gather list */	u32 cmdp;		/* [i], [*i] points to command to perform */	u32 sbp;		/* [i], [*o] points to sense_buffer memory */	u32 timeout;		/* [i] MAX_UINT->no timeout (unit: millisec) */	u32 flags;		/* [i] 0 -> default, see SG_FLAG... */	s32 pack_id;		/* [i->o] unused internally (normally) */	u32 usr_ptr;		/* [i->o] unused internally */	u8  status;		/* [o] scsi status */	u8  masked_status;	/* [o] shifted, masked scsi status */	u8  msg_status;		/* [o] messaging level data (optional) */	u8  sb_len_wr;		/* [o] byte count actually written to sbp */	u16 host_status;	/* [o] errors from host adapter */	u16 driver_status;	/* [o] errors from software driver */	s32 resid;		/* [o] dxfer_len - actual_transferred */	u32 duration;		/* [o] time taken by cmd (unit: millisec) */	u32 info;		/* [o] auxiliary information */} sg_io_hdr32_t;  /* 64 bytes long (on sparc32) */typedef struct sg_iovec32 {	u32 iov_base;	u32 iov_len;} sg_iovec32_t;static int sg_build_iovec(sg_io_hdr_t *sgio, void *dxferp, u16 iovec_count){	sg_iovec_t *iov = (sg_iovec_t *) (sgio + 1);	sg_iovec32_t *iov32 = dxferp;	int i;	for (i = 0; i < iovec_count; i++) {		u32 base, len;		if (get_user(base, &iov32[i].iov_base) ||		    get_user(len, &iov32[i].iov_len) ||		    put_user((void *)(unsigned long)base, &iov[i].iov_base) ||		    put_user(len, &iov[i].iov_len))			return -EFAULT;	}	return 0;}static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg){	sg_io_hdr_t *sgio;	sg_io_hdr32_t *sgio32;	u16 iovec_count;	u32 data;	void *dxferp;	int err;	sgio32 = (sg_io_hdr32_t *) arg;	if (get_user(iovec_count, &sgio32->iovec_count))		return -EFAULT;	{		void *new, *top;		top = alloc_user_space(0);		new = alloc_user_space(sizeof(sg_io_hdr_t) +				       (iovec_count *					sizeof(sg_iovec_t)));		if (new > top)			return -EINVAL;		sgio = new;	}	/* Ok, now construct.  */	if (copy_in_user(&sgio->interface_id, &sgio32->interface_id,			 (2 * sizeof(int)) +			 (2 * sizeof(unsigned char)) +			 (1 * sizeof(unsigned short)) +			 (1 * sizeof(unsigned int))))		return -EFAULT;	if (get_user(data, &sgio32->dxferp))		return -EFAULT;	dxferp = (void *) (unsigned long) data;	if (iovec_count) {		if (sg_build_iovec(sgio, dxferp, iovec_count))			return -EFAULT;	} else {		if (put_user(dxferp, &sgio->dxferp))			return -EFAULT;	}	{		unsigned char *cmdp, *sbp;		if (get_user(data, &sgio32->cmdp))			return -EFAULT;		cmdp = (unsigned char *) (unsigned long) data;		if (get_user(data, &sgio32->sbp))			return -EFAULT;		sbp = (unsigned char *) (unsigned long) data;		if (put_user(cmdp, &sgio->cmdp) ||		    put_user(sbp, &sgio->sbp))			return -EFAULT;	}	if (copy_in_user(&sgio->timeout, &sgio32->timeout,			 3 * sizeof(int)))		return -EFAULT;	if (get_user(data, &sgio32->usr_ptr))		return -EFAULT;	if (put_user((void *)(unsigned long)data, &sgio->usr_ptr))		return -EFAULT;	if (copy_in_user(&sgio->status, &sgio32->status,			 (4 * sizeof(unsigned char)) +			 (2 * sizeof(unsigned (short))) +			 (3 * sizeof(int))))		return -EFAULT;	err = sys_ioctl(fd, cmd, (unsigned long) sgio);	if (err >= 0) {		void *datap;		if (copy_in_user(&sgio32->pack_id, &sgio->pack_id,				 sizeof(int)) ||		    get_user(datap, &sgio->usr_ptr) ||		    put_user((u32)(unsigned long)datap,			     &sgio32->usr_ptr) ||		    copy_in_user(&sgio32->status, &sgio->status,				 (4 * sizeof(unsigned char)) +				 (2 * sizeof(unsigned short)) +				 (3 * sizeof(int))))			err = -EFAULT;	}	return err;}struct sock_fprog32 {	__u16	len;	__u32	filter;};#define PPPIOCSPASS32	_IOW('t', 71, struct sock_fprog32)#define PPPIOCSACTIVE32	_IOW('t', 70, struct sock_fprog32)static int ppp_sock_fprog_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg){	struct sock_fprog32 *u_fprog32 = (struct sock_fprog32 *) arg;	struct sock_fprog *u_fprog64 = alloc_user_space(sizeof(struct sock_fprog));	void *fptr64;	u32 fptr32;	u16 flen;	if (get_user(flen, &u_fprog32->len) ||	    get_user(fptr32, &u_fprog32->filter))		return -EFAULT;	fptr64 = (void *) A(fptr32);	if (put_user(flen, &u_fprog64->len) ||	    put_user(fptr64, &u_fprog64->filter))		return -EFAULT;	if (cmd == PPPIOCSPASS32)		cmd = PPPIOCSPASS;	else		cmd = PPPIOCSACTIVE;	return sys_ioctl(fd, cmd, (unsigned long) u_fprog64);}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_gidle(unsigned int fd, unsigned int cmd, unsigned long arg){	struct ppp_idle *idle;	struct ppp_idle32 *idle32;	__kernel_time_t xmit, recv;	int err;	idle = alloc_user_space(sizeof(*idle));	idle32 = (struct ppp_idle32 *) arg;	err = sys_ioctl(fd, PPPIOCGIDLE, (unsigned long) idle);	if (!err) {		if (get_user(xmit, &idle->xmit_idle) ||		    get_user(recv, &idle->recv_idle) ||		    put_user(xmit, &idle32->xmit_idle) ||		    put_user(recv, &idle32->recv_idle))			err = -EFAULT;	}	return err;}static int ppp_scompress(unsigned int fd, unsigned int cmd, unsigned long arg){	struct ppp_option_data *odata;	struct ppp_option_data32 *odata32;	__u32 data;	void *datap;	odata = alloc_user_space(sizeof(*odata));	odata32 = (struct ppp_option_data32 *) arg;	if (get_user(data, &odata32->ptr))		return -EFAULT;	datap = (void *) (unsigned long) data;	if (put_user(datap, &odata->ptr))		return -EFAULT;	if (copy_in_user(&odata->length, &odata32->length,			 sizeof(__u32) + sizeof(int)))		return -EFAULT;	return sys_ioctl(fd, PPPIOCSCOMPRESS, (unsigned long) odata);}static int ppp_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg){	int err;	switch (cmd) {	case PPPIOCGIDLE32:		err = ppp_gidle(fd, cmd, arg);		break;	case PPPIOCSCOMPRESS32:		err = ppp_scompress(fd, cmd, arg);		break;	default:		do {			static int count;			if (++count <= 20)				printk("ppp_ioctl: Unknown cmd fd(%d) "				       "cmd(%08x) arg(%08x)\n",				       (int)fd, (unsigned int)cmd, (unsigned int)arg);		} while(0);		err = -EINVAL;		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;			if (++count <= 20)				printk("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_read_audio32 {	union cdrom_addr	addr;

⌨️ 快捷键说明

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