Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Jun 2007 13:07:36 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 122092 for review
Message-ID:  <200706211307.l5LD7a54075072@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122092

Change 122092 by rdivacky@rdivacky_witten on 2007/06/21 13:06:56

	Introduce fchmodat, fchownat. Change "flags" arugment ot faccessat
	to "flag" to be consistent with the rest.

Affected files ...

.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/init_sysent.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/syscalls.master#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/systrace_args.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#27 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.h#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscall.mk#3 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#11 edit
.. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/sysproto.h#3 edit

Differences ...

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

@@ -505,4 +505,6 @@
 	{ AS(sctp_generic_sendmsg_iov_args), (sy_call_t *)sctp_generic_sendmsg_iov, AUE_NULL, NULL, 0, 0 },	/* 473 = sctp_generic_sendmsg_iov */
 	{ AS(sctp_generic_recvmsg_args), (sy_call_t *)sctp_generic_recvmsg, AUE_NULL, NULL, 0, 0 },	/* 474 = sctp_generic_recvmsg */
 	{ AS(faccessat_args), (sy_call_t *)faccessat, AUE_ACCESS, NULL, 0, 0 },	/* 475 = faccessat */
+	{ 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 */
 };

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

@@ -483,4 +483,6 @@
 	"sctp_generic_sendmsg_iov",			/* 473 = sctp_generic_sendmsg_iov */
 	"sctp_generic_recvmsg",			/* 474 = sctp_generic_recvmsg */
 	"faccessat",			/* 475 = faccessat */
+	"fchmodat",			/* 476 = fchmodat */
+	"fchownat",			/* 477 = fchownat */
 };

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

@@ -835,6 +835,8 @@
 474     AUE_NULL        STD    { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \
 				    struct sockaddr * from, __socklen_t *fromlenaddr, \
 				    struct sctp_sndrcvinfo *sinfo, int *msg_flags); }
-475	AUE_ACCESS	STD	{ int faccessat(int dirfd, char *path, int mode, int flags); }
+475	AUE_ACCESS	STD	{ int faccessat(int dirfd, char *path, int mode, int flag); }
+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); }
 ; 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#3 (text+ko) ====

@@ -2811,10 +2811,31 @@
 		iarg[0] = p->dirfd; /* int */
 		uarg[1] = (intptr_t) p->path; /* char * */
 		iarg[2] = p->mode; /* int */
-		iarg[3] = p->flags; /* int */
+		iarg[3] = p->flag; /* int */
+		*n_args = 4;
+		break;
+	}
+	/* fchmodat */
+	case 476: {
+		struct fchmodat_args *p = params;
+		iarg[0] = p->dirfd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		iarg[2] = p->mode; /* mode_t */
+		iarg[3] = p->flag; /* int */
 		*n_args = 4;
 		break;
 	}
+	/* fchownat */
+	case 477: {
+		struct fchownat_args *p = params;
+		iarg[0] = p->dirfd; /* int */
+		uarg[1] = (intptr_t) p->path; /* char * */
+		uarg[2] = p->uid; /* uid_t */
+		iarg[3] = p->gid; /* gid_t */
+		iarg[4] = p->flag; /* int */
+		*n_args = 5;
+		break;
+	}
 	default:
 		*n_args = 0;
 		break;

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

@@ -2026,15 +2026,15 @@
 	int	dirfd;
 	char	*path;
 	int	mode;
-	int	flags;
+	int	flag;
 }
 #endif
 int faccessat(struct thread *td, struct faccessat_args *args)
 {
-	if (args->flags & ~AT_EACCESS)
+	if (args->flag & ~AT_EACCESS)
 		return (EINVAL);
 	/* XXX: what about mode? */
-	return kern_accessat(td, args->path, UIO_USERSPACE, args->flags, args->dirfd);
+	return kern_accessat(td, args->path, UIO_USERSPACE, args->flag, args->dirfd);
 }
 
 int
@@ -2759,6 +2759,26 @@
 	return (kern_chmod(td, uap->path, UIO_USERSPACE, uap->mode));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+struct fchmodat_args {
+	int	dirfd;
+	char	*path;
+	mode_t	mode;
+	int	flag;
+}
+#endif
+int
+fchmodat(struct thread *td, struct fchmodat_args *args)
+{
+	if (args->flag & ~AT_SYMLINK_NOFOLLOW)
+		return (EINVAL);
+
+	if (args->flag & AT_SYMLINK_NOFOLLOW)
+		return kern_lchmodat(td, args->path, UIO_USERSPACE, args->mode, args->dirfd);
+	else
+		return kern_chmodat(td, args->path, UIO_USERSPACE, args->mode, args->dirfd);
+}
+
 int
 kern_chmod(struct thread *td, char *path, enum uio_seg pathseg, int mode)
 {
@@ -2809,18 +2829,30 @@
 		int mode;
 	} */ *uap;
 {
+	return kern_lchmodat(td, uap->path, UIO_USERSPACE, uap->mode, AT_FDCWD);
+}
+
+
+int
+kern_lchmodat(struct thread *td, char *path, enum uio_seg pathseg, mode_t mode, int dirfd)
+{
 	int error;
 	struct nameidata nd;
 	int vfslocked;
+	struct vnode *dir_vn;
+
+	error = kern_get_at(td, dirfd, &dir_vn);
+	if (error && !kern_absolute_path(path, pathseg))
+		return (error);
 
-	AUDIT_ARG(mode, (mode_t)uap->mode);
-	NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, UIO_USERSPACE,
-	    uap->path, td);
+	AUDIT_ARG(mode, mode);
+	NDINIT_AT(&nd, LOOKUP, NOFOLLOW | MPSAFE | AUDITVNODE1, pathseg,
+	    path, td, dir_vn);
 	if ((error = namei(&nd)) != 0)
 		return (error);
 	vfslocked = NDHASGIANT(&nd);
 	NDFREE(&nd, NDF_ONLY_PNBUF);
