diff options
author | amw <none@none> | 2007-10-25 16:34:29 -0700 |
---|---|---|
committer | amw <none@none> | 2007-10-25 16:34:29 -0700 |
commit | da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0 (patch) | |
tree | 65be91fb78a6a66183197595333f2e8aafb4640a /usr/src/lib/libc | |
parent | e845e33dd0d1aea22db7edaa8c7d43955d24609b (diff) | |
download | illumos-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.targ | 4 | ||||
-rw-r--r-- | usr/src/lib/libc/amd64/Makefile | 5 | ||||
-rw-r--r-- | usr/src/lib/libc/i386/Makefile.com | 6 | ||||
-rw-r--r-- | usr/src/lib/libc/port/gen/attrat.c | 273 | ||||
-rw-r--r-- | usr/src/lib/libc/port/gen/privlib.c | 2 | ||||
-rw-r--r-- | usr/src/lib/libc/port/llib-lc | 1 | ||||
-rw-r--r-- | usr/src/lib/libc/port/mapfile-vers | 12 | ||||
-rw-r--r-- | usr/src/lib/libc/port/sys/fsmisc.c | 13 | ||||
-rw-r--r-- | usr/src/lib/libc/sparc/Makefile | 6 | ||||
-rw-r--r-- | usr/src/lib/libc/sparcv9/Makefile | 6 |
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) \ |