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>