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

📄 sys_sunos32.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
			arg3=GETPID; break;		case 5:			arg3=GETVAL; break;		case 6:			arg3=GETALL; break;		case 3:			arg3=GETNCNT; break;		case 7:			arg3=GETZCNT; break;		case 8:			arg3=SETVAL; break;		case 9:			arg3=SETALL; break;		}		/* sys_semctl(): */		/* value to modify semaphore to */		arg4.__pad = ptr;		ret = sys_semctl((int)arg1, (int)arg2, (int)arg3, arg4);		break;	case 1:		/* sys_semget(): */		ret = sys_semget((key_t)arg1, (int)arg2, (int)arg3);		break;	case 2:		/* sys_semop(): */		ret = sys_semop((int)arg1, (struct sembuf __user *)(unsigned long)arg2,				(unsigned int) arg3);		break;	default:		ret = -EINVAL;		break;	};	return ret;}struct msgbuf32 {	s32 mtype;	char mtext[1];};struct ipc_perm32{	key_t    	  key;        compat_uid_t  uid;        compat_gid_t  gid;        compat_uid_t  cuid;        compat_gid_t  cgid;        compat_mode_t mode;        unsigned short  seq;};struct msqid_ds32{        struct ipc_perm32 msg_perm;        u32 msg_first;        u32 msg_last;        compat_time_t msg_stime;        compat_time_t msg_rtime;        compat_time_t msg_ctime;        u32 wwait;        u32 rwait;        unsigned short msg_cbytes;        unsigned short msg_qnum;          unsigned short msg_qbytes;        compat_ipc_pid_t msg_lspid;        compat_ipc_pid_t msg_lrpid;};static inline int sunos_msqid_get(struct msqid_ds32 __user *user,				  struct msqid_ds *kern){	if (get_user(kern->msg_perm.key, &user->msg_perm.key)		||	    __get_user(kern->msg_perm.uid, &user->msg_perm.uid)		||	    __get_user(kern->msg_perm.gid, &user->msg_perm.gid)		||	    __get_user(kern->msg_perm.cuid, &user->msg_perm.cuid)	||	    __get_user(kern->msg_perm.cgid, &user->msg_perm.cgid)	||	    __get_user(kern->msg_stime, &user->msg_stime)		||	    __get_user(kern->msg_rtime, &user->msg_rtime)		||	    __get_user(kern->msg_ctime, &user->msg_ctime)		||	    __get_user(kern->msg_ctime, &user->msg_cbytes)		||	    __get_user(kern->msg_ctime, &user->msg_qnum)		||	    __get_user(kern->msg_ctime, &user->msg_qbytes)		||	    __get_user(kern->msg_ctime, &user->msg_lspid)		||	    __get_user(kern->msg_ctime, &user->msg_lrpid))		return -EFAULT;	return 0;}static inline int sunos_msqid_put(struct msqid_ds32 __user *user,				  struct msqid_ds *kern){	if (put_user(kern->msg_perm.key, &user->msg_perm.key)		||	    __put_user(kern->msg_perm.uid, &user->msg_perm.uid)		||	    __put_user(kern->msg_perm.gid, &user->msg_perm.gid)		||	    __put_user(kern->msg_perm.cuid, &user->msg_perm.cuid)	||	    __put_user(kern->msg_perm.cgid, &user->msg_perm.cgid)	||	    __put_user(kern->msg_stime, &user->msg_stime)		||	    __put_user(kern->msg_rtime, &user->msg_rtime)		||	    __put_user(kern->msg_ctime, &user->msg_ctime)		||	    __put_user(kern->msg_ctime, &user->msg_cbytes)		||	    __put_user(kern->msg_ctime, &user->msg_qnum)		||	    __put_user(kern->msg_ctime, &user->msg_qbytes)		||	    __put_user(kern->msg_ctime, &user->msg_lspid)		||	    __put_user(kern->msg_ctime, &user->msg_lrpid))		return -EFAULT;	return 0;}static inline int sunos_msgbuf_get(struct msgbuf32 __user *user, struct msgbuf *kern, int len){	if (get_user(kern->mtype, &user->mtype)	||	    __copy_from_user(kern->mtext, &user->mtext, len))		return -EFAULT;	return 0;}static inline int sunos_msgbuf_put(struct msgbuf32 __user *user, struct msgbuf *kern, int len){	if (put_user(kern->mtype, &user->mtype)	||	    __copy_to_user(user->mtext, kern->mtext, len))		return -EFAULT;	return 0;}asmlinkage int sunos_msgsys(int op, u32 arg1, u32 arg2, u32 arg3, u32 arg4){	struct sparc_stackf32 __user *sp;	struct msqid_ds kds;	struct msgbuf *kmbuf;	mm_segment_t old_fs = get_fs();	u32 arg5;	int rval;	switch(op) {	case 0:		rval = sys_msgget((key_t)arg1, (int)arg2);		break;	case 1:		if (!sunos_msqid_get((struct msqid_ds32 __user *)(unsigned long)arg3, &kds)) {			set_fs(KERNEL_DS);			rval = sys_msgctl((int)arg1, (int)arg2,					  (struct msqid_ds __user *)(unsigned long)arg3);			set_fs(old_fs);			if (!rval)				rval = sunos_msqid_put((struct msqid_ds32 __user *)(unsigned long)arg3,						       &kds);		} else			rval = -EFAULT;		break;	case 2:		rval = -EFAULT;		kmbuf = (struct msgbuf *)kmalloc(sizeof(struct msgbuf) + arg3,						 GFP_KERNEL);		if (!kmbuf)			break;		sp = (struct sparc_stackf32 __user *)			(current_thread_info()->kregs->u_regs[UREG_FP] & 0xffffffffUL);		if (get_user(arg5, &sp->xxargs[0])) {			rval = -EFAULT;			kfree(kmbuf);			break;		}		set_fs(KERNEL_DS);		rval = sys_msgrcv((int)arg1, (struct msgbuf __user *) kmbuf,				  (size_t)arg3,				  (long)arg4, (int)arg5);		set_fs(old_fs);		if (!rval)			rval = sunos_msgbuf_put((struct msgbuf32 __user *)(unsigned long)arg2,						kmbuf, arg3);		kfree(kmbuf);		break;	case 3:		rval = -EFAULT;		kmbuf = (struct msgbuf *)kmalloc(sizeof(struct msgbuf) + arg3,						 GFP_KERNEL);		if (!kmbuf || sunos_msgbuf_get((struct msgbuf32 __user *)(unsigned long)arg2,					       kmbuf, arg3))			break;		set_fs(KERNEL_DS);		rval = sys_msgsnd((int)arg1, (struct msgbuf __user *) kmbuf,				  (size_t)arg3, (int)arg4);		set_fs(old_fs);		kfree(kmbuf);		break;	default:		rval = -EINVAL;		break;	}	return rval;}struct shmid_ds32 {        struct ipc_perm32       shm_perm;        int                     shm_segsz;        compat_time_t         shm_atime;        compat_time_t         shm_dtime;        compat_time_t         shm_ctime;        compat_ipc_pid_t    shm_cpid;         compat_ipc_pid_t    shm_lpid;         unsigned short          shm_nattch;};                                                        static inline int sunos_shmid_get(struct shmid_ds32 __user *user,				  struct shmid_ds *kern){	if (get_user(kern->shm_perm.key, &user->shm_perm.key)		||	    __get_user(kern->shm_perm.uid, &user->shm_perm.uid)		||	    __get_user(kern->shm_perm.gid, &user->shm_perm.gid)		||	    __get_user(kern->shm_perm.cuid, &user->shm_perm.cuid)	||	    __get_user(kern->shm_perm.cgid, &user->shm_perm.cgid)	||	    __get_user(kern->shm_segsz, &user->shm_segsz)		||	    __get_user(kern->shm_atime, &user->shm_atime)		||	    __get_user(kern->shm_dtime, &user->shm_dtime)		||	    __get_user(kern->shm_ctime, &user->shm_ctime)		||	    __get_user(kern->shm_cpid, &user->shm_cpid)			||	    __get_user(kern->shm_lpid, &user->shm_lpid)			||	    __get_user(kern->shm_nattch, &user->shm_nattch))		return -EFAULT;	return 0;}static inline int sunos_shmid_put(struct shmid_ds32 __user *user,				  struct shmid_ds *kern){	if (put_user(kern->shm_perm.key, &user->shm_perm.key)		||	    __put_user(kern->shm_perm.uid, &user->shm_perm.uid)		||	    __put_user(kern->shm_perm.gid, &user->shm_perm.gid)		||	    __put_user(kern->shm_perm.cuid, &user->shm_perm.cuid)	||	    __put_user(kern->shm_perm.cgid, &user->shm_perm.cgid)	||	    __put_user(kern->shm_segsz, &user->shm_segsz)		||	    __put_user(kern->shm_atime, &user->shm_atime)		||	    __put_user(kern->shm_dtime, &user->shm_dtime)		||	    __put_user(kern->shm_ctime, &user->shm_ctime)		||	    __put_user(kern->shm_cpid, &user->shm_cpid)			||	    __put_user(kern->shm_lpid, &user->shm_lpid)			||	    __put_user(kern->shm_nattch, &user->shm_nattch))		return -EFAULT;	return 0;}asmlinkage int sunos_shmsys(int op, u32 arg1, u32 arg2, u32 arg3){	struct shmid_ds ksds;	unsigned long raddr;	mm_segment_t old_fs = get_fs();	int rval;	switch(op) {	case 0:		/* do_shmat(): attach a shared memory area */		rval = do_shmat((int)arg1,(char __user *)(unsigned long)arg2,(int)arg3,&raddr);		if (!rval)			rval = (int) raddr;		break;	case 1:		/* sys_shmctl(): modify shared memory area attr. */		if (!sunos_shmid_get((struct shmid_ds32 __user *)(unsigned long)arg3, &ksds)) {			set_fs(KERNEL_DS);			rval = sys_shmctl((int) arg1,(int) arg2,					  (struct shmid_ds __user *) &ksds);			set_fs(old_fs);			if (!rval)				rval = sunos_shmid_put((struct shmid_ds32 __user *)(unsigned long)arg3,						       &ksds);		} else			rval = -EFAULT;		break;	case 2:		/* sys_shmdt(): detach a shared memory area */		rval = sys_shmdt((char __user *)(unsigned long)arg1);		break;	case 3:		/* sys_shmget(): get a shared memory area */		rval = sys_shmget((key_t)arg1,(int)arg2,(int)arg3);		break;	default:		rval = -EINVAL;		break;	};	return rval;}extern asmlinkage long sparc32_open(const char __user * filename, int flags, int mode);asmlinkage int sunos_open(u32 fname, int flags, int mode){	const char __user *filename = compat_ptr(fname);	return sparc32_open(filename, flags, mode);}#define SUNOS_EWOULDBLOCK 35/* see the sunos man page read(2v) for an explanation   of this garbage. We use O_NDELAY to mark   file descriptors that have been set non-blocking    using 4.2BSD style calls. (tridge) */static inline int check_nonblock(int ret, int fd){	if (ret == -EAGAIN) {		struct file * file = fget(fd);		if (file) {			if (file->f_flags & O_NDELAY)				ret = -SUNOS_EWOULDBLOCK;			fput(file);		}	}	return ret;}asmlinkage int sunos_read(unsigned int fd, char __user *buf, u32 count){	int ret;	ret = check_nonblock(sys_read(fd, buf, count), fd);	return ret;}asmlinkage int sunos_readv(u32 fd, void __user *vector, s32 count){	int ret;	ret = check_nonblock(compat_sys_readv(fd, vector, count), fd);	return ret;}asmlinkage int sunos_write(unsigned int fd, char __user *buf, u32 count){	int ret;	ret = check_nonblock(sys_write(fd, buf, count), fd);	return ret;}asmlinkage int sunos_writev(u32 fd, void __user *vector, s32 count){	int ret;	ret = check_nonblock(compat_sys_writev(fd, vector, count), fd);	return ret;}asmlinkage int sunos_recv(u32 __fd, void __user *ubuf, int size, unsigned flags){	int ret, fd = (int) __fd;	ret = check_nonblock(sys_recv(fd, ubuf, size, flags), fd);	return ret;}asmlinkage int sunos_send(u32 __fd, void __user *buff, int len, unsigned flags){	int ret, fd = (int) __fd;	ret = check_nonblock(sys_send(fd, buff, len, flags), fd);	return ret;}asmlinkage int sunos_accept(u32 __fd, struct sockaddr __user *sa, int __user *addrlen){	int ret, fd = (int) __fd;	while (1) {		ret = check_nonblock(sys_accept(fd, sa, addrlen), fd);		if (ret != -ENETUNREACH && ret != -EHOSTUNREACH)			break;	}	return ret;}#define SUNOS_SV_INTERRUPT 2asmlinkage int sunos_sigaction (int sig,				struct old_sigaction32 __user *act,				struct old_sigaction32 __user *oact){	struct k_sigaction new_ka, old_ka;	int ret;	if (act) {		compat_old_sigset_t mask;		u32 u_handler;		if (get_user(u_handler, &act->sa_handler) ||		    __get_user(new_ka.sa.sa_flags, &act->sa_flags))			return -EFAULT;		new_ka.sa.sa_handler = compat_ptr(u_handler);		__get_user(mask, &act->sa_mask);		new_ka.sa.sa_restorer = NULL;		new_ka.ka_restorer = NULL;		siginitset(&new_ka.sa.sa_mask, mask);		new_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;	}	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);	if (!ret && oact) {		old_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;		if (put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler) ||		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags))			return -EFAULT;		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);	}	return ret;}asmlinkage int sunos_setsockopt(u32 __fd, u32 __level, u32 __optname,				char __user *optval, u32 __optlen){	int fd = (int) __fd;	int level = (int) __level;	int optname = (int) __optname;	int optlen = (int) __optlen;	int tr_opt = optname;	int ret;	if (level == SOL_IP) {		/* Multicast socketopts (ttl, membership) */		if (tr_opt >=2 && tr_opt <= 6)			tr_opt += 30;	}	ret = sys_setsockopt(fd, level, tr_opt,			     optval, optlen);	return ret;}asmlinkage int sunos_getsockopt(u32 __fd, u32 __level, u32 __optname,				char __user *optval, int __user *optlen){	int fd = (int) __fd;	int level = (int) __level;	int optname = (int) __optname;	int tr_opt = optname;	int ret;	if (level == SOL_IP) {		/* Multicast socketopts (ttl, membership) */		if (tr_opt >=2 && tr_opt <= 6)			tr_opt += 30;	}	ret = compat_sys_getsockopt(fd, level, tr_opt,				    optval, optlen);	return ret;}

⌨️ 快捷键说明

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