Make the Linux *at() calls a bit more complete.
Properly support: - AT_EACCESS for faccessat(), - AT_SYMLINK_FOLLOW for linkat().
This commit is contained in:
parent
51cfb9474f
commit
767a32641c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=227693
@ -483,14 +483,14 @@
|
||||
302 AUE_RENAMEAT STD { int linux_renameat(l_int olddfd, const char *oldname, \
|
||||
l_int newdfd, const char *newname); }
|
||||
303 AUE_LINKAT STD { int linux_linkat(l_int olddfd, const char *oldname, \
|
||||
l_int newdfd, const char *newname, l_int flags); }
|
||||
l_int newdfd, const char *newname, l_int flag); }
|
||||
304 AUE_SYMLINKAT STD { int linux_symlinkat(const char *oldname, l_int newdfd, \
|
||||
const char *newname); }
|
||||
305 AUE_READLINKAT STD { int linux_readlinkat(l_int dfd, const char *path, \
|
||||
char *buf, l_int bufsiz); }
|
||||
306 AUE_FCHMODAT STD { int linux_fchmodat(l_int dfd, const char *filename, \
|
||||
l_mode_t mode); }
|
||||
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode); }
|
||||
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode, int flag); }
|
||||
308 AUE_NULL STD { int linux_pselect6(void); }
|
||||
309 AUE_NULL STD { int linux_ppoll(void); }
|
||||
310 AUE_NULL STD { int linux_unshare(void); }
|
||||
|
@ -584,8 +584,10 @@ int
|
||||
linux_faccessat(struct thread *td, struct linux_faccessat_args *args)
|
||||
{
|
||||
char *path;
|
||||
int error, dfd;
|
||||
int error, dfd, flag;
|
||||
|
||||
if (args->flag & ~LINUX_AT_EACCESS)
|
||||
return (EINVAL);
|
||||
/* linux convention */
|
||||
if (args->amode & ~(F_OK | X_OK | W_OK | R_OK))
|
||||
return (EINVAL);
|
||||
@ -598,8 +600,8 @@ linux_faccessat(struct thread *td, struct linux_faccessat_args *args)
|
||||
printf(ARGS(access, "%s, %d"), path, args->amode);
|
||||
#endif
|
||||
|
||||
error = kern_accessat(td, dfd, path, UIO_SYSSPACE, 0 /* XXX */,
|
||||
args->amode);
|
||||
flag = (args->flag & LINUX_AT_EACCESS) == 0 ? 0 : AT_EACCESS;
|
||||
error = kern_accessat(td, dfd, path, UIO_SYSSPACE, flag, args->amode);
|
||||
LFREEPATH(path);
|
||||
|
||||
return (error);
|
||||
@ -982,13 +984,9 @@ int
|
||||
linux_linkat(struct thread *td, struct linux_linkat_args *args)
|
||||
{
|
||||
char *path, *to;
|
||||
int error, olddfd, newdfd;
|
||||
int error, olddfd, newdfd, follow;
|
||||
|
||||
/*
|
||||
* They really introduced flags argument which is forbidden to
|
||||
* use.
|
||||
*/
|
||||
if (args->flags != 0)
|
||||
if (args->flag & ~LINUX_AT_SYMLINK_FOLLOW)
|
||||
return (EINVAL);
|
||||
|
||||
olddfd = (args->olddfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->olddfd;
|
||||
@ -1004,10 +1002,12 @@ linux_linkat(struct thread *td, struct linux_linkat_args *args)
|
||||
#ifdef DEBUG
|
||||
if (ldebug(linkat))
|
||||
printf(ARGS(linkat, "%i, %s, %i, %s, %i"), args->olddfd, path,
|
||||
args->newdfd, to, args->flags);
|
||||
args->newdfd, to, args->flag);
|
||||
#endif
|
||||
|
||||
error = kern_linkat(td, olddfd, newdfd, path, to, UIO_SYSSPACE, FOLLOW);
|
||||
follow = (args->flag & LINUX_AT_SYMLINK_FOLLOW) == 0 ? NOFOLLOW :
|
||||
FOLLOW;
|
||||
error = kern_linkat(td, olddfd, newdfd, path, to, UIO_SYSSPACE, follow);
|
||||
LFREEPATH(path);
|
||||
LFREEPATH(to);
|
||||
return (error);
|
||||
@ -1493,7 +1493,7 @@ int
|
||||
linux_fchownat(struct thread *td, struct linux_fchownat_args *args)
|
||||
{
|
||||
char *path;
|
||||
int error, dfd, follow;
|
||||
int error, dfd, flag;
|
||||
|
||||
if (args->flag & ~LINUX_AT_SYMLINK_NOFOLLOW)
|
||||
return (EINVAL);
|
||||
@ -1506,10 +1506,10 @@ linux_fchownat(struct thread *td, struct linux_fchownat_args *args)
|
||||
printf(ARGS(fchownat, "%s, %d, %d"), path, args->uid, args->gid);
|
||||
#endif
|
||||
|
||||
follow = (args->flag & LINUX_AT_SYMLINK_NOFOLLOW) == 0 ? 0 :
|
||||
flag = (args->flag & LINUX_AT_SYMLINK_NOFOLLOW) == 0 ? 0 :
|
||||
AT_SYMLINK_NOFOLLOW;
|
||||
error = kern_fchownat(td, dfd, path, UIO_SYSSPACE, args->uid, args->gid,
|
||||
follow);
|
||||
flag);
|
||||
LFREEPATH(path);
|
||||
return (error);
|
||||
}
|
||||
|
@ -31,6 +31,8 @@
|
||||
|
||||
#define LINUX_AT_FDCWD -100
|
||||
#define LINUX_AT_SYMLINK_NOFOLLOW 0x100
|
||||
#define LINUX_AT_EACCESS 0x200
|
||||
#define LINUX_AT_REMOVEDIR 0x200
|
||||
#define LINUX_AT_SYMLINK_FOLLOW 0x400
|
||||
|
||||
#endif /* !_LINUX_FILE_H_ */
|
||||
|
@ -493,14 +493,14 @@
|
||||
302 AUE_RENAMEAT STD { int linux_renameat(l_int olddfd, const char *oldname, \
|
||||
l_int newdfd, const char *newname); }
|
||||
303 AUE_LINKAT STD { int linux_linkat(l_int olddfd, const char *oldname, \
|
||||
l_int newdfd, const char *newname, l_int flags); }
|
||||
l_int newdfd, const char *newname, l_int flag); }
|
||||
304 AUE_SYMLINKAT STD { int linux_symlinkat(const char *oldname, l_int newdfd, \
|
||||
const char *newname); }
|
||||
305 AUE_READLINKAT STD { int linux_readlinkat(l_int dfd, const char *path, \
|
||||
char *buf, l_int bufsiz); }
|
||||
306 AUE_FCHMODAT STD { int linux_fchmodat(l_int dfd, const char *filename, \
|
||||
l_mode_t mode); }
|
||||
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode); }
|
||||
307 AUE_FACCESSAT STD { int linux_faccessat(l_int dfd, const char *filename, l_int amode, l_int flag); }
|
||||
308 AUE_NULL STD { int linux_pselect6(void); }
|
||||
309 AUE_NULL STD { int linux_ppoll(void); }
|
||||
310 AUE_NULL STD { int linux_unshare(void); }
|
||||
|
Loading…
Reference in New Issue
Block a user