15331Samw /* 25331Samw * CDDL HEADER START 35331Samw * 45331Samw * The contents of this file are subject to the terms of the 55331Samw * Common Development and Distribution License (the "License"). 65331Samw * You may not use this file except in compliance with the License. 75331Samw * 85331Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95331Samw * or http://www.opensolaris.org/os/licensing. 105331Samw * See the License for the specific language governing permissions 115331Samw * and limitations under the License. 125331Samw * 135331Samw * When distributing Covered Code, include this CDDL HEADER in each 145331Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155331Samw * If applicable, add the following below this CDDL HEADER, with the 165331Samw * fields enclosed by brackets "[]" replaced with your own identifying 175331Samw * information: Portions Copyright [yyyy] [name of copyright owner] 185331Samw * 195331Samw * CDDL HEADER END 205331Samw */ 21*6812Sraf 225331Samw /* 235902Smarks * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 245331Samw * Use is subject to license terms. 255331Samw */ 265331Samw 275331Samw #pragma ident "%Z%%M% %I% %E% SMI" 285331Samw 295331Samw #include <unistd.h> 305331Samw #include <stdlib.h> 315331Samw #include <string.h> 325331Samw #include <libgen.h> 335331Samw #include <attr.h> 345331Samw #include <fcntl.h> 355331Samw #include <errno.h> 365331Samw #include "libcmdutils.h" 375331Samw 385331Samw /* 395331Samw * Returns the status of attempting to obtain the extended system 405331Samw * attributes in the specified view. 415331Samw * 425331Samw * Note: If obtaining status for an extended attribute file, the caller must 435331Samw * chdir into the hidden directory prior to calling sysattr_status(). 445331Samw * 455331Samw * Returns 1 if the extended system attributes were obtained, otherwise 465331Samw * returns 0. 475331Samw */ 485331Samw int 495331Samw sysattr_status(char *file, xattr_view_t view) 505331Samw { 515902Smarks nvlist_t *response = NULL; 525331Samw int saveerrno; 535331Samw int status; 545331Samw 555331Samw status = getattrat(AT_FDCWD, view, file, &response); 565331Samw 575331Samw saveerrno = errno; 585902Smarks if (response) 595902Smarks (void) nvlist_free(response); 605331Samw errno = saveerrno; 615331Samw 625331Samw return (status == 0); 635331Samw } 645331Samw 655331Samw /* 665331Samw * Returns the type of the specified in file. If the file name matches 675331Samw * the name of either a read-only or read-write extended system attribute 685331Samw * file then sysattr_type() returns the type of file: 695331Samw * return value file type 705331Samw * ------------ --------- 715331Samw * _RO_SATTR read-only extended system attribute file 725331Samw * _RW_SATTR read-write extended system attribute file 735331Samw * _NOT_SATTR neither a read-only or read-write extended system 745331Samw * attribute file. 755331Samw */ 765331Samw int 775331Samw sysattr_type(char *file) 785331Samw { 795331Samw if (file == NULL) { 805331Samw errno = ENOENT; 815331Samw return (_NOT_SATTR); 825331Samw } 835331Samw 845331Samw if (strcmp(basename(file), file) != 0) { 855331Samw errno = EINVAL; 865331Samw return (_NOT_SATTR); 875331Samw } 885331Samw 895331Samw errno = 0; 905331Samw if (strcmp(file, VIEW_READONLY) == 0) { 915331Samw return (_RO_SATTR); 925331Samw } else if (strcmp(file, VIEW_READWRITE) == 0) { 935331Samw return (_RW_SATTR); 945331Samw } else { 955331Samw return (_NOT_SATTR); 965331Samw } 975331Samw } 985331Samw 995331Samw /* 1005331Samw * Call sysattr_support() instead of pathconf(file, _PC_SATTR_ENABLED) or 1015331Samw * pathconf(file, _PC_SATTR_EXISTS) so that if pathconf() fails over NFS, we 1025331Samw * can still try to figure out if extended system attributes are supported by 1035331Samw * testing for a valid extended system attribute file. 1045331Samw * 1055331Samw * 'name' can have the values _PC_SATTR_ENABLED or _PC_SATTR_EXISTS. 1065331Samw * 1075331Samw * Returns 1 if the underlying file system supports extended system attributes, 1085331Samw * otherwise, returns -1. 1095331Samw */ 1105331Samw int 1115331Samw sysattr_support(char *file, int name) 1125331Samw { 1135331Samw int rc; 1145331Samw 1155331Samw errno = 0; 1165331Samw if ((name != _PC_SATTR_ENABLED) && 1175331Samw (name != _PC_SATTR_EXISTS)) { 1185331Samw errno = EINVAL; 1195331Samw return (-1); 1205331Samw } 1215331Samw if (((rc = pathconf(file, name)) == 1) || (errno != EINVAL)) { 1225331Samw return (rc); 1235331Samw } 1245331Samw return (sysattr_status(file, XATTR_VIEW_READONLY)); 1255331Samw } 126