Module Name: src
Committed By: manu
Date: Mon Jun 27 16:39:44 UTC 2011
Modified Files:
src/distrib/sets/lists/comp: mi
src/lib/libc/sys: Makefile.inc
src/sys/kern: vfs_xattr.c
src/sys/sys: Makefile
Log Message:
Fix multiple non compliances in our Linux-like extattr API, and make it
public so that it can be used.
To generate a diff of this commit:
cvs rdiff -u -r1.1633 -r1.1634 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.206 -r1.207 src/lib/libc/sys/Makefile.inc
cvs rdiff -u -r1.23 -r1.24 src/sys/kern/vfs_xattr.c
cvs rdiff -u -r1.132 -r1.133 src/sys/sys/Makefile
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.1633 src/distrib/sets/lists/comp/mi:1.1634
--- src/distrib/sets/lists/comp/mi:1.1633 Mon Jun 27 11:52:22 2011
+++ src/distrib/sets/lists/comp/mi Mon Jun 27 16:39:43 2011
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1633 2011/06/27 11:52:22 uch Exp $
+# $NetBSD: mi,v 1.1634 2011/06/27 16:39:43 manu Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -2228,6 +2228,7 @@
./usr/include/sys/wapbl.h comp-c-include
./usr/include/sys/wapbl_replay.h comp-c-include
./usr/include/sys/wdog.h comp-c-include
+./usr/include/sys/xattr.h comp-c-include
./usr/include/sysexits.h comp-c-include
./usr/include/syslog.h comp-c-include
./usr/include/tar.h comp-c-include
Index: src/lib/libc/sys/Makefile.inc
diff -u src/lib/libc/sys/Makefile.inc:1.206 src/lib/libc/sys/Makefile.inc:1.207
--- src/lib/libc/sys/Makefile.inc:1.206 Sun Jun 26 16:42:41 2011
+++ src/lib/libc/sys/Makefile.inc Mon Jun 27 16:39:44 2011
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.206 2011/06/26 16:42:41 christos Exp $
+# $NetBSD: Makefile.inc,v 1.207 2011/06/27 16:39:44 manu Exp $
# @(#)Makefile.inc 8.3 (Berkeley) 10/24/94
# sys sources
@@ -84,6 +84,9 @@
extattr_get_link.S extattr_list_fd.S extattr_list_file.S \
extattr_list_link.S extattr_set_fd.S extattr_set_file.S \
extattr_set_link.S \
+ setxattr.S getxattr.S listxattr.S removexattr.S \
+ lsetxattr.S lgetxattr.S llistxattr.S lremovexattr.S \
+ fsetxattr.S fgetxattr.S flistxattr.S fremovexattr.S \
fchdir.S fchflags.S fchmod.S fchown.S fchroot.S \
__fhopen40.S __fhstat50.S __fhstatvfs140.S fktrace.S \
flock.S fpathconf.S __fstat50.S fstatvfs1.S __futimes50.S \
Index: src/sys/kern/vfs_xattr.c
diff -u src/sys/kern/vfs_xattr.c:1.23 src/sys/kern/vfs_xattr.c:1.24
--- src/sys/kern/vfs_xattr.c:1.23 Fri Nov 19 06:44:45 2010
+++ src/sys/kern/vfs_xattr.c Mon Jun 27 16:39:43 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_xattr.c,v 1.23 2010/11/19 06:44:45 dholland Exp $ */
+/* $NetBSD: vfs_xattr.c,v 1.24 2011/06/27 16:39:43 manu Exp $ */
/*-
* Copyright (c) 2005, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_xattr.c,v 1.23 2010/11/19 06:44:45 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_xattr.c,v 1.24 2011/06/27 16:39:43 manu Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -212,7 +212,8 @@
*/
static int
extattr_set_vp(struct vnode *vp, int attrnamespace, const char *attrname,
- const void *data, size_t nbytes, struct lwp *l, register_t *retval)
+ const void *data, size_t nbytes, struct lwp *l, register_t *retval,
+ int flag)
{
struct uio auio;
struct iovec aiov;
@@ -221,6 +222,29 @@
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ if (flag) {
+ size_t attrlen;
+
+ error = VOP_GETEXTATTR(vp, attrnamespace, attrname, NULL,
+ &attrlen, l->l_cred);
+
+ switch (error) {
+ case ENOATTR:
+ if (flag & XATTR_REPLACE)
+ goto done;
+ break;
+ case 0:
+ if (flag & XATTR_CREATE) {
+ error = EEXIST;
+ goto done;
+ }
+ break;
+ default:
+ goto done;
+ break;
+ }
+ }
+
aiov.iov_base = __UNCONST(data); /* XXXUNCONST kills const */
aiov.iov_len = nbytes;
auio.uio_iov = &aiov;
@@ -405,7 +429,7 @@
vp = (struct vnode *) fp->f_data;
error = extattr_set_vp(vp, SCARG(uap, attrnamespace), attrname,
- SCARG(uap, data), SCARG(uap, nbytes), l, retval);
+ SCARG(uap, data), SCARG(uap, nbytes), l, retval, 0);
fd_putfile(SCARG(uap, fd));
return (error);
@@ -436,7 +460,7 @@
return (error);
error = extattr_set_vp(vp, SCARG(uap, attrnamespace), attrname,
- SCARG(uap, data), SCARG(uap, nbytes), l, retval);
+ SCARG(uap, data), SCARG(uap, nbytes), l, retval, 0);
vrele(vp);
return (error);
@@ -467,7 +491,7 @@
return (error);
error = extattr_set_vp(vp, SCARG(uap, attrnamespace), attrname,
- SCARG(uap, data), SCARG(uap, nbytes), l, retval);
+ SCARG(uap, data), SCARG(uap, nbytes), l, retval, 0);
vrele(vp);
return (error);
@@ -729,6 +753,23 @@
* Linux-compatible <sys/xattr.h> API for file system extended attributes
*****************************************************************************/
+#define MATCH_NS(ns, key) (strncmp(ns, key, sizeof(ns) - 1) == 0)
+static int
+xattr_native(const char *key) {
+ if (MATCH_NS("system.", key))
+ return EXTATTR_NAMESPACE_SYSTEM;
+ else if (MATCH_NS("user.", key))
+ return EXTATTR_NAMESPACE_USER;
+ else if (MATCH_NS("security.", key))
+ return EXTATTR_NAMESPACE_SYSTEM;
+ else if (MATCH_NS("trusted.", key))
+ return EXTATTR_NAMESPACE_SYSTEM;
+ else
+ return EXTATTR_NAMESPACE_USER;
+
+}
+#undef MATCH_NS
+
int
sys_setxattr(struct lwp *l, const struct sys_setxattr_args *uap, register_t *retval)
{
@@ -741,24 +782,30 @@
} */
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
+ register_t attrlen;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
NULL);
if (error)
- return (error);
+ goto out;
error = namei_simple_user(SCARG(uap, path),
NSM_FOLLOW_NOEMULROOT, &vp);
if (error)
- return (error);
+ goto out_rele;
- /* XXX flags */
+ namespace = xattr_native(attrname);
- error = extattr_set_vp(vp, EXTATTR_NAMESPACE_USER,
- attrname, SCARG(uap, value), SCARG(uap, size), l, retval);
+ error = extattr_set_vp(vp, namespace,
+ attrname, SCARG(uap, value), SCARG(uap, size), l,
+ &attrlen, SCARG(uap, flags));
+out_rele:
vrele(vp);
+out:
+ *retval = (error == 0) ? 0 : -1;
return (error);
}
@@ -774,24 +821,30 @@
} */
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
+ register_t attrlen;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
NULL);
if (error)
- return (error);
+ goto out;
error = namei_simple_user(SCARG(uap, path),
NSM_NOFOLLOW_NOEMULROOT, &vp);
if (error)
- return (error);
+ goto out_rele;
- /* XXX flags */
+ namespace = xattr_native(attrname);
- error = extattr_set_vp(vp, EXTATTR_NAMESPACE_USER,
- attrname, SCARG(uap, value), SCARG(uap, size), l, retval);
+ error = extattr_set_vp(vp, namespace,
+ attrname, SCARG(uap, value), SCARG(uap, size), l,
+ &attrlen, SCARG(uap, flags));
+out_rele:
vrele(vp);
+out:
+ *retval = (error == 0) ? 0 : -1;
return (error);
}
@@ -808,24 +861,29 @@
struct file *fp;
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
+ register_t attrlen;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
NULL);
if (error)
- return (error);
+ goto out;
error = fd_getvnode(SCARG(uap, fd), &fp);
if (error)
- return (error);
+ goto out;
vp = (struct vnode *) fp->f_data;
- /* XXX flags */
+ namespace = xattr_native(attrname);
- error = extattr_set_vp(vp, EXTATTR_NAMESPACE_USER,
- attrname, SCARG(uap, value), SCARG(uap, size), l, retval);
+ error = extattr_set_vp(vp, namespace,
+ attrname, SCARG(uap, value), SCARG(uap, size), l,
+ &attrlen, SCARG(uap, flags));
fd_putfile(SCARG(uap, fd));
+out:
+ *retval = (error == 0) ? 0 : -1;
return (error);
}
@@ -840,6 +898,7 @@
} */
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
@@ -852,7 +911,9 @@
if (error)
return (error);
- error = extattr_get_vp(vp, EXTATTR_NAMESPACE_USER,
+ namespace = xattr_native(attrname);
+
+ error = extattr_get_vp(vp, namespace,
attrname, SCARG(uap, value), SCARG(uap, size), l, retval);
vrele(vp);
@@ -870,6 +931,7 @@
} */
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
@@ -882,7 +944,9 @@
if (error)
return (error);
- error = extattr_get_vp(vp, EXTATTR_NAMESPACE_USER,
+ namespace = xattr_native(attrname);
+
+ error = extattr_get_vp(vp, namespace,
attrname, SCARG(uap, value), SCARG(uap, size), l, retval);
vrele(vp);
@@ -901,6 +965,7 @@
struct file *fp;
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
@@ -913,7 +978,9 @@
return (error);
vp = (struct vnode *) fp->f_data;
- error = extattr_get_vp(vp, EXTATTR_NAMESPACE_USER,
+ namespace = xattr_native(attrname);
+
+ error = extattr_get_vp(vp, namespace,
attrname, SCARG(uap, value), SCARG(uap, size), l, retval);
fd_putfile(SCARG(uap, fd));
@@ -929,6 +996,9 @@
syscallarg(size_t) size;
} */
struct vnode *vp;
+ char *list;
+ size_t size;
+ register_t listsize_usr, listsize_sys;
int error;
error = namei_simple_user(SCARG(uap, path),
@@ -936,9 +1006,27 @@
if (error)
return (error);
+ list = SCARG(uap, list);
+ size = SCARG(uap, size);
+
error = extattr_list_vp(vp, EXTATTR_NAMESPACE_USER,
- SCARG(uap, list), SCARG(uap, size), l, retval);
+ list, size, l, &listsize_usr);
+ if (error)
+ goto out;
+
+ if (list)
+ list += listsize_usr;
+ if (size)
+ size -= listsize_usr;
+ error = extattr_list_vp(vp, EXTATTR_NAMESPACE_SYSTEM,
+ list, size, l, &listsize_sys);
+ if (error)
+ goto out;
+
+ *retval = listsize_usr + listsize_sys;
+
+out:
vrele(vp);
return (error);
}
@@ -952,6 +1040,9 @@
syscallarg(size_t) size;
} */
struct vnode *vp;
+ char *list;
+ size_t size;
+ register_t listsize_usr, listsize_sys;
int error;
error = namei_simple_user(SCARG(uap, path),
@@ -959,9 +1050,26 @@
if (error)
return (error);
+ list = SCARG(uap, list);
+ size = SCARG(uap, size);
+
error = extattr_list_vp(vp, EXTATTR_NAMESPACE_USER,
- SCARG(uap, list), SCARG(uap, size), l, retval);
+ list, size, l, &listsize_usr);
+ if (error)
+ goto out;
+
+ if (list)
+ list += listsize_usr;
+ if (size)
+ size -= listsize_usr;
+ error = extattr_list_vp(vp, EXTATTR_NAMESPACE_SYSTEM,
+ list, size, l, &listsize_sys);
+ if (error)
+ goto out;
+
+ *retval = listsize_usr + listsize_sys;
+out:
vrele(vp);
return (error);
}
@@ -976,6 +1084,9 @@
} */
struct file *fp;
struct vnode *vp;
+ char *list;
+ size_t size;
+ register_t listsize_usr, listsize_sys;
int error;
error = fd_getvnode(SCARG(uap, fd), &fp);
@@ -983,8 +1094,26 @@
return (error);
vp = (struct vnode *) fp->f_data;
+ list = SCARG(uap, list);
+ size = SCARG(uap, size);
+
error = extattr_list_vp(vp, EXTATTR_NAMESPACE_USER,
- SCARG(uap, list), SCARG(uap, size), l, retval);
+ list, size, l, &listsize_usr);
+ if (error)
+ goto out;
+
+ if (list)
+ list += listsize_usr;
+ if (size)
+ size -= listsize_usr;
+
+ error = extattr_list_vp(vp, EXTATTR_NAMESPACE_SYSTEM,
+ list, size, l, &listsize_sys);
+ if (error)
+ goto out;
+
+ *retval = listsize_usr + listsize_sys;
+out:
fd_putfile(SCARG(uap, fd));
return (error);
@@ -999,6 +1128,7 @@
} */
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
@@ -1011,8 +1141,9 @@
if (error)
return (error);
- error = extattr_delete_vp(vp, EXTATTR_NAMESPACE_USER,
- attrname, l);
+ namespace = xattr_native(attrname);
+
+ error = extattr_delete_vp(vp, namespace, attrname, l);
vrele(vp);
return (error);
@@ -1027,6 +1158,7 @@
} */
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
@@ -1039,8 +1171,9 @@
if (error)
return (error);
- error = extattr_delete_vp(vp, EXTATTR_NAMESPACE_USER,
- attrname, l);
+ namespace = xattr_native(attrname);
+
+ error = extattr_delete_vp(vp, namespace, attrname, l);
vrele(vp);
return (error);
@@ -1056,6 +1189,7 @@
struct file *fp;
struct vnode *vp;
char attrname[XATTR_NAME_MAX];
+ int namespace;
int error;
error = copyinstr(SCARG(uap, name), attrname, sizeof(attrname),
@@ -1068,8 +1202,9 @@
return (error);
vp = (struct vnode *) fp->f_data;
- error = extattr_delete_vp(vp, EXTATTR_NAMESPACE_USER,
- attrname, l);
+ namespace = xattr_native(attrname);
+
+ error = extattr_delete_vp(vp, namespace, attrname, l);
fd_putfile(SCARG(uap, fd));
return (error);
Index: src/sys/sys/Makefile
diff -u src/sys/sys/Makefile:1.132 src/sys/sys/Makefile:1.133
--- src/sys/sys/Makefile:1.132 Wed Mar 9 23:10:07 2011
+++ src/sys/sys/Makefile Mon Jun 27 16:39:43 2011
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.132 2011/03/09 23:10:07 joerg Exp $
+# $NetBSD: Makefile,v 1.133 2011/06/27 16:39:43 manu Exp $
.include <bsd.sys.mk>
@@ -40,7 +40,7 @@
ttydefaults.h ttydev.h types.h \
ucontext.h ucred.h uio.h un.h unistd.h unpcb.h user.h utsname.h uuid.h \
vadvise.h verified_exec.h videoio.h vmmeter.h vnode.h vnode_if.h \
- wait.h wapbl.h wapbl_replay.h wdog.h
+ wait.h wapbl.h wapbl_replay.h wdog.h xattr.h
INCSYMLINKS=\
sys/exec_elf.h /usr/include/elf.h \