From owner-p4-projects@FreeBSD.ORG Thu Jun 21 13:07:37 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EB50316A46C; Thu, 21 Jun 2007 13:07:36 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id ACD0D16A469 for ; Thu, 21 Jun 2007 13:07:36 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 9DB0113C45D for ; Thu, 21 Jun 2007 13:07:36 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l5LD7axa075075 for ; Thu, 21 Jun 2007 13:07:36 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l5LD7a54075072 for perforce@freebsd.org; Thu, 21 Jun 2007 13:07:36 GMT (envelope-from rdivacky@FreeBSD.org) Date: Thu, 21 Jun 2007 13:07:36 GMT Message-Id: <200706211307.l5LD7a54075072@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rdivacky@FreeBSD.org using -f From: Roman Divacky To: Perforce Change Reviews Cc: Subject: PERFORCE change 122092 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jun 2007 13:07:37 -0000 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_