PERFORCE change 122222 for review

Roman Divacky rdivacky at FreeBSD.org
Sun Jun 24 08:57:56 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=122222

Change 122222 by rdivacky at rdivacky_witten on 2007/06/24 08:57:35

	Add fstatat, futimesat, linkat, mkdirat, mkfifoat, mknodat, openat, readlinkat,
	renameat, symlinkat and unlinkat.
	
	Unlinkat AT_REMOVEDIR support is incomplete, we lack checking for non-emptiness
	of the dir in question.
	
	None if these is tested by something else but compilation.

Affected files ...

.. //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linux/linux_file.c#12 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/init_sysent.c#5 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.c#5 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.master#5 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/systrace_args.c#5 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#28 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.h#5 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.mk#5 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#12 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/sysproto.h#5 edit

Differences ...

==== //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linux/linux_file.c#12 (text+ko) ====

@@ -1018,7 +1018,7 @@
 			args->newdfd, to, args->flags);
 #endif
 
-	error = kern_linkat(td, path, to, UIO_SYSSPACE, olddfd, newdfd);
+	error = kern_linkat(td, path, to, UIO_SYSSPACE, olddfd, newdfd, FOLLOW);
 	LFREEPATH(path);
 	LFREEPATH(to);
 	return (error);

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/init_sysent.c#5 (text+ko) ====

@@ -508,4 +508,15 @@
 	{ AS(fchmodat_args), (sy_call_t *)fchmodat, AUE_CHMOD, NULL, 0, 0 },	/* 476 = fchmodat */
 	{ AS(fchownat_args), (sy_call_t *)fchownat, AUE_CHOWN, NULL, 0, 0 },	/* 477 = fchownat */
 	{ AS(fexecve_args), (sy_call_t *)fexecve, AUE_EXECVE, NULL, 0, 0 },	/* 478 = fexecve */
+	{ AS(fstatat_args), (sy_call_t *)fstatat, AUE_STAT, NULL, 0, 0 },	/* 479 = fstatat */
+	{ AS(futimesat_args), (sy_call_t *)futimesat, AUE_UTIMES, NULL, 0, 0 },	/* 480 = futimesat */
+	{ AS(linkat_args), (sy_call_t *)linkat, AUE_LINK, NULL, 0, 0 },	/* 481 = linkat */
+	{ AS(mkdirat_args), (sy_call_t *)mkdirat, AUE_MKDIR, NULL, 0, 0 },	/* 482 = mkdirat */
+	{ AS(mkfifoat_args), (sy_call_t *)mkfifoat, AUE_MKFIFO, NULL, 0, 0 },	/* 483 = mkfifoat */
+	{ AS(mknodat_args), (sy_call_t *)mknodat, AUE_MKNOD, NULL, 0, 0 },	/* 484 = mknodat */
+	{ AS(openat_args), (sy_call_t *)openat, AUE_OPEN_RWTC, NULL, 0, 0 },	/* 485 = openat */
+	{ AS(readlinkat_args), (sy_call_t *)readlinkat, AUE_READLINK, NULL, 0, 0 },	/* 486 = readlinkat */
+	{ AS(renameat_args), (sy_call_t *)renameat, AUE_RENAME, NULL, 0, 0 },	/* 487 = renameat */
+	{ AS(symlinkat_args), (sy_call_t *)symlinkat, AUE_SYMLINK, NULL, 0, 0 },	/* 488 = symlinkat */
+	{ AS(unlinkat_args), (sy_call_t *)unlinkat, AUE_UNLINK, NULL, 0, 0 },	/* 489 = unlinkat */
 };

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.c#5 (text+ko) ====

@@ -486,4 +486,15 @@
 	"fchmodat",			/* 476 = fchmodat */
 	"fchownat",			/* 477 = fchownat */
 	"fexecve",			/* 478 = fexecve */
