diff options
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)			\ | 
