summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc
diff options
context:
space:
mode:
authoramw <none@none>2007-10-25 16:34:29 -0700
committeramw <none@none>2007-10-25 16:34:29 -0700
commitda6c28aaf62fa55f0fdb8004aa40f88f23bf53f0 (patch)
tree65be91fb78a6a66183197595333f2e8aafb4640a /usr/src/lib/libc
parente845e33dd0d1aea22db7edaa8c7d43955d24609b (diff)
downloadillumos-gate-da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0.tar.gz
PSARC/2007/218 caller_context_t in all VOPs
PSARC/2007/227 VFS Feature Registration and ACL on Create PSARC/2007/244 ZFS Case-insensitive support PSARC/2007/315 Extensible Attribute Interfaces PSARC/2007/394 ls(1) new command line options '-/' and '-%': CIFS system attributes support PSARC/2007/403 Modified Access Checks for CIFS PSARC/2007/410 Add system attribute support to chmod(1) PSARC/2007/432 CIFS system attributes support for cp(1), pack(1), unpack(1), compress(1) and uncompress(1) PSARC/2007/444 Rescind SETTABLE Attribute PSARC/2007/459 CIFS system attributes support for cpio(1), pax(1), tar(1) PSARC/2007/546 Update utilities to match CIFS system attributes changes. PSARC/2007/560 ZFS sharesmb property 4890717 want append-only files 6417428 Case-insensitive file system name lookup to support CIFS 6417435 DOS attributes and additional timestamps to support for CIFS 6417442 File system quarantined and modified attributes to support an integrated Anti-Virus service 6417453 FS boolean property for rejecting/allowing invalid UTF-8 sequences in file names 6473733 RFE: Need support for open-deny modes 6473755 RFE: Need ability to reconcile oplock and delegation conflicts 6494624 sharemgr needs to support CIFS shares better 6546705 All vnode operations need to pass caller_context_t 6546706 Need VOP_SETATTR/VOP_GETATTR to support new, optional attributes 6546893 Solaris system attribute support 6550962 ZFS ACL inheritance needs to be enhanced to support Automatic Inheritance 6553589 RFE: VFS Feature Registration facility 6553770 RFE: ZFS support for ACL-on-CREATE (PSARC 2007/227) 6565581 ls(1) should support file system attributes proposed in PSARC/2007/315 6566784 NTFS streams are not copied along with the files. 6576205 cp(1), pack(1) and compress(1) should support file system attributes proposed in PSARC/2007/315 6578875 RFE: kernel interfaces for nbmand need improvement 6578883 RFE: VOP_SHRLOCK needs additional access types 6578885 chmod(1) should support file system attributes proposed in PSARC/2007/315 6578886 RFE: disallow nbmand state to change on remount 6583349 ACL parser needs to support audit/alarm ACE types 6590347 tar(1) should support filesystem attributes proposed in PSARC/2007/315 6597357 *tar* xv@ doesn't show the hidden directory even though it is restored 6597360 *tar* should re-init xattr info if openat() fails during extraction of and extended attribute 6597368 *tar* cannot restore hard linked extended attributes 6597374 *tar* doesn't display "x " when hard linked attributes are restored 6597375 *tar* extended attribute header off by one 6614861 *cpio* incorrectly archives extended system attributes with -@ 6614896 *pax* incorrectly archives extended system attributes with -@ 6615225 *tar* incorrectly archives extended system attributes with -@ 6617183 CIFS Service - PSARC 2006/715
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r--usr/src/lib/libc/Makefile.targ4
-rw-r--r--usr/src/lib/libc/amd64/Makefile5
-rw-r--r--usr/src/lib/libc/i386/Makefile.com6
-rw-r--r--usr/src/lib/libc/port/gen/attrat.c273
-rw-r--r--usr/src/lib/libc/port/gen/privlib.c2
-rw-r--r--usr/src/lib/libc/port/llib-lc1
-rw-r--r--usr/src/lib/libc/port/mapfile-vers12
-rw-r--r--usr/src/lib/libc/port/sys/fsmisc.c13
-rw-r--r--usr/src/lib/libc/sparc/Makefile6
-rw-r--r--usr/src/lib/libc/sparcv9/Makefile6
10 files changed, 323 insertions, 5 deletions
diff --git a/usr/src/lib/libc/Makefile.targ b/usr/src/lib/libc/Makefile.targ
index b8237246a4..95a0a3b0e3 100644
--- a/usr/src/lib/libc/Makefile.targ
+++ b/usr/src/lib/libc/Makefile.targ
@@ -272,6 +272,10 @@ $(COMOBJS:%=pics/%): $(SRC)/common/util/$$(@F:.o=.c)
$(COMPILE.c) -o $@ $(SRC)/common/util/$(@F:.o=.c)
$(POST_PROCESS_O)
+$(XATTROBJS:%=pics/%): $(SRC)/common/xattr/$$(@F:.o=.c)
+ $(COMPILE.c) -o $@ $(SRC)/common/xattr/$(@F:.o=.c)
+ $(POST_PROCESS_O)
+
$(DTRACEOBJS:%=pics/%): $(SRC)/common/dtrace/$$(@F:.o=.c)
$(COMPILE.c) -o $@ $(SRC)/common/dtrace/$(@F:.o=.c)
$(POST_PROCESS_O)
diff --git a/usr/src/lib/libc/amd64/Makefile b/usr/src/lib/libc/amd64/Makefile
index 0e2d924805..0539645b34 100644
--- a/usr/src/lib/libc/amd64/Makefile
+++ b/usr/src/lib/libc/amd64/Makefile
@@ -85,6 +85,8 @@ FPASMOBJS= \
ATOMICOBJS= \
atomic.o
+XATTROBJS= \
+ xattr_common.o
COMOBJS= \
bcmp.o \
bcopy.o \
@@ -99,6 +101,7 @@ GENOBJS= \
_getsp.o \
abs.o \
alloca.o \
+ attrat.o \
byteorder.o \
cache.o \
cuexit.o \
@@ -849,6 +852,7 @@ MOSTOBJS= \
$(I386FPOBJS) \
$(FPASMOBJS) \
$(ATOMICOBJS) \
+ $(XATTROBJS) \
$(COMOBJS) \
$(GENOBJS) \
$(PORTFP) \
@@ -966,6 +970,7 @@ CLOBBERFILES += $(LIB_PIC)
# list of C source for lint
SRCS= \
$(ATOMICOBJS:%.o=$(SRC)/common/atomic/%.c) \
+ $(XATTROBJS:%.o=$(SRC)/common/xattr/%.c) \
$(COMOBJS:%.o=$(SRC)/common/util/%.c) \
$(PORTFP:%.o=../port/fp/%.c) \
$(PORTGEN:%.o=../port/gen/%.c) \
diff --git a/usr/src/lib/libc/i386/Makefile.com b/usr/src/lib/libc/i386/Makefile.com
index 6fe1a1c5cc..5fb4ffea84 100644
--- a/usr/src/lib/libc/i386/Makefile.com
+++ b/usr/src/lib/libc/i386/Makefile.com
@@ -83,6 +83,9 @@ FPASMOBJS= \
ATOMICOBJS= \
atomic.o
+XATTROBJS= \
+ xattr_common.o
+
COMOBJS= \
bcmp.o \
bcopy.o \
@@ -389,6 +392,7 @@ PORTGEN= \
atoi.o \
atol.o \
atoll.o \
+ attrat.o \
attropen.o \
atexit.o \
atfork.o \
@@ -884,6 +888,7 @@ MOSTOBJS= \
$(FPOBJS) \
$(FPASMOBJS) \
$(ATOMICOBJS) \
+ $(XATTROBJS) \
$(COMOBJS) \
$(DTRACEOBJS) \
$(GENOBJS) \
@@ -1026,6 +1031,7 @@ CLOBBERFILES += $(LIB_PIC)
# list of C source for lint
SRCS= \
$(ATOMICOBJS:%.o=$(SRC)/common/atomic/%.c) \
+ $(XATTROBJS:%.o=$(SRC)/common/xattr/%.c) \
$(COMOBJS:%.o=$(SRC)/common/util/%.c) \
$(DTRACEOBJS:%.o=$(SRC)/common/dtrace/%.c) \
$(PORTFP:%.o=../port/fp/%.c) \
diff --git a/usr/src/lib/libc/port/gen/attrat.c b/usr/src/lib/libc/port/gen/attrat.c
new file mode 100644
index 0000000000..f2a26d17cd
--- /dev/null
+++ b/usr/src/lib/libc/port/gen/attrat.c
@@ -0,0 +1,273 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <mtlib.h>
+#include <attr.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <sys/stat.h>
+#include <sys/filio.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <stdio.h>
+
+static int (*nvpacker)(nvlist_t *, char **, size_t *, int, int);
+static int (*nvsize)(nvlist_t *, size_t *, int);
+static int (*nvunpacker)(char *, size_t, nvlist_t **);
+static mutex_t attrlock = DEFAULTMUTEX;
+static int initialized;
+extern int __openattrdirat(int basefd, const char *name);
+
+static char *xattr_view_name[XATTR_VIEW_LAST] = {
+ VIEW_READONLY,
+ VIEW_READWRITE
+};
+
+static int
+attrat_init()
+{
+ if (initialized == 0) {
+ lmutex_lock(&attrlock);
+ if (initialized == 1) {
+ lmutex_unlock(&attrlock);
+ return (0);
+ }
+
+ void *libnvhandle = dlopen("libnvpair.so.1", RTLD_LAZY);
+ if (libnvhandle == NULL || (nvpacker = (int (*)(nvlist_t *,
+ char **, size_t *, int, int)) dlsym(libnvhandle,
+ "nvlist_pack")) == NULL ||
+ (nvsize = (int (*)(nvlist_t *,
+ size_t *, int)) dlsym(libnvhandle,
+ "nvlist_size")) == NULL ||
+ (nvunpacker = (int (*)(char *, size_t,
+ nvlist_t **)) dlsym(libnvhandle,
+ "nvlist_unpack")) == NULL) {
+ if (libnvhandle)
+ dlclose(libnvhandle);
+ lmutex_unlock(&attrlock);
+ return (EINVAL);
+ }
+
+ initialized = 1;
+ lmutex_unlock(&attrlock);
+ }
+ return (0);
+}
+
+static int
+attr_nv_pack(nvlist_t *request, void **nv_request, size_t *nv_requestlen)
+{
+ size_t bufsize;
+ char *packbuf = NULL;
+
+ if (nvsize(request, &bufsize, NV_ENCODE_XDR) != 0) {
+ return (EINVAL);
+ }
+
+ packbuf = malloc(bufsize);
+ if (packbuf == NULL)
+ return (EINVAL);
+ if (nvpacker(request, &packbuf, &bufsize, NV_ENCODE_XDR, 0) != 0) {
+ free(packbuf);
+ } else {
+ *nv_request = (void *)packbuf;
+ *nv_requestlen = bufsize;
+ }
+ return (0);
+}
+
+static const char *
+view_to_name(xattr_view_t view)
+{
+ if (view >= XATTR_VIEW_LAST || view < 0)
+ return (NULL);
+ return (xattr_view_name[view]);
+}
+
+static int
+xattr_openat(int basefd, xattr_view_t view, int mode)
+{
+ const char *xattrname;
+ int xattrfd;
+ int oflag;
+
+ switch (view) {
+ case XATTR_VIEW_READONLY:
+ oflag = O_RDONLY;
+ break;
+ case XATTR_VIEW_READWRITE:
+ oflag = mode & O_RDWR;
+ break;
+ default:
+ (void) __set_errno(EINVAL);
+ return (-1);
+ }
+ if (mode & O_XATTR)
+ oflag |= O_XATTR;
+
+ xattrname = view_to_name(view);
+ xattrfd = openat(basefd, xattrname, oflag);
+ if (xattrfd < 0)
+ return (xattrfd);
+ /* Don't cache sysattr info (advisory) */
+ (void) directio(xattrfd, DIRECTIO_ON);
+ return (xattrfd);
+}
+
+static int
+cgetattr(int fd, nvlist_t **response)
+{
+ int error;
+ int bytesread;
+ void *nv_response;
+ size_t nv_responselen;
+ struct stat buf;
+
+ if (error = attrat_init())
+ return (__set_errno(error));
+ if ((error = fstat(fd, &buf)) != 0)
+ return (__set_errno(error));
+ nv_responselen = buf.st_size;
+
+ if ((nv_response = malloc(nv_responselen)) == NULL)
+ return (__set_errno(ENOMEM));
+ bytesread = read(fd, nv_response, nv_responselen);
+ if (bytesread != nv_responselen)
+ return (__set_errno(EFAULT));
+
+ error = nvunpacker(nv_response, nv_responselen, response);
+ free(nv_response);
+ return (error);
+}
+
+static int
+csetattr(int fd, nvlist_t *request)
+{
+ int error, saveerrno;
+ int byteswritten;
+ void *nv_request;
+ size_t nv_requestlen;
+
+ if (error = attrat_init())
+ return (__set_errno(error));
+
+ if ((error = attr_nv_pack(request, &nv_request, &nv_requestlen)) != 0)
+ return (__set_errno(error));
+
+ (void) __set_errno(0);
+ byteswritten = write(fd, nv_request, nv_requestlen);
+ if (byteswritten != nv_requestlen) {
+ saveerrno = errno;
+ free(nv_request);
+ errno = saveerrno;
+ return (__set_errno(errno));
+ }
+
+ free(nv_request);
+ return (0);
+}
+
+int
+fgetattr(int basefd, xattr_view_t view, nvlist_t **response)
+{
+ int error, saveerrno, xattrfd;
+
+ if ((xattrfd = xattr_openat(basefd, view, O_XATTR)) < 0)
+ return (xattrfd);
+
+ error = cgetattr(xattrfd, response);
+ saveerrno = errno;
+ (void) close(xattrfd);
+ errno = saveerrno;
+ return (error);
+}
+
+int
+fsetattr(int basefd, xattr_view_t view, nvlist_t *request)
+{
+ int error, saveerrno, xattrfd;
+
+ if ((xattrfd = xattr_openat(basefd, view, O_RDWR | O_XATTR)) < 0)
+ return (xattrfd);
+ error = csetattr(xattrfd, request);
+ saveerrno = errno;
+ (void) close(xattrfd);
+ errno = saveerrno;
+ return (error);
+}
+
+int
+getattrat(int basefd, xattr_view_t view, const char *name, nvlist_t **response)
+{
+ int error, saveerrno, namefd, xattrfd;
+
+ if ((namefd = __openattrdirat(basefd, name)) < 0)
+ return (namefd);
+
+ if ((xattrfd = xattr_openat(namefd, view, 0)) < 0) {
+ saveerrno = errno;
+ (void) close(namefd);
+ errno = saveerrno;
+ return (xattrfd);
+ }
+
+ error = cgetattr(xattrfd, response);
+ saveerrno = errno;
+ (void) close(namefd);
+ (void) close(xattrfd);
+ errno = saveerrno;
+ return (error);
+}
+
+int
+setattrat(int basefd, xattr_view_t view, const char *name, nvlist_t *request)
+{
+ int error, saveerrno, namefd, xattrfd;
+
+ if ((namefd = __openattrdirat(basefd, name)) < 0)
+ return (namefd);
+
+ if ((xattrfd = xattr_openat(namefd, view, O_RDWR)) < 0) {
+ saveerrno = errno;
+ (void) close(namefd);
+ errno = saveerrno;
+ return (xattrfd);
+ }
+
+ error = csetattr(xattrfd, request);
+ saveerrno = errno;
+ (void) close(namefd);
+ (void) close(xattrfd);
+ errno = saveerrno;
+ return (error);
+}
diff --git a/usr/src/lib/libc/port/gen/privlib.c b/usr/src/lib/libc/port/gen/privlib.c
index 1968f7eaa4..57218876bc 100644
--- a/usr/src/lib/libc/port/gen/privlib.c
+++ b/usr/src/lib/libc/port/gen/privlib.c
@@ -442,7 +442,7 @@ priv_set(priv_op_t op, priv_ptype_t setname, ...)
/*
* priv_ineffect(privilege).
- * tests the existance of a privilege against the effective set.
+ * tests the existence of a privilege against the effective set.
*/
boolean_t
priv_ineffect(const char *priv)
diff --git a/usr/src/lib/libc/port/llib-lc b/usr/src/lib/libc/port/llib-lc
index 3e3bba59ca..e74313a424 100644
--- a/usr/src/lib/libc/port/llib-lc
+++ b/usr/src/lib/libc/port/llib-lc
@@ -31,6 +31,7 @@
#include <aio.h>
#include <alloca.h>
+#include <attr.h>
#include <atomic.h>
#include <ctype.h>
#include <deflt.h>
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers
index 3e658f68e6..717c4d9186 100644
--- a/usr/src/lib/libc/port/mapfile-vers
+++ b/usr/src/lib/libc/port/mapfile-vers
@@ -64,8 +64,11 @@ SUNW_1.23 { # SunOS 5.11 (Solaris 11)
err;
errx;
fdatasync;
+ fgetattr;
forkallx;
forkx;
+ fsetattr;
+ getattrat;
htonl;
htons;
lio_listio;
@@ -111,6 +114,7 @@ SUNW_1.23 { # SunOS 5.11 (Solaris 11)
sem_trywait;
sem_unlink;
sem_wait;
+ setattrat;
_sharefs;
shm_open;
shm_unlink;
@@ -1408,6 +1412,11 @@ SUNWprivate_1.1 {
_atomic_swap_uint = NODYNSORT;
_atomic_swap_ulong = NODYNSORT;
_atomic_swap_ushort = NODYNSORT;
+ attr_count;
+ attr_to_data_type;
+ attr_to_name;
+ attr_to_option;
+ attr_to_xattr_view;
_autofssys;
_brk;
__btowc_dense;
@@ -1762,6 +1771,7 @@ SUNWprivate_1.1 {
__mutex_trylock;
_mutex_unlock = NODYNSORT;
__mutex_unlock;
+ name_to_attr;
_nanosleep;
__nan_read;
__nan_written;
@@ -1807,6 +1817,8 @@ SUNWprivate_1.1 {
__nsw_getconfig_v1;
__nthreads;
__numeric_init;
+ __openattrdirat;
+ option_to_attr;
_openlog;
_plock;
_port_alert;
diff --git a/usr/src/lib/libc/port/sys/fsmisc.c b/usr/src/lib/libc/port/sys/fsmisc.c
index 88415c5363..491cc73732 100644
--- a/usr/src/lib/libc/port/sys/fsmisc.c
+++ b/usr/src/lib/libc/port/sys/fsmisc.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -60,3 +59,9 @@ renameat(int fromfd, const char *fromname, int tofd, const char *toname)
{
return (syscall(SYS_fsat, 7, fromfd, fromname, tofd, toname));
}
+
+int
+__openattrdirat(int fd, const char *name)
+{
+ return (syscall(SYS_fsat, 9, fd, name));
+}
diff --git a/usr/src/lib/libc/sparc/Makefile b/usr/src/lib/libc/sparc/Makefile
index c67463652b..37e0818dc6 100644
--- a/usr/src/lib/libc/sparc/Makefile
+++ b/usr/src/lib/libc/sparc/Makefile
@@ -102,6 +102,9 @@ FPASMOBJS= \
ATOMICOBJS= \
atomic.o
+XATTROBJS= \
+ xattr_common.o
+
COMOBJS= \
bcmp.o \
bcopy.o \
@@ -413,6 +416,7 @@ PORTGEN= \
atoi.o \
atol.o \
atoll.o \
+ attrat.o \
attropen.o \
atexit.o \
atfork.o \
@@ -912,6 +916,7 @@ MOSTOBJS= \
$(FPOBJS) \
$(FPASMOBJS) \
$(ATOMICOBJS) \
+ $(XATTROBJS) \
$(COMOBJS) \
$(DTRACEOBJS) \
$(GENOBJS) \
@@ -1044,6 +1049,7 @@ CLOBBERFILES += $(LIB_PIC)
# list of C source for lint
SRCS= \
$(ATOMICOBJS:%.o=$(SRC)/common/atomic/%.c) \
+ $(XATTROBJS:%.o=$(SRC)/common/xattr/%.c) \
$(COMOBJS:%.o=$(SRC)/common/util/%.c) \
$(DTRACEOBJS:%.o=$(SRC)/common/dtrace/%.c) \
$(PORTFP:%.o=../port/fp/%.c) \
diff --git a/usr/src/lib/libc/sparcv9/Makefile b/usr/src/lib/libc/sparcv9/Makefile
index c114126bfe..c837e39361 100644
--- a/usr/src/lib/libc/sparcv9/Makefile
+++ b/usr/src/lib/libc/sparcv9/Makefile
@@ -107,6 +107,9 @@ $(__GNUC)FPASMOBJS += \
ATOMICOBJS= \
atomic.o
+XATTROBJS= \
+ xattr_common.o
+
COMOBJS= \
bcmp.o \
bcopy.o \
@@ -371,6 +374,7 @@ PORTGEN= \
abort.o \
addsev.o \
assert.o \
+ attrat.o \
atof.o \
atoi.o \
atol.o \
@@ -858,6 +862,7 @@ MOSTOBJS= \
$(FPOBJS64) \
$(FPASMOBJS) \
$(ATOMICOBJS) \
+ $(XATTROBJS) \
$(COMOBJS) \
$(GENOBJS) \
$(PORTFP) \
@@ -978,6 +983,7 @@ CLOBBERFILES += $(LIB_PIC)
# list of C source for lint
SRCS= \
$(ATOMICOBJS:%.o=$(SRC)/common/atomic/%.c) \
+ $(XATTROBJS:%.o=$(SRC)/common/xattr/%.c) \
$(COMOBJS:%.o=$(SRC)/common/util/%.c) \
$(PORTFP:%.o=../port/fp/%.c) \
$(PORTGEN:%.o=../port/gen/%.c) \