+	"fstatat",			/* 479 = fstatat */
+	"futimesat",			/* 480 = futimesat */
+	"linkat",			/* 481 = linkat */
+	"mkdirat",			/* 482 = mkdirat */
+	"mkfifoat",			/* 483 = mkfifoat */
+	"mknodat",			/* 484 = mknodat */
+	"openat",			/* 485 = openat */
+	"readlinkat",			/* 486 = readlinkat */
+	"renameat",			/* 487 = renameat */
+	"symlinkat",			/* 488 = symlinkat */
+	"unlinkat",			/* 489 = unlinkat */
 };

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.master#5 (text+ko) ====

@@ -839,5 +839,17 @@
 476	AUE_CHMOD	STD	{ int fchmodat(int dirfd, char *path, mode_t mode, int flag); }
 477	AUE_CHOWN	STD	{ int fchownat(int dirfd, char *path, uid_t uid, gid_t gid, int flag); }
 478	AUE_EXECVE	STD	{ int fexecve(int fd, char **argv, char **envv); }
+479	AUE_STAT	STD	{ int fstatat(int fd, char *path, struct stat *buf, int flag); }
+480	AUE_UTIMES	STD	{ int futimesat(int fd, char *path, struct timeval *times); }
+481	AUE_LINK	STD	{ int linkat(int fd1, char *path1, int fd2, char *path2, int flag); }
+482	AUE_MKDIR	STD	{ int mkdirat(int fd, char *path, mode_t mode); }
+483	AUE_MKFIFO	STD	{ int mkfifoat(int fd, char *path, mode_t mode); }
+484	AUE_MKNOD	STD	{ int mknodat(int fd, char *path, mode_t mode, dev_t dev); }
+; XXX: see the comment for open
+485	AUE_OPEN_RWTC	STD	{ int openat(int fd, char *path, int flag, mode_t mode); }
+486	AUE_READLINK	STD	{ ssize_t readlinkat(int fd, char *path, char *buf, size_t bufsize); }
+487	AUE_RENAME	STD	{ int renameat(int oldfd, char *old, int newfd, char *new); }
+488	AUE_SYMLINK	STD	{ int symlinkat(char *path1, int fd, char *path2); }
+489	AUE_UNLINK	STD	{ int unlinkat(int fd, char *path, int flag); }
 ; Please copy any additions and changes to the following compatability tables:
 ; sys/compat/freebsd32/syscalls.master

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/systrace_args.c#5 (text+ko) ====

@@ -2845,6 +2845,112 @@
 		*n_args = 3;
 		break;
 	}
+	/* fstatat */
+	case 479: {
+		struct fstatat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		uarg[2] = (intptr_t) p->buf; /* struct stat * */
+		iarg[3] = p->flag; /* int */
+		*n_args = 4;
+		break;
+	}
+	/* futimesat */
+	case 480: {
+		struct futimesat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		uarg[2] = (intptr_t) p->times; /* struct timeval * */
+		*n_args = 3;
+		break;
+	}
+	/* linkat */
+	case 481: {
+		struct linkat_args *p = params;
+		iarg[0] = p->fd1; /* int */
+		uarg[1] = (intptr_t) p->path1; /* char * */
+		iarg[2] = p->fd2; /* int */
+		uarg[3] = (intptr_t) p->path2; /* char * */
+		iarg[4] = p->flag; /* int */
+		*n_args = 5;
+		break;
+	}
+	/* mkdirat */
+	case 482: {
+		struct mkdirat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		iarg[2] = p->mode; /* mode_t */
+		*n_args = 3;
+		break;
+	}
+	/* mkfifoat */
+	case 483: {
+		struct mkfifoat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		iarg[2] = p->mode; /* mode_t */
+		*n_args = 3;
+		break;
+	}
+	/* mknodat */
+	case 484: {
+		struct mknodat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		iarg[2] = p->mode; /* mode_t */
+		iarg[3] = p->dev; /* dev_t */
+		*n_args = 4;
+		break;
+	}
+	/* openat */
+	case 485: {
+		struct openat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		iarg[2] = p->flag; /* int */
+		iarg[3] = p->mode; /* mode_t */
+		*n_args = 4;
+		break;
+	}
+	/* readlinkat */
+	case 486: {
+		struct readlinkat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		uarg[2] = (intptr_t) p->buf; /* char * */
+		uarg[3] = p->bufsize; /* size_t */
+		*n_args = 4;
+		break;
+	}
+	/* renameat */
+	case 487: {
+		struct renameat_args *p = params;
+		iarg[0] = p->oldfd; /* int */
+		uarg[1] = (intptr_t) p->old; /* char * */
+		iarg[2] = p->newfd; /* int */
+		uarg[3] = (intptr_t) p->new; /* char * */
+		*n_args = 4;
+		break;
+	}
+	/* symlinkat */
+	case 488: {
+		struct symlinkat_args *p = params;
+		uarg[0] = (intptr_t) p->path1; /* char * */
+		iarg[1] = p->fd; /* int */
+		uarg[2] = (intptr_t) p->path2; /* char * */
+		*n_args = 3;
+		break;
+	}
+	/* unlinkat */
+	case 489: {
+		struct unlinkat_args *p = params;
+		iarg[0] = p->fd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		iarg[2] = p->flag; /* int */
+		*n_args = 3;
+		break;
+	}
 	default:
 		*n_args = 0;
 		break;

