Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux_file.c
Show First 20 Lines • Show All 1,164 Lines • ▼ Show 20 Lines | |||||
linux_linkat(struct thread *td, struct linux_linkat_args *args) | linux_linkat(struct thread *td, struct linux_linkat_args *args) | ||||
{ | { | ||||
char *path, *to; | char *path, *to; | ||||
int error, olddfd, newdfd, flag; | int error, olddfd, newdfd, flag; | ||||
if (args->flag & ~(LINUX_AT_SYMLINK_FOLLOW | LINUX_AT_EMPTY_PATH)) | if (args->flag & ~(LINUX_AT_SYMLINK_FOLLOW | LINUX_AT_EMPTY_PATH)) | ||||
return (EINVAL); | return (EINVAL); | ||||
flag = (args->flag & LINUX_AT_SYMLINK_FOLLOW) == 0 ? AT_SYMLINK_FOLLOW : | flag = (args->flag & LINUX_AT_SYMLINK_FOLLOW) != 0 ? AT_SYMLINK_FOLLOW : | ||||
0; | 0; | ||||
flag |= (args->flag & LINUX_AT_EMPTY_PATH) == 0 ? AT_EMPTY_PATH : 0; | flag |= (args->flag & LINUX_AT_EMPTY_PATH) != 0 ? AT_EMPTY_PATH : 0; | ||||
olddfd = (args->olddfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->olddfd; | olddfd = (args->olddfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->olddfd; | ||||
newdfd = (args->newdfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->newdfd; | newdfd = (args->newdfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->newdfd; | ||||
if (!LUSECONVPATH(td)) { | if (!LUSECONVPATH(td)) { | ||||
return (kern_linkat(td, olddfd, newdfd, args->oldname, | return (kern_linkat(td, olddfd, newdfd, args->oldname, | ||||
args->newname, UIO_USERSPACE, flag)); | args->newname, UIO_USERSPACE, flag)); | ||||
} | } | ||||
LCONVPATHEXIST_AT(td, args->oldname, &path, olddfd); | LCONVPATHEXIST_AT(td, args->oldname, &path, olddfd); | ||||
▲ Show 20 Lines • Show All 899 Lines • Show Last 20 Lines |