Bug #1471 ยป linux_file.c.diff
| linux_file.c 2009-09-02 10:32:42 +0200 | ||
|---|---|---|
| 	error = nlookup_init(&nd, path, UIO_SYSSPACE, NLC_FOLLOW); | ||
| 	if (error == 0) { | ||
| 		error = kern_open(&nd, O_WRONLY | O_CREAT | O_TRUNC, | ||
| 				  args->mode, &args->sysmsg_iresult); | ||
| 				    args->mode, &args->sysmsg_result); | ||
| 	} | ||
| 	linux_free_path(&path); | ||
| 	return(error); | ||
| ... | ... | |
| 	error = nlookup_init(&nd, path, UIO_SYSSPACE, NLC_FOLLOW); | ||
| 	if (error == 0) { | ||
| 		error = kern_open(&nd, flags, | ||
| 				  args->mode, &args->sysmsg_iresult); | ||
| 				    args->mode, &args->sysmsg_result); | ||
| 	} | ||
| 	if (error == 0 && !(flags & O_NOCTTY) &&  | ||
| 		SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) { | ||
| 		struct file *fp; | ||
| 		fp = holdfp(p->p_fd, args->sysmsg_iresult, -1); | ||
| 		fp = holdfp(p->p_fd, args->sysmsg_result, -1); | ||
| 		if (fp) { | ||
| 			if (fp->f_type == DTYPE_VNODE) | ||
| 				fo_ioctl(fp, TIOCSCTTY, NULL, p->p_ucred, NULL); | ||
| ... | ... | |
| 	lda.fd = args->fd; | ||
| 	lda.dent = args->dent; | ||
| 	lda.count = -1; | ||
| 	lda.sysmsg_iresult = 0; | ||
| 	lda.sysmsg_result = 0; | ||
| 	error = sys_linux_getdents(&lda); | ||
| 	args->sysmsg_iresult = lda.sysmsg_iresult; | ||
| 	args->sysmsg_result = lda.sysmsg_result; | ||
| 	return(error); | ||
| } | ||
| ... | ... | |
| 	struct dirent *bdp; | ||
| 	struct vnode *vp; | ||
| 	caddr_t inp, buf;		/* BSD-format */ | ||
| 	int reclen;			/* BSD-format */ | ||
| 	size_t len; | ||
| 	int len, reclen;		/* BSD-format */ | ||
| 	caddr_t outp;			/* Linux-format */ | ||
| 	int linuxreclen = 0;		/* Linux-format */ | ||
| 	size_t resid; | ||
| 	int resid, linuxreclen=0;	/* Linux-format */ | ||
| 	struct file *fp; | ||
| 	struct uio auio; | ||
| 	struct iovec aiov; | ||
| ... | ... | |
| 	off_t off; | ||
| 	struct l_dirent linux_dirent; | ||
| 	struct l_dirent64 linux_dirent64; | ||
| 	int error, eofflag, justone; | ||
| 	size_t buflen, nbytes; | ||
| 	int buflen, error, eofflag, nbytes, justone; | ||
| 	off_t *cookies = NULL, *cookiep; | ||
| 	int ncookies; | ||
| ... | ... | |
| 		goto done; | ||
| 	nbytes = args->count; | ||
| 	if (nbytes == (size_t)-1) { | ||
| 	if (nbytes == -1) { | ||
| 		/* readdir(2) case. Always struct dirent. */ | ||
| 		if (is64bit) { | ||
| 			error = EINVAL; | ||
| ... | ... | |
| 	} else { | ||
| 		justone = 0; | ||
| 	} | ||
| 	if ((size_t)nbytes < 0) | ||
| 	if (nbytes < 0) | ||
| 		nbytes = 0; | ||
| 	off = fp->f_offset; | ||
| ... | ... | |
| 	inp = buf; | ||
| 	outp = (caddr_t)args->dirent; | ||
| 	resid = nbytes; | ||
| 	if (auio.uio_resid >= buflen); | ||
| 	if ((len = buflen - auio.uio_resid) <= 0) | ||
| 		goto eof; | ||
| 	len = buflen - auio.uio_resid; | ||
| 	cookiep = cookies; | ||
| 	if (cookies) { | ||
| ... | ... | |
| 		nbytes = resid + linuxreclen; | ||
| eof: | ||
| 	args->sysmsg_iresult = (int)(nbytes - resid); | ||
| 	args->sysmsg_result = nbytes - resid; | ||
| out: | ||
| 	if (cookies) | ||
| ... | ... | |
| 	error = nlookup_init(&nd, path, UIO_SYSSPACE, 0); | ||
| 	if (error == 0) { | ||
| 		error = kern_readlink(&nd, args->buf, args->count, | ||
| 				      &args->sysmsg_iresult); | ||
| 					&args->sysmsg_result); | ||
| 	} | ||
| 	nlookup_done(&nd); | ||
| 	linux_free_path(&path); | ||
| ... | ... | |
| 	int error; | ||
| 	bsd.fd = uap->fd; | ||
| 	bsd.sysmsg_iresult = 0; | ||
| 	bsd.sysmsg_result = 0; | ||
| 	error = sys_fsync(&bsd); | ||
| 	uap->sysmsg_iresult = bsd.sysmsg_iresult; | ||
| 	uap->sysmsg_result = bsd.sysmsg_result; | ||
| 	return(error); | ||
| } | ||
| ... | ... | |
| 	auio.uio_segflg = UIO_USERSPACE; | ||
| 	auio.uio_td = td; | ||
| 	if ((ssize_t)auio.uio_resid < 0) { | ||
| 	if (auio.uio_resid < 0) | ||
| 		error = EINVAL; | ||
| 	} else { | ||
| 		error = kern_preadv(uap->fd, &auio, O_FOFFSET, | ||
| 				    &uap->sysmsg_szresult); | ||
| 	} | ||
| 	else | ||
| 		error = kern_preadv(uap->fd, &auio, O_FOFFSET, &uap->sysmsg_result); | ||
| 	return(error); | ||
| } | ||
| ... | ... | |
|         auio.uio_segflg = UIO_USERSPACE; | ||
|         auio.uio_td = td; | ||
| 	if ((ssize_t)auio.uio_resid < 0) { | ||
| 	if (auio.uio_resid < 0) | ||
| 		error = EINVAL; | ||
| 	} else { | ||
| 		error = kern_pwritev(uap->fd, &auio, O_FOFFSET, | ||
| 				     &uap->sysmsg_szresult); | ||
| 	} | ||
| 	else | ||
| 		error = kern_pwritev(uap->fd, &auio, O_FOFFSET, &uap->sysmsg_result); | ||
| 	return(error); | ||
| } | ||
| ... | ... | |
| 	args2.path = args->path; | ||
| 	args2.flags = 0; | ||
| 	args2.sysmsg_iresult = 0; | ||
| 	args2.sysmsg_result = 0; | ||
| 	error = sys_linux_umount(&args2); | ||
| 	args->sysmsg_iresult = args2.sysmsg_iresult; | ||
| 	args->sysmsg_result = args2.sysmsg_result; | ||
| 	return(error); | ||
| } | ||
| ... | ... | |
| 	bsd.path = args->path; | ||
| 	bsd.flags = args->flags;	/* XXX correct? */ | ||
| 	bsd.sysmsg_iresult = 0; | ||
| 	bsd.sysmsg_result = 0; | ||
| 	error = sys_unmount(&bsd); | ||
| 	args->sysmsg_iresult = bsd.sysmsg_iresult; | ||
| 	args->sysmsg_result = bsd.sysmsg_result; | ||
| 	return(error); | ||
| } | ||
| ... | ... | |
| 	if (error == 0) { | ||
| 		switch (args->cmd) { | ||
| 		case LINUX_F_DUPFD: | ||
| 			args->sysmsg_iresult = dat.fc_fd; | ||
| 			args->sysmsg_result = dat.fc_fd; | ||
| 			break; | ||
| 		case LINUX_F_GETFD: | ||
| 			args->sysmsg_iresult = dat.fc_cloexec; | ||
| 			args->sysmsg_result = dat.fc_cloexec; | ||
| 			break; | ||
| 		case LINUX_F_SETFD: | ||
| 			break; | ||
| 		case LINUX_F_GETFL: | ||
| 			args->sysmsg_iresult = 0; | ||
| 			args->sysmsg_result = 0; | ||
| 			if (dat.fc_flags & O_RDONLY) | ||
| 				args->sysmsg_iresult |= LINUX_O_RDONLY; | ||
| 				args->sysmsg_result |= LINUX_O_RDONLY; | ||
| 			if (dat.fc_flags & O_WRONLY) | ||
| 				args->sysmsg_iresult |= LINUX_O_WRONLY; | ||
| 				args->sysmsg_result |= LINUX_O_WRONLY; | ||
| 			if (dat.fc_flags & O_RDWR) | ||
| 				args->sysmsg_iresult |= LINUX_O_RDWR; | ||
| 				args->sysmsg_result |= LINUX_O_RDWR; | ||
| 			if (dat.fc_flags & O_NDELAY) | ||
| 				args->sysmsg_iresult |= LINUX_O_NONBLOCK; | ||
| 				args->sysmsg_result |= LINUX_O_NONBLOCK; | ||
| 			if (dat.fc_flags & O_APPEND) | ||
| 				args->sysmsg_iresult |= LINUX_O_APPEND; | ||
| 				args->sysmsg_result |= LINUX_O_APPEND; | ||
| 			if (dat.fc_flags & O_FSYNC) | ||
| 				args->sysmsg_iresult |= LINUX_O_SYNC; | ||
| 				args->sysmsg_result |= LINUX_O_SYNC; | ||
| 			if (dat.fc_flags & O_ASYNC) | ||
| 				args->sysmsg_iresult |= LINUX_FASYNC; | ||
| 				args->sysmsg_result |= LINUX_FASYNC; | ||
| 			break; | ||
| 		case LINUX_F_GETLK: | ||
| 			bsd_to_linux_flock(&dat.fc_flock, &linux_flock); | ||
| ... | ... | |
| 		case LINUX_F_SETLKW: | ||
| 			break; | ||
| 		case LINUX_F_GETOWN: | ||
| 			args->sysmsg_iresult = dat.fc_owner; | ||
| 			args->sysmsg_result = dat.fc_owner; | ||
| 			break; | ||
| 		case LINUX_F_SETOWN: | ||
| 			break; | ||
| ... | ... | |
| 	args64.fd = args->fd; | ||
| 	args64.cmd = args->cmd; | ||
| 	args64.arg = args->arg; | ||
| 	args64.sysmsg_iresult = 0; | ||
| 	args64.sysmsg_result = 0; | ||
| 	error = linux_fcntl_common(&args64); | ||
| 	args->sysmsg_iresult = args64.sysmsg_iresult; | ||
| 	args->sysmsg_result = args64.sysmsg_result; | ||
| 	return(error); | ||
| } | ||