==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#28 (text+ko) ====

@@ -955,7 +955,21 @@
 	return kern_open(td, uap->path, UIO_USERSPACE, uap->flags, uap->mode);
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct openat_args {
+	int	fd;
+	char	*path;
+	int	flag;
+	int	mode;
+};
+#endif
 int
+openat(struct thread *td, struct openat_args *args)
+{
+	return kern_openat(td, args->path, UIO_USERSPACE, args->flag, args->mode, args->fd);
+}
+
+int
 kern_open(struct thread *td, char *path, enum uio_seg pathseg, int flags,
     int mode)
 {
@@ -1200,6 +1214,19 @@
 	return (kern_mknod(td, uap->path, UIO_USERSPACE, uap->mode, uap->dev));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct mknodat_args {
+	char	*path;
+	mode_t	mode;
+	dev_t	dev;
+};
+#endif
+int
+mknodat(struct thread *td, struct mknodat_args *args)
+{
+	return kern_mknodat(td, args->path, UIO_USERSPACE, args->mode, args->dev, args->fd);
+}
+
 int
 kern_mknod(struct thread *td, char *path, enum uio_seg pathseg, int mode,
     int dev)
@@ -1348,6 +1375,19 @@
 	return (kern_mkfifo(td, uap->path, UIO_USERSPACE, uap->mode));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct mkfifoat_args {
+	int	fd;
+	char	*path;
+	mode_t	mode;
+};
+#endif
+int
+mkfifoat(struct thread *td, struct mkfifoat_args *args)
+{
+	return kern_mkfifoat(td, args->path, UIO_USERSPACE, args->mode, args->fd);
+}
+
 int
 kern_mkfifo(struct thread *td, char *path, enum uio_seg pathseg, int mode)
 {
@@ -1453,6 +1493,27 @@
 	return (error);
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct linkat_args {
+   	int	fd1;
+	char	*path1;
+	int	fd2;
+	char	*path2;
+	int	flag;
+};
+#endif
+int
+linkat(struct thread *td, struct linkat_args *args)
+{
+   	if (args->flag & ~AT_SYMLINK_NOFOLLOW)
+		return (EINVAL);
+
+	if (args->flag & AT_SYMLINK_NOFOLLOW)
+		return kern_linkat(td, args->path1, args->path2, UIO_USERSPACE, args->fd1, args->fd2, 0);
+	else
+		return kern_linkat(td, args->path1, args->path2, UIO_USERSPACE, args->fd1, args->fd2, FOLLOW);
+}
+
 static int hardlink_check_uid = 0;
 SYSCTL_INT(_security_bsd, OID_AUTO, hardlink_check_uid, CTLFLAG_RW,
     &hardlink_check_uid, 0,
@@ -1495,12 +1556,12 @@
 int
 kern_link(struct thread *td, char *path, char *link, enum uio_seg segflg)
 {
-	return kern_linkat(td, path, link, segflg, AT_FDCWD, AT_FDCWD);
+	return kern_linkat(td, path, link, segflg, AT_FDCWD, AT_FDCWD, FOLLOW);
 }
 
 int
 kern_linkat(struct thread *td, char *path, char *link, enum uio_seg segflg,
-    int olddirfd, int newdirfd)
+    int olddirfd, int newdirfd, int follow)
 {
 	struct nameidata ndp, ndl;
 	int error;
@@ -1514,7 +1575,7 @@
 	if (error && !kern_absolute_path(path, segflg))
 		return (error);
 
-	NDINIT_AT(&ndp, LOOKUP, ((error) ? ATBADF : 0) | FOLLOW | MPSAFE 
+	NDINIT_AT(&ndp, LOOKUP, ((error) ? ATBADF : 0) | follow | MPSAFE 
 	    | AUDITVNODE1, segflg, path, td, pdir_vn);
 
 	error = kern_get_at(td, newdirfd, &ldir_vn);
@@ -1601,7 +1662,20 @@
 	return (kern_symlink(td, uap->path, uap->link, UIO_USERSPACE));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct symlinkat_args {
+	char	*path;
+	int	fd;
+	char	*path2;
+};
+#endif
 int
+symlinkat(struct thread *td, struct symlinkat_args *args)
+{
+	return kern_symlinkat(td, args->path1, args->path2, UIO_USERSPACE, args->fd);
+}
+
+int
 kern_symlink(struct thread *td, char *path, char *link, enum uio_seg segflg)
 {
 	return kern_symlinkat(td, path, link, segflg, AT_FDCWD);
@@ -1761,6 +1835,25 @@
 	return (error);
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct unlinkat_args {
+	int	fd;
+	char	*path;
+	int	flag;
+};
+#endif
+int
+unlinkat(struct thread *td, struct unlinkat_args *args)
+{
+	if (args->flag & ~AT_REMOVEDIR)
+		return (EINVAL);
+
+	if (args->flag & AT_REMOVEDIR)
+		return kern_rmdirat(td, args->path, UIO_USERSPACE, args->fd);
+	else
+		return kern_unlinkat(td, args->path, UIO_USERSPACE, args->fd);
+}
+
 int
 kern_unlink(struct thread *td, char *path, enum uio_seg pathseg)
 {
@@ -2249,6 +2342,26 @@
 	return (error);
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct fstatat_args {
+	int	fd;
+	char	*path;
+	struct stat	*buf;
+	int	flag;
+}
+#endif
+int
+fstatat(struct thread *td, struct fstatat_args *args)
+{
+	if (args->flag & ~AT_SYMLINK_NOFOLLOW)
+		return (EINVAL);
+
+	if (args->flag & AT_SYMLINK_NOFOLLOW)
+		return kern_lstatat(td, args->path, UIO_USERSPACE, args->buf, args->fd);
+	else
+		return kern_statat(td, args->path, UIO_USERSPACE, args->buf, args->fd);
+}
+
 int
 kern_stat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp)
 {
@@ -2506,6 +2619,20 @@
 	return (kern_readlink(td, uap->path, UIO_USERSPACE, uap->buf,
 	    UIO_USERSPACE, uap->count));
 }
+#ifndef _SYS_SYSPROTO_H_
+struct readlinkat_args {
+	int	fd;
+	char	*path;
+	char	*buf;
+	size_t	bufsize;
+};
+#endif
+ssize_t
+readlinkat(struct thread *td, struct readlinkat_args *args)
+{
+	return kern_readlinkat(td, args->path, UIO_USERSPACE, 
+	    args->buf, UIO_USERSPACE, args->bufsize, args->fd);
+}
 
 int
 kern_readlink(struct thread *td, char *path, enum uio_seg pathseg, char *buf,
@@ -3199,7 +3326,15 @@
 	    UIO_USERSPACE));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+#endif
 int
+futimesat(struct thread *td, struct futimesat_args *args)
+{
+	return kern_utimesat(td, args->path, UIO_USERSPACE, args->times, UIO_USERSPACE, args->fd);
+}
+
+int
 kern_utimes(struct thread *td, char *path, enum uio_seg pathseg,
     struct timeval *tptr, enum uio_seg tptrseg)
 {
@@ -3581,6 +3716,20 @@
 	return (kern_rename(td, uap->from, uap->to, UIO_USERSPACE));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct renameat_args {
+	int	oldfd;
+	char	*old;
+	int	newfd;
+	char	*new;
+};
+#endif
+int
+renameat(struct thread *td, struct renameat_args *args)
+{
+	return kern_renameat(td, args->old, args->new, UIO_USERSPACE, args->oldfd, args->newfd);
+}
+
 int
 kern_rename(struct thread *td, char *from, char *to, enum uio_seg pathseg)
 {
@@ -3737,6 +3886,19 @@
 	return (kern_mkdir(td, uap->path, UIO_USERSPACE, uap->mode));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct mkdirat_args {
+	int	fd;
+	char	*path;
+	mode_t	mode;
+};
+#endif
+int
+mkdirat(struct thread *td, struct mkdirat_args *args)
+{
+	return kern_mkdirat(td, args->path, UIO_USERSPACE, args->mode, args->fd);
+}
+
 int
 kern_mkdir(struct thread *td, char *path, enum uio_seg segflg, int mode)
 {

==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.h#5 (text+ko) ====

@@ -398,4 +398,15 @@
 #define	SYS_fchmodat	476
 #define	SYS_fchownat	477
 #define	SYS_fexecve	478
-#define	SYS_MAXSYSCALL	479
+#define	SYS_fstatat	479
+#define	SYS_futimesat	480
+#define	SYS_linkat	481
+#define	SYS_mkdirat	482
+#define	SYS_mkfifoat	483
+#define	SYS_mknodat	484
+#define	SYS_openat	485
+#define	SYS_readlinkat	486
+#define	SYS_renameat	487
+#define	SYS_symlinkat	488
+#define	SYS_unlinkat	489
+#define	SYS_MAXSYSCALL	490

==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.mk#5 (text+ko) ====

@@ -339,4 +339,15 @@
 	faccessat.o \
 	fchmodat.o \
 	fchownat.o \
-	fexecve.o
+	fexecve.o \
+	fstatat.o \
+	futimesat.o \
+	linkat.o \
+	mkdirat.o \
+	mkfifoat.o \
+	mknodat.o \
+	openat.o \
+	readlinkat.o \
+	renameat.o \
+	symlinkat.o \
+	unlinkat.o

==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#12 (text+ko) ====

@@ -115,7 +115,7 @@
 int	kern_link(struct thread *td, char *path, char *link,
 	    enum uio_seg segflg);
 int	kern_linkat(struct thread *td, char *path, char *link,
-	    enum uio_seg segflg, int olddfd, int newdfd);
+	    enum uio_seg segflg, int olddfd, int newdfd, int follow);
 int	kern_lstat(struct thread *td, char *path, enum uio_seg pathseg,
 	    struct stat *sbp);
 int	kern_lstatat(struct thread *td, char *path, enum uio_seg pathseg,

==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/sysproto.h#5 (text+ko) ====

@@ -1506,6 +1506,68 @@
 	char argv_l_[PADL_(char **)]; char ** argv; char argv_r_[PADR_(char **)];
 	char envv_l_[PADL_(char **)]; char ** envv; char envv_r_[PADR_(char **)];
 };
+struct fstatat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char buf_l_[PADL_(struct stat *)]; struct stat * buf; char buf_r_[PADR_(struct stat *)];
+	char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
+struct futimesat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char times_l_[PADL_(struct timeval *)]; struct timeval * times; char times_r_[PADR_(struct timeval *)];
+};
+struct linkat_args {
+	char fd1_l_[PADL_(int)]; int fd1; char fd1_r_[PADR_(int)];
+	char path1_l_[PADL_(char *)]; char * path1; char path1_r_[PADR_(char *)];
+	char fd2_l_[PADL_(int)]; int fd2; char fd2_r_[PADR_(int)];
+	char path2_l_[PADL_(char *)]; char * path2; char path2_r_[PADR_(char *)];
+	char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
+struct mkdirat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
+};
+struct mkfifoat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
+};
+struct mknodat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
+	char dev_l_[PADL_(dev_t)]; dev_t dev; char dev_r_[PADR_(dev_t)];
+};
+struct openat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+	char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
+};
+struct readlinkat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
+	char bufsize_l_[PADL_(size_t)]; size_t bufsize; char bufsize_r_[PADR_(size_t)];
+};
+struct renameat_args {
+	char oldfd_l_[PADL_(int)]; int oldfd; char oldfd_r_[PADR_(int)];
+	char old_l_[PADL_(char *)]; char * old; char old_r_[PADR_(char *)];
+	char newfd_l_[PADL_(int)]; int newfd; char newfd_r_[PADR_(int)];
+	char new_l_[PADL_(char *)]; char * new; char new_r_[PADR_(char *)];
+};
+struct symlinkat_args {
+	char path1_l_[PADL_(char *)]; char * path1; char path1_r_[PADR_(char *)];
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path2_l_[PADL_(char *)]; char * path2; char path2_r_[PADR_(char *)];
+};
+struct unlinkat_args {
+	char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
 int	nosys(struct thread *, struct nosys_args *);
 void	sys_exit(struct thread *, struct sys_exit_args *);
 int	fork(struct thread *, struct fork_args *);
@@ -1842,6 +1904,17 @@
 int	fchmodat(struct thread *, struct fchmodat_args *);
 int	fchownat(struct thread *, struct fchownat_args *);
 int	fexecve(struct thread *, struct fexecve_args *);
+int	fstatat(struct thread *, struct fstatat_args *);
+int	futimesat(struct thread *, struct futimesat_args *);
+int	linkat(struct thread *, struct linkat_args *);
+int	mkdirat(struct thread *, struct mkdirat_args *);
+int	mkfifoat(struct thread *, struct mkfifoat_args *);
+int	mknodat(struct thread *, struct mknodat_args *);
+int	openat(struct thread *, struct openat_args *);
+int	readlinkat(struct thread *, struct readlinkat_args *);
+int	renameat(struct thread *, struct renameat_args *);
+int	symlinkat(struct thread *, struct symlinkat_args *);
+int	unlinkat(struct thread *, struct unlinkat_args *);
 
 #ifdef COMPAT_43
 
@@ -2397,6 +2470,17 @@
 #define	SYS_AUE_fchmodat	AUE_CHMOD
 #define	SYS_AUE_fchownat	AUE_CHOWN
 #define	SYS_AUE_fexecve	AUE_EXECVE
+#define	SYS_AUE_fstatat	AUE_STAT
+#define	SYS_AUE_futimesat	AUE_UTIMES
+#define	SYS_AUE_linkat	AUE_LINK
+#define	SYS_AUE_mkdirat	AUE_MKDIR
+#define	SYS_AUE_mkfifoat	AUE_MKFIFO
+#define	SYS_AUE_mknodat	AUE_MKNOD
+#define	SYS_AUE_openat	AUE_OPEN_RWTC
+#define	SYS_AUE_readlinkat	AUE_READLINK
+#define	SYS_AUE_renameat	AUE_RENAME
+#define	SYS_AUE_symlinkat	AUE_SYMLINK
+#define	SYS_AUE_unlinkat	AUE_UNLINK
 
 #undef PAD_
 #undef PADL_


More information about the p4-projects mailing list