From owner-p4-projects@FreeBSD.ORG Sun Jun 3 13:12:09 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 7B1FB16A46C; Sun, 3 Jun 2007 13:12:09 +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 0DBE716A468 for ; Sun, 3 Jun 2007 13:12:09 +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 F1D7213C4BC for ; Sun, 3 Jun 2007 13:12:08 +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 l53DC8vN060811 for ; Sun, 3 Jun 2007 13:12:08 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l53DC83q060793 for perforce@freebsd.org; Sun, 3 Jun 2007 13:12:08 GMT (envelope-from rdivacky@FreeBSD.org) Date: Sun, 3 Jun 2007 13:12:08 GMT Message-Id: <200706031312.l53DC83q060793@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 120838 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: Sun, 03 Jun 2007 13:12:09 -0000 http://perforce.freebsd.org/chv.cgi?CH=120838 Change 120838 by rdivacky@rdivacky_witten on 2007/06/03 13:11:39 Implement linux_chmodat(). Affected files ... .. //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_dummy.c#5 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_syscall.h#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_sysent.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/syscalls.master#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linux/linux_file.c#6 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_dummy.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_proto.h#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_syscall.h#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_sysent.c#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/syscalls.master#4 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#12 edit .. //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#5 edit Differences ... ==== //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_dummy.c#5 (text+ko) ==== @@ -104,7 +104,6 @@ DUMMY(linkat); DUMMY(symlinkat); DUMMY(readlinkat); -DUMMY(fchmodat); DUMMY(pselect6); DUMMY(ppoll); DUMMY(unshare); ==== //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_proto.h#4 (text+ko) ==== @@ -917,7 +917,9 @@ register_t dummy; }; struct linux_fchmodat_args { - register_t dummy; + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; + char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)]; + char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)]; }; struct linux_faccessat_args { char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; ==== //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_syscall.h#4 (text+ko) ==== ==== //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/linux32_sysent.c#4 (text+ko) ==== @@ -326,7 +326,7 @@ { 0, (sy_call_t *)linux_linkat, AUE_NULL, NULL, 0, 0 }, /* 303 = linux_linkat */ { 0, (sy_call_t *)linux_symlinkat, AUE_NULL, NULL, 0, 0 }, /* 304 = linux_symlinkat */ { 0, (sy_call_t *)linux_readlinkat, AUE_NULL, NULL, 0, 0 }, /* 305 = linux_readlinkat */ - { 0, (sy_call_t *)linux_fchmodat, AUE_NULL, NULL, 0, 0 }, /* 306 = linux_fchmodat */ + { AS(linux_fchmodat_args), (sy_call_t *)linux_fchmodat, AUE_NULL, NULL, 0, 0 }, /* 306 = linux_fchmodat */ { AS(linux_faccessat_args), (sy_call_t *)linux_faccessat, AUE_NULL, NULL, 0, 0 }, /* 307 = linux_faccessat */ { 0, (sy_call_t *)linux_pselect6, AUE_NULL, NULL, 0, 0 }, /* 308 = linux_pselect6 */ { 0, (sy_call_t *)linux_ppoll, AUE_NULL, NULL, 0, 0 }, /* 309 = linux_ppoll */ ==== //depot/projects/soc2007/rdivacky/linux_at/sys/amd64/linux32/syscalls.master#4 (text+ko) ==== @@ -477,7 +477,8 @@ 303 AUE_NULL STD { int linux_linkat(void); } 304 AUE_NULL STD { int linux_symlinkat(void); } 305 AUE_NULL STD { int linux_readlinkat(void); } -306 AUE_NULL STD { int linux_fchmodat(void); } +306 AUE_NULL STD { int linux_fchmodat(l_int dfd, char *filename, \ + l_mode_t mode); } 307 AUE_NULL STD { int linux_faccessat(l_int dfd, char *filename, l_int mode); } 308 AUE_NULL STD { int linux_pselect6(void); } 309 AUE_NULL STD { int linux_ppoll(void); } ==== //depot/projects/soc2007/rdivacky/linux_at/sys/compat/linux/linux_file.c#6 (text+ko) ==== @@ -664,6 +664,28 @@ } int +linux_fchmodat(struct thread *td, struct linux_fchmodat_args *args) +{ + char *path; + int error, dfd; + + LCONVPATHEXIST(td, args->filename, &path); + +#ifdef DEBUG + if (ldebug(fchownat)) + printf(ARGS(fchownat, "%s, %d, %d"), path, args->uid, args->gid); +#endif + + if (args->dfd == LINUX_AT_FDCWD) + dfd = AT_FDCWD; + else + dfd = args->dfd; + + error = kern_chmodat(td, path, UIO_SYSSPACE, args->mode, dfd); + LFREEPATH(path); + return (error); +} +int linux_mkdir(struct thread *td, struct linux_mkdir_args *args) { char *path; ==== //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_dummy.c#4 (text+ko) ==== @@ -95,7 +95,6 @@ DUMMY(linkat); DUMMY(symlinkat); DUMMY(readlinkat); -DUMMY(fchmodat); DUMMY(pselect6); DUMMY(ppoll); DUMMY(unshare); ==== //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_proto.h#4 (text+ko) ==== @@ -936,7 +936,9 @@ register_t dummy; }; struct linux_fchmodat_args { - register_t dummy; + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; + char filename_l_[PADL_(char *)]; char * filename; char filename_r_[PADR_(char *)]; + char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)]; }; struct linux_faccessat_args { char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; ==== //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_syscall.h#4 (text+ko) ==== ==== //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/linux_sysent.c#4 (text+ko) ==== @@ -325,7 +325,7 @@ { 0, (sy_call_t *)linux_linkat, AUE_NULL, NULL, 0, 0 }, /* 303 = linux_linkat */ { 0, (sy_call_t *)linux_symlinkat, AUE_NULL, NULL, 0, 0 }, /* 304 = linux_symlinkat */ { 0, (sy_call_t *)linux_readlinkat, AUE_NULL, NULL, 0, 0 }, /* 305 = linux_readlinkat */ - { 0, (sy_call_t *)linux_fchmodat, AUE_NULL, NULL, 0, 0 }, /* 306 = linux_fchmodat */ + { AS(linux_fchmodat_args), (sy_call_t *)linux_fchmodat, AUE_NULL, NULL, 0, 0 }, /* 306 = linux_fchmodat */ { AS(linux_faccessat_args), (sy_call_t *)linux_faccessat, AUE_NULL, NULL, 0, 0 }, /* 307 = linux_faccessat */ { 0, (sy_call_t *)linux_pselect6, AUE_NULL, NULL, 0, 0 }, /* 308 = linux_pselect6 */ { 0, (sy_call_t *)linux_ppoll, AUE_NULL, NULL, 0, 0 }, /* 309 = linux_ppoll */ ==== //depot/projects/soc2007/rdivacky/linux_at/sys/i386/linux/syscalls.master#4 (text+ko) ==== @@ -487,7 +487,8 @@ 303 AUE_NULL STD { int linux_linkat(void); } 304 AUE_NULL STD { int linux_symlinkat(void); } 305 AUE_NULL STD { int linux_readlinkat(void); } -306 AUE_NULL STD { int linux_fchmodat(void); } +306 AUE_NULL STD { int linux_fchmodat(l_int dfd, char *filename, \ + l_mode_t mode); } 307 AUE_NULL STD { int linux_faccessat(l_int dfd, char *filename, l_int mode); } 308 AUE_NULL STD { int linux_pselect6(void); } 309 AUE_NULL STD { int linux_ppoll(void); } ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#12 (text+ko) ==== @@ -99,6 +99,7 @@ struct nameidata *nd); static int kern_common_lchown(struct thread *td, int uid, int gid, struct nameidata *nd); +static int kern_common_chmod(struct thread *td, int mode, struct nameidata *nd); /* * The module initialization routine for POSIX asynchronous I/O will @@ -2672,18 +2673,52 @@ int kern_chmod(struct thread *td, char *path, enum uio_seg pathseg, int mode) { + struct nameidata nd; + AUDIT_ARG(mode, mode); + NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td); + + return kern_common_chmod(td, mode, &nd); +} + +int +kern_chmodat(struct thread *td, char *path, enum uio_seg pathseg, int mode, int dirfd) +{ int error; struct nameidata nd; + struct vnode *dir_vn; + + if (dirfd == AT_FDCWD) + dir_vn = NULL; + else { + error = fgetvp(td, dirfd, &dir_vn); + if (error) + return (error); + if (dir_vn->v_type != VDIR) { + vrele(dir_vn); + return (ENOTDIR); + } + } + + NDINIT_AT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td, dir_vn); + + error = kern_common_chmod(td, mode, &nd); + if (dirfd != AT_FDCWD) + vrele(dir_vn); + return (error); +} + +static int +kern_common_chmod(struct thread *td, int mode, struct nameidata *nd) +{ + int error; int vfslocked; - AUDIT_ARG(mode, mode); - NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, td); - if ((error = namei(&nd)) != 0) + if ((error = namei(nd)) != 0) return (error); - vfslocked = NDHASGIANT(&nd); - NDFREE(&nd, NDF_ONLY_PNBUF); - error = setfmode(td, nd.ni_vp, mode); - vrele(nd.ni_vp); + vfslocked = NDHASGIANT(nd); + NDFREE(nd, NDF_ONLY_PNBUF); + error = setfmode(td, nd->ni_vp, mode); + vrele(nd->ni_vp); VFS_UNLOCK_GIANT(vfslocked); return (error); } @@ -2852,7 +2887,6 @@ if (dirfd != AT_FDCWD) vrele(dir_vn); return (error); - } static int ==== //depot/projects/soc2007/rdivacky/linux_at/sys/sys/syscallsubr.h#5 (text+ko) ==== @@ -65,6 +65,8 @@ int kern_chdir(struct thread *td, char *path, enum uio_seg pathseg); int kern_chmod(struct thread *td, char *path, enum uio_seg pathseg, int mode); +int kern_chmodat(struct thread *td, char *path, enum uio_seg pathseg, + int mode, int dirfd); int kern_chown(struct thread *td, char *path, enum uio_seg pathseg, int uid, int gid); int kern_chownat(struct thread *td, char *path, enum uio_seg pathseg, int uid,