Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_descrip.c
| Show First 20 Lines • Show All 408 Lines • ▼ Show 20 Lines | |||||
| 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)); | return (kern_fcntl_freebsd(td, uap->fd, uap->cmd, uap->arg)); | ||||
| } | } | ||||
| int | int | ||||
| kern_fcntl_freebsd(struct thread *td, int fd, int cmd, long arg) | kern_fcntl_freebsd(struct thread *td, int fd, int cmd, intptr_t arg) | ||||
| { | { | ||||
| struct flock fl; | struct flock fl; | ||||
| struct __oflock ofl; | struct __oflock ofl; | ||||
| intptr_t arg1; | intptr_t arg1; | ||||
| int error, newcmd; | int error, newcmd; | ||||
| error = 0; | error = 0; | ||||
| newcmd = cmd; | newcmd = cmd; | ||||
| switch (cmd) { | switch (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)arg, &ofl, sizeof(ofl)); | error = copyin((void *)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; | ||||
| fl.l_type = ofl.l_type; | fl.l_type = ofl.l_type; | ||||
| fl.l_whence = ofl.l_whence; | fl.l_whence = ofl.l_whence; | ||||
| fl.l_sysid = 0; | fl.l_sysid = 0; | ||||
| switch (cmd) { | switch (cmd) { | ||||
| case F_OGETLK: | case F_OGETLK: | ||||
| newcmd = F_GETLK; | newcmd = F_GETLK; | ||||
| break; | break; | ||||
| case F_OSETLK: | case F_OSETLK: | ||||
| newcmd = F_SETLK; | newcmd = F_SETLK; | ||||
| break; | break; | ||||
| case F_OSETLKW: | case F_OSETLKW: | ||||
| newcmd = F_SETLKW; | newcmd = F_SETLKW; | ||||
| break; | break; | ||||
| } | } | ||||
| arg1 = (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)arg, &fl, sizeof(fl)); | error = copyin((void *)arg, &fl, sizeof(fl)); | ||||
| arg1 = (intptr_t)&fl; | arg1 = (intptr_t)&fl; | ||||
| break; | break; | ||||
| default: | default: | ||||
| arg1 = arg; | arg1 = arg; | ||||
| break; | break; | ||||
| } | } | ||||
| if (error) | if (error) | ||||
| return (error); | return (error); | ||||
| error = kern_fcntl(td, fd, newcmd, arg1); | error = kern_fcntl(td, fd, newcmd, arg1); | ||||
| if (error) | if (error) | ||||
| return (error); | return (error); | ||||
| if (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)arg, sizeof(ofl)); | error = copyout(&ofl, (void *)arg, sizeof(ofl)); | ||||
| } else if (cmd == F_GETLK) { | } else if (cmd == F_GETLK) { | ||||
| error = copyout(&fl, (void *)(intptr_t)arg, sizeof(fl)); | error = copyout(&fl, (void *)arg, sizeof(fl)); | ||||
| } | } | ||||
| return (error); | return (error); | ||||
| } | } | ||||
| int | int | ||||
| kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) | kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) | ||||
| { | { | ||||
| struct filedesc *fdp; | struct filedesc *fdp; | ||||
| ▲ Show 20 Lines • Show All 4,922 Lines • Show Last 20 Lines | |||||