-	error = setfmode(td, nd.ni_vp, uap->mode);
+	error = setfmode(td, nd.ni_vp, mode);
 	vrele(nd.ni_vp);
 	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
@@ -2918,6 +2950,23 @@
 	return (kern_chown(td, uap->path, UIO_USERSPACE, uap->uid, uap->gid));
 }
 
+#ifndef _SYS_SYSPROTO_H_
+#endif
+int
+fchownat(struct thread *td, struct fchownat_args *args)
+{
+	if (args->flag & ~AT_SYMLINK_NOFOLLOW)
+		return (EINVAL);
+
+	if (args->flag & AT_SYMLINK_NOFOLLOW)
+		return kern_lchownat(td, args->path, UIO_USERSPACE, args->uid,
+			args->gid, args->dirfd);
+	else
+		return kern_chownat(td, args->path, UIO_USERSPACE, args->uid,
+			args->gid, args->dirfd);
+}
+
+
 int
 kern_chown(struct thread *td, char *path, enum uio_seg pathseg, int uid,
     int gid)

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

@@ -395,4 +395,6 @@
 #define	SYS_sctp_generic_sendmsg_iov	473
 #define	SYS_sctp_generic_recvmsg	474
 #define	SYS_faccessat	475
-#define	SYS_MAXSYSCALL	476
+#define	SYS_fchmodat	476
+#define	SYS_fchownat	477
+#define	SYS_MAXSYSCALL	478

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

@@ -336,4 +336,6 @@
 	sctp_generic_sendmsg.o \
 	sctp_generic_sendmsg_iov.o \
 	sctp_generic_recvmsg.o \
-	faccessat.o
+	faccessat.o \
+	fchmodat.o \
+	fchownat.o

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

@@ -70,6 +70,8 @@
 	    int mode, int dirfd);
 int	kern_chown(struct thread *td, char *path, enum uio_seg pathseg, int uid,
 	    int gid);
+int	kern_lchmodat(struct thread *td, char *path, enum uio_seg pathseg,
+	    mode_t mode, int dirfd);
 int	kern_chownat(struct thread *td, char *path, enum uio_seg pathseg, int uid,
 	    int gid, int dirfd);
 int	kern_clock_getres(struct thread *td, clockid_t clock_id,

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

@@ -1486,7 +1486,20 @@
 	char dirfd_l_[PADL_(int)]; int dirfd; char dirfd_r_[PADR_(int)];
 	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
 	char mode_l_[PADL_(int)]; int mode; char mode_r_[PADR_(int)];
-	char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
+	char flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
+struct fchmodat_args {
+	char dirfd_l_[PADL_(int)]; int dirfd; char dirfd_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 flag_l_[PADL_(int)]; int flag; char flag_r_[PADR_(int)];
+};
+struct fchownat_args {
+	char dirfd_l_[PADL_(int)]; int dirfd; char dirfd_r_[PADR_(int)];
+	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char uid_l_[PADL_(uid_t)]; uid_t uid; char uid_r_[PADR_(uid_t)];
+	char gid_l_[PADL_(gid_t)]; gid_t gid; char gid_r_[PADR_(gid_t)];
+	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 *);
@@ -1821,6 +1834,8 @@
 int	sctp_generic_sendmsg_iov(struct thread *, struct sctp_generic_sendmsg_iov_args *);
 int	sctp_generic_recvmsg(struct thread *, struct sctp_generic_recvmsg_args *);
 int	faccessat(struct thread *, struct faccessat_args *);
+int	fchmodat(struct thread *, struct fchmodat_args *);
+int	fchownat(struct thread *, struct fchownat_args *);
 
 #ifdef COMPAT_43
 
@@ -2373,6 +2388,8 @@
 #define	SYS_AUE_sctp_generic_sendmsg_iov	AUE_NULL
 #define	SYS_AUE_sctp_generic_recvmsg	AUE_NULL
 #define	SYS_AUE_faccessat	AUE_ACCESS
+#define	SYS_AUE_fchmodat	AUE_CHMOD
+#define	SYS_AUE_fchownat	AUE_CHOWN
 
 #undef PAD_
 #undef PADL_



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200706211307.l5LD7a54075072>