MFC r272132:
Fix fcntl(2) compat32 after r270691. Approved by: re (glebius)
This commit is contained in:
parent
faff28354b
commit
2a73c68cd0
@ -3076,7 +3076,7 @@ freebsd32_procctl(struct thread *td, struct freebsd32_procctl_args *uap)
|
|||||||
int
|
int
|
||||||
freebsd32_fcntl(struct thread *td, struct freebsd32_fcntl_args *uap)
|
freebsd32_fcntl(struct thread *td, struct freebsd32_fcntl_args *uap)
|
||||||
{
|
{
|
||||||
intptr_t tmp;
|
long tmp;
|
||||||
|
|
||||||
switch (uap->cmd) {
|
switch (uap->cmd) {
|
||||||
/*
|
/*
|
||||||
@ -3095,5 +3095,5 @@ freebsd32_fcntl(struct thread *td, struct freebsd32_fcntl_args *uap)
|
|||||||
tmp = uap->arg;
|
tmp = uap->arg;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return (kern_fcntl(td, uap->fd, uap->cmd, tmp));
|
return (kern_fcntl_freebsd(td, uap->fd, uap->cmd, tmp));
|
||||||
}
|
}
|
||||||
|
@ -400,23 +400,28 @@ struct fcntl_args {
|
|||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
int
|
int
|
||||||
sys_fcntl(struct thread *td, struct fcntl_args *uap)
|
sys_fcntl(struct thread *td, struct fcntl_args *uap)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (kern_fcntl_freebsd(td, uap->fd, uap->cmd, uap->arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
kern_fcntl_freebsd(struct thread *td, int fd, int cmd, long arg)
|
||||||
{
|
{
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
struct __oflock ofl;
|
struct __oflock ofl;
|
||||||
intptr_t arg;
|
intptr_t arg1;
|
||||||
int error;
|
int error;
|
||||||
int cmd;
|
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
cmd = uap->cmd;
|
switch (cmd) {
|
||||||
switch (uap->cmd) {
|
|
||||||
case F_OGETLK:
|
case F_OGETLK:
|
||||||
case F_OSETLK:
|
case F_OSETLK:
|
||||||
case F_OSETLKW:
|
case F_OSETLKW:
|
||||||
/*
|
/*
|
||||||
* Convert old flock structure to new.
|
* Convert old flock structure to new.
|
||||||
*/
|
*/
|
||||||
error = copyin((void *)(intptr_t)uap->arg, &ofl, sizeof(ofl));
|
error = copyin((void *)(intptr_t)arg, &ofl, sizeof(ofl));
|
||||||
fl.l_start = ofl.l_start;
|
fl.l_start = ofl.l_start;
|
||||||
fl.l_len = ofl.l_len;
|
fl.l_len = ofl.l_len;
|
||||||
fl.l_pid = ofl.l_pid;
|
fl.l_pid = ofl.l_pid;
|
||||||
@ -424,7 +429,7 @@ sys_fcntl(struct thread *td, struct fcntl_args *uap)
|
|||||||
fl.l_whence = ofl.l_whence;
|
fl.l_whence = ofl.l_whence;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
|
|
||||||
switch (uap->cmd) {
|
switch (cmd) {
|
||||||
case F_OGETLK:
|
case F_OGETLK:
|
||||||
cmd = F_GETLK;
|
cmd = F_GETLK;
|
||||||
break;
|
break;
|
||||||
@ -435,33 +440,33 @@ sys_fcntl(struct thread *td, struct fcntl_args *uap)
|
|||||||
cmd = F_SETLKW;
|
cmd = F_SETLKW;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
arg = (intptr_t)&fl;
|
arg1 = (intptr_t)&fl;
|
||||||
break;
|
break;
|
||||||
case F_GETLK:
|
case F_GETLK:
|
||||||
case F_SETLK:
|
case F_SETLK:
|
||||||
case F_SETLKW:
|
case F_SETLKW:
|
||||||
case F_SETLK_REMOTE:
|
case F_SETLK_REMOTE:
|
||||||
error = copyin((void *)(intptr_t)uap->arg, &fl, sizeof(fl));
|
error = copyin((void *)(intptr_t)arg, &fl, sizeof(fl));
|
||||||
arg = (intptr_t)&fl;
|
arg1 = (intptr_t)&fl;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
arg = uap->arg;
|
arg1 = arg;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
error = kern_fcntl(td, uap->fd, cmd, arg);
|
error = kern_fcntl(td, fd, cmd, arg1);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
if (uap->cmd == F_OGETLK) {
|
if (cmd == F_OGETLK) {
|
||||||
ofl.l_start = fl.l_start;
|
ofl.l_start = fl.l_start;
|
||||||
ofl.l_len = fl.l_len;
|
ofl.l_len = fl.l_len;
|
||||||
ofl.l_pid = fl.l_pid;
|
ofl.l_pid = fl.l_pid;
|
||||||
ofl.l_type = fl.l_type;
|
ofl.l_type = fl.l_type;
|
||||||
ofl.l_whence = fl.l_whence;
|
ofl.l_whence = fl.l_whence;
|
||||||
error = copyout(&ofl, (void *)(intptr_t)uap->arg, sizeof(ofl));
|
error = copyout(&ofl, (void *)(intptr_t)arg, sizeof(ofl));
|
||||||
} else if (uap->cmd == F_GETLK) {
|
} else if (cmd == F_GETLK) {
|
||||||
error = copyout(&fl, (void *)(intptr_t)uap->arg, sizeof(fl));
|
error = copyout(&fl, (void *)(intptr_t)arg, sizeof(fl));
|
||||||
}
|
}
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,7 @@ int kern_fchmodat(struct thread *td, int fd, char *path,
|
|||||||
int kern_fchownat(struct thread *td, int fd, char *path,
|
int kern_fchownat(struct thread *td, int fd, char *path,
|
||||||
enum uio_seg pathseg, int uid, int gid, int flag);
|
enum uio_seg pathseg, int uid, int gid, int flag);
|
||||||
int kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg);
|
int kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg);
|
||||||
|
int kern_fcntl_freebsd(struct thread *td, int fd, int cmd, long arg);
|
||||||
int kern_fhstat(struct thread *td, fhandle_t fh, struct stat *buf);
|
int kern_fhstat(struct thread *td, fhandle_t fh, struct stat *buf);
|
||||||
int kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf);
|
int kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf);
|
||||||
int kern_fstat(struct thread *td, int fd, struct stat *sbp);
|
int kern_fstat(struct thread *td, int fd, struct stat *sbp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user