From owner-p4-projects Sun Sep 29 20:37:28 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3696437B404; Sun, 29 Sep 2002 20:37:18 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BD61B37B401 for ; Sun, 29 Sep 2002 20:37:17 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 394A343E42 for ; Sun, 29 Sep 2002 20:37:17 -0700 (PDT) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from freefall.freebsd.org (perforce@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.6/8.12.6) with ESMTP id g8U3bHCo092665 for ; Sun, 29 Sep 2002 20:37:17 -0700 (PDT) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by freefall.freebsd.org (8.12.6/8.12.6/Submit) id g8U3bG3V092662 for perforce@freebsd.org; Sun, 29 Sep 2002 20:37:16 -0700 (PDT) Date: Sun, 29 Sep 2002 20:37:16 -0700 (PDT) Message-Id: <200209300337.g8U3bG3V092662@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 18355 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://people.freebsd.org/~peter/p4db/chv.cgi?CH=18355 Change 18355 by rwatson@rwatson_tislabs on 2002/09/29 20:36:50 Introduce extattr_{delete,get,set}_link(), which are the same as extattr_{delete,get,set}_file() except that they don't follow symbolic links. Restore FOLLOW behavior to the _file() calls as present in the main tree, and use NOFOLLOW for _link(). This will permit user applications to directly manipulate extended attributes on symlinks. This is a rapid merge-to- main-tree target. Follow-up modifications to user extattr tools expected also. Affected files ... .. //depot/projects/trustedbsd/mac/sys/kern/init_sysent.c#32 edit .. //depot/projects/trustedbsd/mac/sys/kern/syscalls.c#32 edit .. //depot/projects/trustedbsd/mac/sys/kern/syscalls.master#28 edit .. //depot/projects/trustedbsd/mac/sys/kern/vfs_syscalls.c#83 edit .. //depot/projects/trustedbsd/mac/sys/sys/extattr.h#6 edit .. //depot/projects/trustedbsd/mac/sys/sys/syscall.h#32 edit .. //depot/projects/trustedbsd/mac/sys/sys/syscall.mk#32 edit .. //depot/projects/trustedbsd/mac/sys/sys/sysproto.h#33 edit Differences ... ==== //depot/projects/trustedbsd/mac/sys/kern/init_sysent.c#32 (text+ko) ==== @@ -427,4 +427,7 @@ { SYF_MPSAFE | AS(macctl_args), (sy_call_t *)macctl }, /* 396 = macctl */ { SYF_MPSAFE | AS(__mac_get_link_args), (sy_call_t *)__mac_get_link }, /* 397 = __mac_get_link */ { SYF_MPSAFE | AS(__mac_set_link_args), (sy_call_t *)__mac_set_link }, /* 398 = __mac_set_link */ + { AS(extattr_set_link_args), (sy_call_t *)extattr_set_link }, /* 399 = extattr_set_link */ + { AS(extattr_get_link_args), (sy_call_t *)extattr_get_link }, /* 400 = extattr_get_link */ + { AS(extattr_delete_link_args), (sy_call_t *)extattr_delete_link }, /* 401 = extattr_delete_link */ }; ==== //depot/projects/trustedbsd/mac/sys/kern/syscalls.c#32 (text+ko) ==== @@ -406,4 +406,7 @@ "macctl", /* 396 = macctl */ "__mac_get_link", /* 397 = __mac_get_link */ "__mac_set_link", /* 398 = __mac_set_link */ + "extattr_set_link", /* 399 = extattr_set_link */ + "extattr_get_link", /* 400 = extattr_get_link */ + "extattr_delete_link", /* 401 = extattr_delete_link */ }; ==== //depot/projects/trustedbsd/mac/sys/kern/syscalls.master#28 (text+ko) ==== @@ -576,3 +576,11 @@ struct mac *mac_p); } 398 MSTD BSD { int __mac_set_link(const char *path_p, \ struct mac *mac_p); } +399 STD BSD { int extattr_set_link(const char *path, \ + int attrnamespace, const char *attrname, \ + void *data, size_t nbytes); } +400 STD BSD { ssize_t extattr_get_link(const char *path, \ + int attrnamespace, const char *attrname, \ + void *data, size_t nbytes); } +401 STD BSD { int extattr_delete_link(const char *path, \ + int attrnamespace, const char *attrname); } ==== //depot/projects/trustedbsd/mac/sys/kern/vfs_syscalls.c#83 (text+ko) ==== @@ -3902,6 +3902,35 @@ } int +extattr_set_fd(td, uap) + struct thread *td; + struct extattr_set_fd_args /* { + syscallarg(int) fd; + syscallarg(int) attrnamespace; + syscallarg(const char *) attrname; + syscallarg(void *) data; + syscallarg(size_t) nbytes; + } */ *uap; +{ + struct file *fp; + char attrname[EXTATTR_MAXNAMELEN]; + int error; + + error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); + if (error) + return (error); + + if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + return (error); + + error = extattr_set_vp((struct vnode *)fp->f_data, uap->attrnamespace, + attrname, uap->data, uap->nbytes, td); + fdrop(fp, td); + + return (error); +} + +int extattr_set_file(td, uap) struct thread *td; struct extattr_set_file_args /* { @@ -3920,7 +3949,7 @@ if (error) return (error); - NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); @@ -3933,17 +3962,17 @@ } int -extattr_set_fd(td, uap) +extattr_set_link(td, uap) struct thread *td; - struct extattr_set_fd_args /* { - syscallarg(int) fd; + struct extattr_set_link_args /* { + syscallarg(const char *) path; syscallarg(int) attrnamespace; syscallarg(const char *) attrname; syscallarg(void *) data; syscallarg(size_t) nbytes; } */ *uap; { - struct file *fp; + struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; int error; @@ -3951,13 +3980,15 @@ if (error) return (error); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + if ((error = namei(&nd)) != 0) return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); - error = extattr_set_vp((struct vnode *)fp->f_data, uap->attrnamespace, - attrname, uap->data, uap->nbytes, td); - fdrop(fp, td); + error = extattr_set_vp(nd.ni_vp, uap->attrnamespace, attrname, + uap->data, uap->nbytes, td); + vrele(nd.ni_vp); return (error); } @@ -4032,6 +4063,35 @@ } int +extattr_get_fd(td, uap) + struct thread *td; + struct extattr_get_fd_args /* { + syscallarg(int) fd; + syscallarg(int) attrnamespace; + syscallarg(const char *) attrname; + syscallarg(void *) data; + syscallarg(size_t) nbytes; + } */ *uap; +{ + struct file *fp; + char attrname[EXTATTR_MAXNAMELEN]; + int error; + + error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); + if (error) + return (error); + + if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + return (error); + + error = extattr_get_vp((struct vnode *)fp->f_data, uap->attrnamespace, + attrname, uap->data, uap->nbytes, td); + + fdrop(fp, td); + return (error); +} + +int extattr_get_file(td, uap) struct thread *td; struct extattr_get_file_args /* { @@ -4050,7 +4110,7 @@ if (error) return (error); - NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return (error); NDFREE(&nd, NDF_ONLY_PNBUF); @@ -4063,17 +4123,17 @@ } int -extattr_get_fd(td, uap) +extattr_get_link(td, uap) struct thread *td; - struct extattr_get_fd_args /* { - syscallarg(int) fd; + struct extattr_get_link_args /* { + syscallarg(const char *) path; syscallarg(int) attrnamespace; syscallarg(const char *) attrname; syscallarg(void *) data; syscallarg(size_t) nbytes; } */ *uap; { - struct file *fp; + struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; int error; @@ -4081,13 +4141,15 @@ if (error) return (error); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + if ((error = namei(&nd)) != 0) return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); - error = extattr_get_vp((struct vnode *)fp->f_data, uap->attrnamespace, - attrname, uap->data, uap->nbytes, td); + error = extattr_get_vp(nd.ni_vp, uap->attrnamespace, attrname, + uap->data, uap->nbytes, td); - fdrop(fp, td); + vrele(nd.ni_vp); return (error); } @@ -4127,6 +4189,34 @@ } int +extattr_delete_fd(td, uap) + struct thread *td; + struct extattr_delete_fd_args /* { + syscallarg(int) fd; + syscallarg(int) attrnamespace; + syscallarg(const char *) attrname; + } */ *uap; +{ + struct file *fp; + struct vnode *vp; + char attrname[EXTATTR_MAXNAMELEN]; + int error; + + error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); + if (error) + return (error); + + if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + return (error); + vp = (struct vnode *)fp->f_data; + + error = extattr_delete_vp(vp, uap->attrnamespace, attrname, td); + + fdrop(fp, td); + return (error); +} + +int extattr_delete_file(td, uap) struct thread *td; struct extattr_delete_file_args /* { @@ -4143,7 +4233,7 @@ if (error) return(error); - NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, uap->path, td); if ((error = namei(&nd)) != 0) return(error); NDFREE(&nd, NDF_ONLY_PNBUF); @@ -4155,29 +4245,29 @@ } int -extattr_delete_fd(td, uap) +extattr_delete_link(td, uap) struct thread *td; - struct extattr_delete_fd_args /* { - syscallarg(int) fd; + struct extattr_delete_link_args /* { + syscallarg(const char *) path; syscallarg(int) attrnamespace; syscallarg(const char *) attrname; } */ *uap; { - struct file *fp; - struct vnode *vp; + struct nameidata nd; char attrname[EXTATTR_MAXNAMELEN]; int error; error = copyinstr(uap->attrname, attrname, EXTATTR_MAXNAMELEN, NULL); if (error) - return (error); + return(error); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) - return (error); - vp = (struct vnode *)fp->f_data; + NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_USERSPACE, uap->path, td); + if ((error = namei(&nd)) != 0) + return(error); + NDFREE(&nd, NDF_ONLY_PNBUF); - error = extattr_delete_vp(vp, uap->attrnamespace, attrname, td); + error = extattr_delete_vp(nd.ni_vp, uap->attrnamespace, attrname, td); - fdrop(fp, td); - return (error); + vrele(nd.ni_vp); + return(error); } ==== //depot/projects/trustedbsd/mac/sys/sys/extattr.h#6 (text+ko) ==== @@ -60,14 +60,20 @@ int extattr_delete_fd(int _fd, int _attrnamespace, const char *_attrname); int extattr_delete_file(const char *_path, int _attrnamespace, const char *_attrname); +int extattr_delete_link(const char *_path, int _attrnamespace, + const char *_attrname); ssize_t extattr_get_fd(int _fd, int _attrnamespace, const char *_attrname, void *_data, size_t _nbytes); ssize_t extattr_get_file(const char *_path, int _attrnamespace, const char *_attrname, void *_data, size_t _nbytes); +ssize_t extattr_get_link(const char *_path, int _attrnamespace, + const char *_attrname, void *_data, size_t _nbytes); int extattr_set_fd(int _fd, int _attrnamespace, const char *_attrname, const void *_data, size_t _nbytes); int extattr_set_file(const char *_path, int _attrnamespace, const char *_attrname, const void *_data, size_t _nbytes); +int extattr_set_link(const char *_path, int _attrnamespace, + const char *_attrname, const void *_data, size_t _nbytes); __END_DECLS #endif /* !_KERNEL */ ==== //depot/projects/trustedbsd/mac/sys/sys/syscall.h#32 (text+ko) ==== @@ -312,4 +312,7 @@ #define SYS_macctl 396 #define SYS___mac_get_link 397 #define SYS___mac_set_link 398 -#define SYS_MAXSYSCALL 399 +#define SYS_extattr_set_link 399 +#define SYS_extattr_get_link 400 +#define SYS_extattr_delete_link 401 +#define SYS_MAXSYSCALL 402 ==== //depot/projects/trustedbsd/mac/sys/sys/syscall.mk#32 (text+ko) ==== @@ -260,4 +260,7 @@ __mac_get_pid.o \ macctl.o \ __mac_get_link.o \ - __mac_set_link.o + __mac_set_link.o \ + extattr_set_link.o \ + extattr_get_link.o \ + extattr_delete_link.o ==== //depot/projects/trustedbsd/mac/sys/sys/sysproto.h#33 (text+ko) ==== @@ -1145,6 +1145,25 @@ char path_p_l_[PADL_(const char *)]; const char * path_p; char path_p_r_[PADR_(const char *)]; char mac_p_l_[PADL_(struct mac *)]; struct mac * mac_p; char mac_p_r_[PADR_(struct mac *)]; }; +struct extattr_set_link_args { + char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)]; + char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)]; + char attrname_l_[PADL_(const char *)]; const char * attrname; char attrname_r_[PADR_(const char *)]; + char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)]; + char nbytes_l_[PADL_(size_t)]; size_t nbytes; char nbytes_r_[PADR_(size_t)]; +}; +struct extattr_get_link_args { + char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)]; + char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)]; + char attrname_l_[PADL_(const char *)]; const char * attrname; char attrname_r_[PADR_(const char *)]; + char data_l_[PADL_(void *)]; void * data; char data_r_[PADR_(void *)]; + char nbytes_l_[PADL_(size_t)]; size_t nbytes; char nbytes_r_[PADR_(size_t)]; +}; +struct extattr_delete_link_args { + char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)]; + char attrnamespace_l_[PADL_(int)]; int attrnamespace; char attrnamespace_r_[PADR_(int)]; + char attrname_l_[PADL_(const char *)]; const char * attrname; char attrname_r_[PADR_(const char *)]; +}; int nosys(struct thread *, struct nosys_args *); void sys_exit(struct thread *, struct sys_exit_args *); int fork(struct thread *, struct fork_args *); @@ -1402,6 +1421,9 @@ int macctl(struct thread *, struct macctl_args *); int __mac_get_link(struct thread *, struct __mac_get_link_args *); int __mac_set_link(struct thread *, struct __mac_set_link_args *); +int extattr_set_link(struct thread *, struct extattr_set_link_args *); +int extattr_get_link(struct thread *, struct extattr_get_link_args *); +int extattr_delete_link(struct thread *, struct extattr_delete_link_args *); #ifdef COMPAT_43 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message