da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
7257d1b4d25bfac0c802847390e98a464fd787acraf
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
575bd8a230f2c20b1878ebb473c30a12f0eb1b2emarks * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include "libcmdutils.h"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Gets file descriptors of attribute directories for source and target
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * attribute files
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwget_attrdirs(int indfd, int outdfd, char *attrfile, int *sfd, int *tfd)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int pwdfd;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int fd1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int fd2;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw pwdfd = open(".", O_RDONLY);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((pwdfd != -1) && (fchdir(indfd) == 0)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((fd1 = attropen(attrfile, ".", O_RDONLY)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fchdir(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *sfd = fd1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fchdir(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (fchdir(outdfd) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((fd2 = attropen(attrfile, ".", O_RDONLY)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fchdir(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *tfd = fd2;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fchdir(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fchdir(pwdfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * mv_xattrs - Copies the content of the extended attribute files. Then
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * moves the extended system attributes from the input attribute files
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to the target attribute files. Moves the extended system attributes
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * from source to the target file. This function returns 0 on success
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and nonzero on error.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwmv_xattrs(char *cmd, char *infile, char *outfile, int sattr, int silent)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int srcfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int indfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int outdfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int tmpfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int sattrfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int tattrfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int asfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int atfd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw DIR *dirp = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct dirent *dp = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *etext = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct stat st1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct stat st2;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nvlist_t *response = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nvlist_t *res = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((srcfd = open(infile, O_RDONLY)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN, "cannot open source");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (sattr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw response = sysattr_list(cmd, srcfd, infile);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((indfd = openat(srcfd, ".", O_RDONLY|O_XATTR)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN, "cannot openat source");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((outdfd = attropen(outfile, ".", O_RDONLY)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN, "cannot attropen target");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((tmpfd = dup(indfd)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN, "cannot dup descriptor");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((dirp = fdopendir(tmpfd)) == NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN, "cannot access source");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while ((dp = readdir(dirp)) != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((dp->d_name[0] == '.' && dp->d_name[1] == '\0') ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (dp->d_name[0] == '.' && dp->d_name[1] == '.' &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw dp->d_name[2] == '\0') ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (sysattr_type(dp->d_name) == _RO_SATTR) ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (sysattr_type(dp->d_name) == _RW_SATTR))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((sattrfd = openat(indfd, dp->d_name,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw O_RDONLY)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "cannot open src attribute file");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (fstat(sattrfd, &st1) < 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "could not stat attribute file");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((tattrfd = openat(outdfd, dp->d_name,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw O_RDWR|O_CREAT|O_TRUNC, st1.st_mode)) == -1) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "cannot open target attribute file");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (fstat(tattrfd, &st2) < 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "could not stat attribute file");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (writefile(sattrfd, tattrfd, infile, outfile, dp->d_name,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw dp->d_name, &st1, &st2) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "failed to copy extended attribute "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "from source to target");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw errno = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (sattr) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Gets non default extended system attributes from
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * source to copy to target.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (dp->d_name != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw res = sysattr_list(cmd, sattrfd, dp->d_name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (res != NULL &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw get_attrdirs(indfd, outdfd, dp->d_name, &asfd,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw &atfd) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "Failed to open attribute files");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copy extended system attribute from source
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * attribute file to target attribute file
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (res != NULL &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (renameat(asfd, VIEW_READWRITE, atfd,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw VIEW_READWRITE) != 0)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (errno == EPERM)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "Permission denied -"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "failed to move system attribute");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "failed to move extended "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "system attribute");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (sattrfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(sattrfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (tattrfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(tattrfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (asfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(asfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (atfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(atfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (res != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nvlist_free(res);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw res = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw errno = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Copy extended system attribute from source to target */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (response != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (renameat(indfd, VIEW_READWRITE, outdfd,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw VIEW_READWRITE) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto done;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (errno == EPERM)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN, "Permission denied");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw etext = dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "failed to move system attribute");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwerror:
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(res);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (silent == 0 && etext != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!sattr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr, dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "%s: %s: cannot move extended attributes, "),
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cmd, infile);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr, dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "%s: %s: cannot move extended system "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "attributes, "), cmd, infile);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw perror(etext);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwdone:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (dirp)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) closedir(dirp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (sattrfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(sattrfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (tattrfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(tattrfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (asfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(asfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (atfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(atfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (indfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(indfd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (outdfd != -1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) close(outdfd);
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(response);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (etext != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The function returns non default extended system attribute list
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * associated with 'fname' and returns NULL when an error has occured
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or when only extended system attributes other than archive,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * av_modified or crtime are set.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The function returns system attribute list for the following cases:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - any extended system attribute other than the default attributes
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ('archive', 'av_modified' and 'crtime') is set
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - nvlist has NULL name string
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - nvpair has data type of 'nvlist'
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - default data type.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwnvlist_t *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsysattr_list(char *cmd, int fd, char *fname)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw boolean_t value;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw data_type_t type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nvlist_t *response;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nvpair_t *pair;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw f_attr_t fattr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (fgetattr(fd, XATTR_VIEW_READWRITE, &response) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr, dgettext(TEXT_DOMAIN,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "%s: %s: fgetattr failed\n"),
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cmd, fname);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw pair = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while ((pair = nvlist_next_nvpair(response, pair)) != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw name = nvpair_name(pair);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (name != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw fattr = name_to_attr(name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (response);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw type = nvpair_type(pair);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (type) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case DATA_TYPE_BOOLEAN_VALUE:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (nvpair_value_boolean_value(pair,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw &value) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fprintf(stderr,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw dgettext(TEXT_DOMAIN, "%s "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "nvpair_value_boolean_value "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "failed\n"), cmd);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value && fattr != F_ARCHIVE &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw fattr != F_AV_MODIFIED)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (response);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case DATA_TYPE_UINT64_ARRAY:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (fattr != F_CRTIME)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (response);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case DATA_TYPE_NVLIST:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (response);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(response);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}