6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * CDDL HEADER START
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * The contents of this file are subject to the terms of the
6185db853e024a486ff8837e6784dd290d866112dougm * Common Development and Distribution License (the "License").
6185db853e024a486ff8837e6784dd290d866112dougm * You may not use this file except in compliance with the License.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6185db853e024a486ff8837e6784dd290d866112dougm * or http://www.opensolaris.org/os/licensing.
6185db853e024a486ff8837e6784dd290d866112dougm * See the License for the specific language governing permissions
6185db853e024a486ff8837e6784dd290d866112dougm * and limitations under the License.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * When distributing Covered Code, include this CDDL HEADER in each
6185db853e024a486ff8837e6784dd290d866112dougm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6185db853e024a486ff8837e6784dd290d866112dougm * If applicable, add the following below this CDDL HEADER, with the
6185db853e024a486ff8837e6784dd290d866112dougm * fields enclosed by brackets "[]" replaced with your own identifying
6185db853e024a486ff8837e6784dd290d866112dougm * information: Portions Copyright [yyyy] [name of copyright owner]
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * CDDL HEADER END
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
5cb0d67909d9970a3e7adbea9422ca3fc88000bfMarcel Telka * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
09c9e6dc9b69d10b771bb87e01040ec320a0bfd3Chris Williamson * Copyright (c) 2016 by Delphix. All rights reserved.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * core library for common functions across all config store types
6185db853e024a486ff8837e6784dd290d866112dougm * and file systems to be exported. This includes legacy dfstab/sharetab
6185db853e024a486ff8837e6784dd290d866112dougm * parsing. Need to eliminate XML where possible.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm#include <stdio.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <string.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <ctype.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <unistd.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <limits.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <errno.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <sys/types.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <sys/stat.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <libxml/parser.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <libxml/tree.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include "libshare.h"
6185db853e024a486ff8837e6784dd290d866112dougm#include "libshare_impl.h"
6185db853e024a486ff8837e6784dd290d866112dougm#include <fcntl.h>
8d7e41661dc4633488e93b13363137523ce59977jose borrego#include <thread.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <grp.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <limits.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <sys/param.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <signal.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <libintl.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <dirent.h>
6185db853e024a486ff8837e6784dd290d866112dougm
a237e38e9161f0acd6451439d4a7dd597e66291dth#include <sharefs/share.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include "sharetab.h"
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm#define DFSTAB_NOTICE_LINES 5
6185db853e024a486ff8837e6784dd290d866112dougmstatic char *notice[DFSTAB_NOTICE_LINES] = {
6185db853e024a486ff8837e6784dd290d866112dougm "# Do not modify this file directly.\n",
6185db853e024a486ff8837e6784dd290d866112dougm "# Use the sharemgr(1m) command for all share management\n",
6185db853e024a486ff8837e6784dd290d866112dougm "# This file is reconstructed and only maintained for backward\n",
6185db853e024a486ff8837e6784dd290d866112dougm "# compatibility. Configuration lines could be lost.\n",
6185db853e024a486ff8837e6784dd290d866112dougm "#\n"
6185db853e024a486ff8837e6784dd290d866112dougm};
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm#define STRNCAT(x, y, z) (xmlChar *)strncat((char *)x, (char *)y, z)
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/* will be much smaller, but this handles bad syntax in the file */
6185db853e024a486ff8837e6784dd290d866112dougm#define MAXARGSFORSHARE 256
6185db853e024a486ff8837e6784dd290d866112dougm
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic mutex_t sharetab_lock = DEFAULTMUTEX;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightextern mutex_t sa_dfstab_lock;
8d7e41661dc4633488e93b13363137523ce59977jose borrego
6185db853e024a486ff8837e6784dd290d866112dougm/* used internally only */
6185db853e024a486ff8837e6784dd290d866112dougmtypedef
6185db853e024a486ff8837e6784dd290d866112dougmstruct sharelist {
6185db853e024a486ff8837e6784dd290d866112dougm struct sharelist *next;
6185db853e024a486ff8837e6784dd290d866112dougm int persist;
6185db853e024a486ff8837e6784dd290d866112dougm char *path;
6185db853e024a486ff8837e6784dd290d866112dougm char *resource;
6185db853e024a486ff8837e6784dd290d866112dougm char *fstype;
6185db853e024a486ff8837e6784dd290d866112dougm char *options;
6185db853e024a486ff8837e6784dd290d866112dougm char *description;
6185db853e024a486ff8837e6784dd290d866112dougm char *group;
6185db853e024a486ff8837e6784dd290d866112dougm char *origline;
6185db853e024a486ff8837e6784dd290d866112dougm int lineno;
6185db853e024a486ff8837e6784dd290d866112dougm} xfs_sharelist_t;
549ec3fff108310966327d1dc9004551b63210b7dougmstatic void parse_dfstab(sa_handle_t, char *, xmlNodePtr);
8d7e41661dc4633488e93b13363137523ce59977jose borregoextern char *_sa_get_token(char *);
6185db853e024a486ff8837e6784dd290d866112dougmstatic void dfs_free_list(xfs_sharelist_t *);
6185db853e024a486ff8837e6784dd290d866112dougm/* prototypes */
549ec3fff108310966327d1dc9004551b63210b7dougmvoid getlegacyconfig(sa_handle_t, char *, xmlNodePtr *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwextern sa_share_t _sa_add_share(sa_group_t, char *, int, int *, uint64_t);
549ec3fff108310966327d1dc9004551b63210b7dougmextern sa_group_t _sa_create_group(sa_handle_impl_t, char *);
6185db853e024a486ff8837e6784dd290d866112dougmstatic void outdfstab(FILE *, xfs_sharelist_t *);
6185db853e024a486ff8837e6784dd290d866112dougmextern int _sa_remove_optionset(sa_optionset_t);
6185db853e024a486ff8837e6784dd290d866112dougmextern int set_node_share(void *, char *, char *);
6185db853e024a486ff8837e6784dd290d866112dougmextern void set_node_attr(void *, char *, char *);
6185db853e024a486ff8837e6784dd290d866112dougm
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm/*
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm * sablocksigs(*sigs)
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm *
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm * block important signals for a critical region. Arg is a pointer to
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm * a sigset_t that is used later for the unblock.
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm */
a99982a76d4cc12b1e9021e88531cf425d1e7369dougmvoid
a99982a76d4cc12b1e9021e88531cf425d1e7369dougmsablocksigs(sigset_t *sigs)
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm{
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sigset_t new;
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm if (sigs != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigprocmask(SIG_BLOCK, NULL, &new);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGHUP);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGINT);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGQUIT);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGTSTP);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigprocmask(SIG_SETMASK, &new, sigs);
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm }
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm}
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm/*
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm * saunblocksigs(*sigs)
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm *
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm * unblock previously blocked signals from the sigs arg.
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm */
a99982a76d4cc12b1e9021e88531cf425d1e7369dougmvoid
a99982a76d4cc12b1e9021e88531cf425d1e7369dougmsaunblocksigs(sigset_t *sigs)
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm{
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm if (sigs != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigprocmask(SIG_SETMASK, sigs, NULL);
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm}
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * alloc_sharelist()
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * allocator function to return an zfs_sharelist_t
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmalloc_sharelist()
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm item = (xfs_sharelist_t *)malloc(sizeof (xfs_sharelist_t));
6185db853e024a486ff8837e6784dd290d866112dougm if (item != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) memset(item, '\0', sizeof (xfs_sharelist_t));
6185db853e024a486ff8837e6784dd290d866112dougm return (item);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * fix_notice(list)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Look at the beginning of the current /etc/dfs/dfstab file and add
6185db853e024a486ff8837e6784dd290d866112dougm * the do not modify notice if it doesn't exist.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmfix_notice(xfs_sharelist_t *list)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item, *prev;
6185db853e024a486ff8837e6784dd290d866112dougm int i;
6185db853e024a486ff8837e6784dd290d866112dougm
7d968cb8b4b6274092771b93e94bf88d1ee31c6cdougm if (list == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* zero length dfstab */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = alloc_sharelist();
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->description = strdup("#\n");
7d968cb8b4b6274092771b93e94bf88d1ee31c6cdougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (list->path == NULL && list->description != NULL &&
6185db853e024a486ff8837e6784dd290d866112dougm strcmp(list->description, notice[0]) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (prev = NULL, i = 0; i < DFSTAB_NOTICE_LINES; i++) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item = alloc_sharelist();
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->description = strdup(notice[i]);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prev == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->next = list;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->next = prev->next;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev->next = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (list);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * getdfstab(dfs)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Returns an zfs_sharelist_t list of lines from the dfstab file
6185db853e024a486ff8837e6784dd290d866112dougm * pointed to by the FILE pointer dfs. Each entry is parsed and the
6185db853e024a486ff8837e6784dd290d866112dougm * original line is also preserved. Used in parsing and updating the
6185db853e024a486ff8837e6784dd290d866112dougm * dfstab file.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmgetdfstab(FILE *dfs)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm char buff[_POSIX_ARG_MAX]; /* reasonable size given syntax of share */
6185db853e024a486ff8837e6784dd290d866112dougm char *bp;
6185db853e024a486ff8837e6784dd290d866112dougm char *token;
6185db853e024a486ff8837e6784dd290d866112dougm char *args[MAXARGSFORSHARE];
6185db853e024a486ff8837e6784dd290d866112dougm int argc;
6185db853e024a486ff8837e6784dd290d866112dougm int c;
6185db853e024a486ff8837e6784dd290d866112dougm static int line = 0;
7d968cb8b4b6274092771b93e94bf88d1ee31c6cdougm xfs_sharelist_t *item = NULL, *first = NULL, *last;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (dfs != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm first = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm line = 0;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while (fgets(buff, sizeof (buff), dfs) != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm line++;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm bp = buff;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (buff[0] == '#') {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item = alloc_sharelist();
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* if no path, then comment */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->lineno = line;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->description = strdup(buff);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (first == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm first = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm last = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm last->next = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm last = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else if (buff[0] == '\n') {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm optind = 1;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item = alloc_sharelist();
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else if (first == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm first = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm last = item;
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm last->next = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm last = item;
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->lineno = line;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->origline = strdup(buff);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) _sa_get_token(NULL); /* reset to new pointers */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm argc = 0;
8d7e41661dc4633488e93b13363137523ce59977jose borrego while ((token = _sa_get_token(bp)) != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (argc < MAXARGSFORSHARE)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm args[argc++] = token;
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while ((c = getopt(argc, args, "F:o:d:pg:")) != -1) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm switch (c) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case 'p':
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->persist = 1;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case 'F':
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->fstype = strdup(optarg);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case 'o':
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->options = strdup(optarg);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case 'd':
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->description = strdup(optarg);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case 'g':
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->group = strdup(optarg);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm default:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (optind < argc) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->path = strdup(args[optind]);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm optind++;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (optind < argc) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *resource;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *optgroup;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* resource and/or groupname */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm resource = args[optind];
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm optgroup = strchr(resource, '@');
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (optgroup != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *optgroup++ = '\0';
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (optgroup != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->group = strdup(optgroup);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (resource != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strlen(resource) > 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->resource =
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strdup(resource);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* NFS is the default if none defined */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item != NULL && item->fstype == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->fstype = strdup("nfs");
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm first = fix_notice(first);
6185db853e024a486ff8837e6784dd290d866112dougm return (first);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * finddfsentry(list, path)
6185db853e024a486ff8837e6784dd290d866112dougm *
7d968cb8b4b6274092771b93e94bf88d1ee31c6cdougm * Look for path in the zfs_sharelist_t list and return the entry if it
6185db853e024a486ff8837e6784dd290d866112dougm * exists.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmfinddfsentry(xfs_sharelist_t *list, char *path)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (item = list; item != NULL; item = item->next) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->path != NULL && strcmp(item->path, path) == 0)
6185db853e024a486ff8837e6784dd290d866112dougm return (item);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (NULL);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * remdfsentry(list, path, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Remove the specified path (with protocol) from the list. This will
6185db853e024a486ff8837e6784dd290d866112dougm * remove it from dfstab when the file is rewritten.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmremdfsentry(xfs_sharelist_t *list, char *path, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item, *prev = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (item = prev = list; item != NULL; item = item->next) {
6185db853e024a486ff8837e6784dd290d866112dougm /* skip comment entry but don't lose it */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->path == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* if proto is NULL, remove all protocols */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (proto == NULL || (strcmp(item->path, path) == 0 &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->fstype != NULL && strcmp(item->fstype, proto) == 0)))
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->fstype == NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (proto == NULL || strcmp(proto, "nfs") == 0))
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
6185db853e024a486ff8837e6784dd290d866112dougm prev = item;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (item != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item == prev)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = item->next; /* this must be the first one */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev->next = item->next;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->next = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfs_free_list(item);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (list);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * remdfsline(list, line)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Remove the line specified from the list.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmremdfsline(xfs_sharelist_t *list, char *line)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item, *prev = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (item = prev = list; item != NULL; item = item->next) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* skip comment entry but don't lose it */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->path == NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm prev = item;
6185db853e024a486ff8837e6784dd290d866112dougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(item->origline, line) == 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev = item;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (item != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item == prev)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = item->next; /* this must be the first one */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prev->next = item->next;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->next = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfs_free_list(item);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (list);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * adddfsentry(list, share, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Add an entry to the dfstab list for share (relative to proto). This
6185db853e024a486ff8837e6784dd290d866112dougm * is used to update dfstab for legacy purposes.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic xfs_sharelist_t *
6185db853e024a486ff8837e6784dd290d866112dougmadddfsentry(xfs_sharelist_t *list, sa_share_t share, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item, *tmp;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t parent;
6185db853e024a486ff8837e6784dd290d866112dougm char *groupname;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm item = alloc_sharelist();
6185db853e024a486ff8837e6784dd290d866112dougm if (item != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm parent = sa_get_parent_group(share);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm groupname = sa_get_group_attr(parent, "name");
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (groupname != NULL && strcmp(groupname, "default") == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm groupname = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->path = sa_get_share_attr(share, "path");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->resource = sa_get_share_attr(share, "resource");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->group = groupname;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->fstype = strdup(proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->options = sa_proto_legacy_format(proto, share, 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->options != NULL && strlen(item->options) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(item->options);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->options = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->description = sa_get_share_description(share);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->description != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strlen(item->description) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_share_description(item->description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->description = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (tmp = list; tmp->next != NULL; tmp = tmp->next)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* do nothing */;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tmp->next = item;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (list);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * outdfstab(dfstab, list)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Output the list to dfstab making sure the file is truncated.
6185db853e024a486ff8837e6784dd290d866112dougm * Comments and errors are preserved.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmoutdfstab(FILE *dfstab, xfs_sharelist_t *list)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *item;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm (void) ftruncate(fileno(dfstab), 0);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (item = list; item != NULL; item = item->next) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->path != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (*item->path == '/') {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fprintf(dfstab,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "share %s%s%s%s%s%s%s %s%s%s%s%s\n",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->fstype != NULL) ? "-F " : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->fstype != NULL) ? item->fstype : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->options != NULL) ? " -o " : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->options != NULL) ?
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->options : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->description != NULL) ?
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm " -d \"" : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->description != NULL) ?
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->description : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->description != NULL) ? "\"" : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->path,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ((item->resource != NULL) ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->group != NULL)) ? " " : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (item->resource != NULL) ?
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->resource : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->group != NULL ? "@" : "",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item->group != NULL ? item->group : "");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fprintf(dfstab, "%s", item->origline);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item->description != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fprintf(dfstab, "%s", item->description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fprintf(dfstab, "%s", item->origline);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * open_dfstab(file)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Open the specified dfstab file. If the owner/group/perms are wrong,
6185db853e024a486ff8837e6784dd290d866112dougm * fix them.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic FILE *
6185db853e024a486ff8837e6784dd290d866112dougmopen_dfstab(char *file)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm struct group *grp;
6185db853e024a486ff8837e6784dd290d866112dougm struct group group;
6185db853e024a486ff8837e6784dd290d866112dougm char *buff;
6185db853e024a486ff8837e6784dd290d866112dougm int grsize;
6185db853e024a486ff8837e6784dd290d866112dougm FILE *dfstab;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm dfstab = fopen(file, "r+");
6185db853e024a486ff8837e6784dd290d866112dougm if (dfstab == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfstab = fopen(file, "w+");
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (dfstab != NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm grsize = sysconf(_SC_GETGR_R_SIZE_MAX);
6185db853e024a486ff8837e6784dd290d866112dougm buff = malloc(grsize);
6185db853e024a486ff8837e6784dd290d866112dougm if (buff != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm grp = getgrnam_r(SA_DEFAULT_FILE_GRP, &group, buff,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm grsize);
6185db853e024a486ff8837e6784dd290d866112dougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm grp = getgrnam(SA_DEFAULT_FILE_GRP);
6185db853e024a486ff8837e6784dd290d866112dougm (void) fchmod(fileno(dfstab), 0644);
6185db853e024a486ff8837e6784dd290d866112dougm (void) fchown(fileno(dfstab), 0,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm grp != NULL ? grp->gr_gid : 3);
6185db853e024a486ff8837e6784dd290d866112dougm if (buff != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(buff);
6185db853e024a486ff8837e6784dd290d866112dougm rewind(dfstab);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (dfstab);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_comment_line(line, err)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Add a comment to the dfstab file with err as a prefix to the
6185db853e024a486ff8837e6784dd290d866112dougm * original line.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmsa_comment_line(char *line, char *err)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm FILE *dfstab;
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *list;
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sigset_t old;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm dfstab = open_dfstab(SA_LEGACY_DFSTAB);
6185db853e024a486ff8837e6784dd290d866112dougm if (dfstab != NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm (void) setvbuf(dfstab, NULL, _IOLBF, BUFSIZ * 8);
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sablocksigs(&old);
6185db853e024a486ff8837e6784dd290d866112dougm (void) lockf(fileno(dfstab), F_LOCK, 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) mutex_lock(&sa_dfstab_lock);
6185db853e024a486ff8837e6784dd290d866112dougm list = getdfstab(dfstab);
6185db853e024a486ff8837e6784dd290d866112dougm rewind(dfstab);
f345c0beb4c8f75cb54c2e070498e56febd468acdougm /*
f345c0beb4c8f75cb54c2e070498e56febd468acdougm * don't ignore the return since the list could have
f345c0beb4c8f75cb54c2e070498e56febd468acdougm * gone to NULL if the file only had one line in it.
f345c0beb4c8f75cb54c2e070498e56febd468acdougm */
f345c0beb4c8f75cb54c2e070498e56febd468acdougm list = remdfsline(list, line);
6185db853e024a486ff8837e6784dd290d866112dougm outdfstab(dfstab, list);
6185db853e024a486ff8837e6784dd290d866112dougm (void) fprintf(dfstab, "# Error: %s: %s", err, line);
6185db853e024a486ff8837e6784dd290d866112dougm (void) fsync(fileno(dfstab));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) mutex_unlock(&sa_dfstab_lock);
6185db853e024a486ff8837e6784dd290d866112dougm (void) lockf(fileno(dfstab), F_ULOCK, 0);
6185db853e024a486ff8837e6784dd290d866112dougm (void) fclose(dfstab);
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm saunblocksigs(&old);
6185db853e024a486ff8837e6784dd290d866112dougm if (list != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfs_free_list(list);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sa_delete_legacy(share, protocol)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Delete the specified share from the legacy config file.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsa_delete_legacy(sa_share_t share, char *protocol)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm FILE *dfstab;
6185db853e024a486ff8837e6784dd290d866112dougm int err;
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *list;
6185db853e024a486ff8837e6784dd290d866112dougm char *path;
6185db853e024a486ff8837e6784dd290d866112dougm sa_optionset_t optionset;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t parent;
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sigset_t old;
6185db853e024a486ff8837e6784dd290d866112dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Protect against shares that don't have paths. This is not
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * really an error at this point.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw path = sa_get_share_attr(share, "path");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (path == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm dfstab = open_dfstab(SA_LEGACY_DFSTAB);
6185db853e024a486ff8837e6784dd290d866112dougm if (dfstab != NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm (void) setvbuf(dfstab, NULL, _IOLBF, BUFSIZ * 8);
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sablocksigs(&old);
6185db853e024a486ff8837e6784dd290d866112dougm parent = sa_get_parent_group(share);
6185db853e024a486ff8837e6784dd290d866112dougm if (parent != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) lockf(fileno(dfstab), F_LOCK, 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) mutex_lock(&sa_dfstab_lock);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = getdfstab(dfstab);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm rewind(dfstab);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (protocol != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (list != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = remdfsentry(list, path,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw protocol);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (optionset = sa_get_optionset(parent, NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw optionset != NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw optionset =
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_get_next_optionset(optionset)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *proto = sa_get_optionset_attr(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw optionset, "type");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (list != NULL && proto != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw list = remdfsentry(list, path,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw proto);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (proto == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_NO_MEMORY;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * may want to only do the dfstab if
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * this call returns NOT IMPLEMENTED
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * but it shouldn't hurt.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SA_OK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw err = sa_proto_delete_legacy(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw proto, share);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (err != SA_NOT_IMPLEMENTED)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = err;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (proto != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm outdfstab(dfstab, list);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfs_free_list(list);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fflush(dfstab);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) mutex_unlock(&sa_dfstab_lock);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) lockf(fileno(dfstab), F_ULOCK, 0);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm (void) fsync(fileno(dfstab));
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm saunblocksigs(&old);
6185db853e024a486ff8837e6784dd290d866112dougm (void) fclose(dfstab);
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (errno == EACCES || errno == EPERM)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_CONFIG_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (path != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(path);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_update_legacy(share, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * There is an assumption that dfstab will be the most common form of
6185db853e024a486ff8837e6784dd290d866112dougm * legacy configuration file for shares, but not the only one. Because
6185db853e024a486ff8837e6784dd290d866112dougm * of that, dfstab handling is done in the main code with calls to
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * this function and protocol specific calls to deal with formatting
6185db853e024a486ff8837e6784dd290d866112dougm * options into dfstab/share compatible syntax. Since not everything
6185db853e024a486ff8837e6784dd290d866112dougm * will be dfstab, there is a provision for calling a protocol
6185db853e024a486ff8837e6784dd290d866112dougm * specific plugin interface that allows the protocol plugin to do its
6185db853e024a486ff8837e6784dd290d866112dougm * own legacy files and skip the dfstab update.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_update_legacy(sa_share_t share, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm FILE *dfstab;
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *list;
6185db853e024a486ff8837e6784dd290d866112dougm char *path;
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sigset_t old;
6185db853e024a486ff8837e6784dd290d866112dougm char *persist;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint64_t features;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm ret = sa_proto_update_legacy(proto, share);
6185db853e024a486ff8837e6784dd290d866112dougm if (ret != SA_NOT_IMPLEMENTED)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw features = sa_proto_get_featureset(proto);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!(features & SA_FEATURE_DFSTAB))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm /* do the dfstab format */
6185db853e024a486ff8837e6784dd290d866112dougm persist = sa_get_share_attr(share, "type");
6185db853e024a486ff8837e6784dd290d866112dougm /*
6185db853e024a486ff8837e6784dd290d866112dougm * only update if the share is not transient -- no share type
6185db853e024a486ff8837e6784dd290d866112dougm * set or the type is not "transient".
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm if (persist == NULL || strcmp(persist, "transient") != 0) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier path = sa_get_share_attr(share, "path");
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (path == NULL) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier ret = SA_NO_MEMORY;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier goto out;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfstab = open_dfstab(SA_LEGACY_DFSTAB);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (dfstab != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) setvbuf(dfstab, NULL, _IOLBF, BUFSIZ * 8);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sablocksigs(&old);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) lockf(fileno(dfstab), F_LOCK, 0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) mutex_lock(&sa_dfstab_lock);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = getdfstab(dfstab);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm rewind(dfstab);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = remdfsentry(list, path, proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = adddfsentry(list, share, proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm outdfstab(dfstab, list);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fflush(dfstab);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) mutex_unlock(&sa_dfstab_lock);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) lockf(fileno(dfstab), F_ULOCK, 0);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fsync(fileno(dfstab));
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm saunblocksigs(&old);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fclose(dfstab);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfs_free_list(list);
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (errno == EACCES || errno == EPERM)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_CONFIG_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier sa_free_attr_string(path);
6185db853e024a486ff8837e6784dd290d866112dougm }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krierout:
6185db853e024a486ff8837e6784dd290d866112dougm if (persist != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(persist);
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_is_security(optname, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Check to see if optname is a security (named optionset) specific
6185db853e024a486ff8837e6784dd290d866112dougm * property for the specified protocol.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_is_security(char *optname, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = 0;
6185db853e024a486ff8837e6784dd290d866112dougm if (proto != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_proto_security_prop(proto, optname);
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * add_syntax_comment(root, line, err, todfstab)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Add a comment to the document indicating a syntax error. If
6185db853e024a486ff8837e6784dd290d866112dougm * todfstab is set, write it back to the dfstab file as well.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmadd_syntax_comment(xmlNodePtr root, char *line, char *err, int todfstab)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xmlNodePtr node;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm node = xmlNewChild(root, NULL, (xmlChar *)"error", (xmlChar *)line);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (node != NULL)
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"type", (xmlChar *)err);
6185db853e024a486ff8837e6784dd290d866112dougm if (todfstab)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_comment_line(line, err);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_is_share(object)
6185db853e024a486ff8837e6784dd290d866112dougm *
5cb0d67909d9970a3e7adbea9422ca3fc88000bfMarcel Telka * returns true if the object is of type "share".
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_is_share(void *object)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm if (object != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp((char *)((xmlNodePtr)object)->name, "share") == 0)
6185db853e024a486ff8837e6784dd290d866112dougm return (1);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (0);
6185db853e024a486ff8837e6784dd290d866112dougm}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sa_is_resource(object)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
5cb0d67909d9970a3e7adbea9422ca3fc88000bfMarcel Telka * returns true if the object is of type "resource".
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsa_is_resource(void *object)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (object != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp((char *)((xmlNodePtr)object)->name, "resource") == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * _sa_remove_property(property)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * remove a property only from the document.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougm_sa_remove_property(sa_property_t property)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xmlUnlinkNode((xmlNodePtr)property);
6185db853e024a486ff8837e6784dd290d866112dougm xmlFreeNode((xmlNodePtr)property);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm/*
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * _sa_create_dummy_share()
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm *
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * Create a share entry suitable for parsing but not tied to any real
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * config tree. Need to have a parent as well as the node to parse
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * on. Free using _sa_free_dummy_share(share);
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm */
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougmstatic sa_group_t
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm_sa_create_dummy_share()
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm{
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm xmlNodePtr parent_node = NULL;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm xmlNodePtr child_node = NULL;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm parent_node = xmlNewNode(NULL, (xmlChar *)"group");
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm if (parent_node != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm child_node = xmlNewChild(parent_node, NULL, (xmlChar *)"share",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (child_node != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Use a "zfs" tag since that will make sure nothing
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * really attempts to put values into the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * repository. Also ZFS is currently the only user of
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * this interface.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(parent_node, "type", "transient");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(parent_node, "zfs", "true");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(child_node, "type", "transient");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(child_node, "zfs", "true");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlFreeNode(parent_node);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm }
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm return (child_node);
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm}
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm/*
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * _sa_free_dummy_share(share)
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm *
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * Free the dummy share and its parent. It is an error to try and
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * free something that isn't a dummy.
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm */
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougmstatic int
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm_sa_free_dummy_share(sa_share_t share)
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm{
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm xmlNodePtr node = (xmlNodePtr)share;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm xmlNodePtr parent;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm int ret = SA_OK;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm char *name;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm if (node != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm parent = node->parent;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm name = (char *)xmlGetProp(node, (xmlChar *)"path");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (name != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Real shares always have a path but a dummy doesn't */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NOT_ALLOWED;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If there is a parent, do the free on that since
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * xmlFreeNode is a recursive function and free's an
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * child nodes.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (parent != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm node = parent;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlUnlinkNode(node);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlFreeNode(node);
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm }
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm }
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm return (ret);
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm}
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_parse_legacy_options(group, options, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * In order to support legacy configurations, we allow the protocol
6185db853e024a486ff8837e6784dd290d866112dougm * specific plugin to parse legacy syntax options (like those in
6185db853e024a486ff8837e6784dd290d866112dougm * /etc/dfs/dfstab). This adds a new optionset to the group (or
6185db853e024a486ff8837e6784dd290d866112dougm * share).
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Once the optionset has been created, we then get the derived
6185db853e024a486ff8837e6784dd290d866112dougm * optionset of the parent (options from the optionset of the parent
6185db853e024a486ff8837e6784dd290d866112dougm * and any parent it might have) and remove those from the created
6185db853e024a486ff8837e6784dd290d866112dougm * optionset. This avoids duplication of options.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_parse_legacy_options(sa_group_t group, char *options, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_INVALID_PROTOCOL;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t parent;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm int using_dummy = B_FALSE;
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm char *pvalue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_optionset_t optionset;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t popt, prop;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_optionset_t localoptions;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If "group" is NULL, this is just a parse without saving
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * anything in either SMF or ZFS. Create a dummy group to
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm * handle this case.
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm */
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm if (group == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = (sa_group_t)_sa_create_dummy_share();
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm using_dummy = B_TRUE;
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm }
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6185db853e024a486ff8837e6784dd290d866112dougm parent = sa_get_parent_group(group);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (proto != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_proto_legacy_opts(proto, group, options);
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm if (using_dummy) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Since this is a dummy parse, cleanup and quit here */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) _sa_free_dummy_share(parent);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret != SA_OK)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If in a group, remove the inherited options and security
6185db853e024a486ff8837e6784dd290d866112dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (parent == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Find parent options to remove from child */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm optionset = sa_get_derived_optionset(parent, proto, 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm localoptions = sa_get_optionset(group, proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (optionset != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (popt = sa_get_property(optionset, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm popt != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm popt = sa_get_next_property(popt)) {
6185db853e024a486ff8837e6784dd290d866112dougm char *tag;
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm char *value;
6185db853e024a486ff8837e6784dd290d866112dougm tag = sa_get_property_attr(popt, "type");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (tag == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = sa_get_property(localoptions, tag);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value = sa_get_property_attr(popt,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "value");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm pvalue = sa_get_property_attr(prop,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "value");
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm if (value != NULL && pvalue != NULL &&
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm strcmp(value, pvalue) == 0) {
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Remove the property
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * from the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * child. While we
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * removed it, we
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * don't need to reset
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * as we do below
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * since we always
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * search from the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * beginning.
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) _sa_remove_property(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop);
6185db853e024a486ff8837e6784dd290d866112dougm }
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(value);
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm if (pvalue != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(pvalue);
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(tag);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = sa_get_property(localoptions, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop == NULL && sa_is_share(group)) {
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * All properties removed so remove the
6185db853e024a486ff8837e6784dd290d866112dougm * optionset if it is on a share
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm (void) _sa_remove_optionset(localoptions);
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_derived_optionset(optionset);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Need to remove security here. If there are no
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * security options on the local group/share, don't
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * bother since those are the only ones that would be
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * affected.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm localoptions = sa_get_all_security_types(group, proto, 0);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (localoptions != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (prop = sa_get_property(localoptions, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = sa_get_next_property(prop)) {
6185db853e024a486ff8837e6784dd290d866112dougm char *tag;
6185db853e024a486ff8837e6784dd290d866112dougm sa_security_t security;
6185db853e024a486ff8837e6784dd290d866112dougm tag = sa_get_property_attr(prop, "type");
6185db853e024a486ff8837e6784dd290d866112dougm if (tag != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t nextpopt = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm security = sa_get_security(group, tag, proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(tag);
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * prop's value only changes outside this loop
717a41ebe41b39f353ba21c3eb3dbbe4c3ba8902dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm pvalue = sa_get_property_attr(prop, "value");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (popt = sa_get_property(security, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm popt != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm popt = nextpopt) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *value;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Need to get the next prop
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * now since we could break
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * the list during removal.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm nextpopt = sa_get_next_property(popt);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* remove Duplicates from this level */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value = sa_get_property_attr(popt,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "value");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL && pvalue != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strcmp(value, pvalue) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * remove the property
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * from the child
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) _sa_remove_property
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (popt);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(value);
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (pvalue != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(pvalue);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_destroy_optionset(localoptions);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * dfs_free_list(list)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Free the data in each list entry of the list as well as freeing the
6185db853e024a486ff8837e6784dd290d866112dougm * entries themselves. We need to avoid memory leaks and don't want to
6185db853e024a486ff8837e6784dd290d866112dougm * dereference any NULL members.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmdfs_free_list(xfs_sharelist_t *list)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *entry;
6185db853e024a486ff8837e6784dd290d866112dougm for (entry = list; entry != NULL; entry = list) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->path != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->resource != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->resource);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->fstype != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->options != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->options);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->description != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->origline != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->origline);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (entry->group != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry->group);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = list->next;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(entry);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * parse_dfstab(dfstab, root)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Open and read the existing dfstab, parsing each line and adding it
6185db853e024a486ff8837e6784dd290d866112dougm * to the internal configuration. Make sure syntax errors, etc are
6185db853e024a486ff8837e6784dd290d866112dougm * preserved as comments.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
549ec3fff108310966327d1dc9004551b63210b7dougmparse_dfstab(sa_handle_t handle, char *dfstab, xmlNodePtr root)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_share_t share;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t sgroup = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t defgroup;
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *head, *list;
6185db853e024a486ff8837e6784dd290d866112dougm int err;
6185db853e024a486ff8837e6784dd290d866112dougm int defined_group;
6185db853e024a486ff8837e6784dd290d866112dougm FILE *dfs;
6185db853e024a486ff8837e6784dd290d866112dougm char *oldprops;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm /* read the dfstab format file and fill in the doc tree */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm dfs = fopen(dfstab, "r");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (dfs == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return;
6185db853e024a486ff8837e6784dd290d866112dougm
549ec3fff108310966327d1dc9004551b63210b7dougm defgroup = sa_get_group(handle, "default");
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (head = list = getdfstab(dfs);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = list->next) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm defined_group = 0;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm err = 0;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->origline == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Comment line that we will likely skip.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If the line has the syntax:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * # error: string: string
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * It should be preserved until manually deleted.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->description != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strncmp(list->description, "# Error: ", 9) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *line;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *error;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *cmd;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm line = strdup(list->description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (line != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm error = line + 9;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm cmd = strchr(error, ':');
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (cmd != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm int len;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *cmd = '\0';
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm cmd += 2;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm len = strlen(cmd);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm cmd[len - 1] = '\0';
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm add_syntax_comment(root, cmd,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm error, 0);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(line);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->path != NULL && strlen(list->path) > 0 &&
549ec3fff108310966327d1dc9004551b63210b7dougm *list->path == '/') {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = sa_find_share(handle, list->path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (share != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sgroup = sa_get_parent_group(share);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sgroup = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) printf(dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "No share specified in dfstab: "
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "line %d: %s\n"),
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->lineno, list->origline);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm add_syntax_comment(root, list->origline,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dgettext(TEXT_DOMAIN, "No share specified"), 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->group != NULL && strlen(list->group) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = sa_get_group(handle, list->group);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm defined_group = 1;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = defgroup;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (defined_group && group == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) printf(dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "Unknown group used in dfstab: line %d: %s\n"),
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->lineno, list->origline);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm add_syntax_comment(root, list->origline,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dgettext(TEXT_DOMAIN, "Unknown group specified"),
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (group == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Shouldn't happen unless an SMF error */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm err = SA_CONFIG_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (share == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (defined_group || group != defgroup)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* This is an OK add for legacy */
6185db853e024a486ff8837e6784dd290d866112dougm share = sa_add_share(defgroup, list->path,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm SA_SHARE_PERMANENT | SA_SHARE_PARSER, &err);
6185db853e024a486ff8837e6784dd290d866112dougm if (share != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->description != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strlen(list->description) > 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_set_share_description(share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->options != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strlen(list->options) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_parse_legacy_options(share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->options, list->fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list->resource != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_set_share_attr(share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "resource", list->resource);
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) printf(dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "Error in dfstab: line %d: %s\n"),
6185db853e024a486ff8837e6784dd290d866112dougm list->lineno, list->origline);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (err != SA_BAD_PATH)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm add_syntax_comment(root, list->origline,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dgettext(TEXT_DOMAIN, "Syntax"), 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm add_syntax_comment(root, list->origline,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "Path"), 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (group != sgroup) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) printf(dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "Attempt to change configuration in "
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "dfstab: line %d: %s\n"),
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->lineno, list->origline);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm add_syntax_comment(root, list->origline,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "Attempt to change configuration"), 1);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm /*
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm * It is the same group but could have changed
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm * options. Make sure we include the group's
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm * properties so we don't end up moving them to
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm * the share inadvertantly. The last arg being
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm * true says to get the inherited properties as well
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm * as the local properties.
546405c3c5a146c88705b0b02a469d1bd57f2b53dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm oldprops = sa_proto_legacy_format(list->fstype, share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm B_TRUE);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (oldprops == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm if (list->options != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strcmp(oldprops, list->options) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_optionset_t opts;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_security_t secs;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* possibly different values */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm opts = sa_get_optionset((sa_group_t)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share, list->fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_destroy_optionset(opts);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (secs = sa_get_security(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (sa_group_t)share, NULL, list->fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm secs != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm secs = sa_get_security((sa_group_t)share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm NULL, list->fstype)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_destroy_security(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm secs);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_parse_legacy_options(share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list->options, list->fstype);
6185db853e024a486ff8837e6784dd290d866112dougm }
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm sa_format_free(oldprops);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm dfs_free_list(head);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * legacy_removes(group, file)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Find any shares that are "missing" from the legacy file. These
6185db853e024a486ff8837e6784dd290d866112dougm * should be removed from the configuration since they are likely from
6185db853e024a486ff8837e6784dd290d866112dougm * a legacy app or the admin modified the dfstab file directly. We
6185db853e024a486ff8837e6784dd290d866112dougm * have to support this even if it is not the recommended way to do
6185db853e024a486ff8837e6784dd290d866112dougm * things.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmlegacy_removes(sa_group_t group, char *file)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_share_t share;
6185db853e024a486ff8837e6784dd290d866112dougm char *path;
6185db853e024a486ff8837e6784dd290d866112dougm xfs_sharelist_t *list, *item;
6185db853e024a486ff8837e6784dd290d866112dougm FILE *dfstab;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm dfstab = fopen(file, "r");
6185db853e024a486ff8837e6784dd290d866112dougm if (dfstab != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm list = getdfstab(dfstab);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) fclose(dfstab);
f345c0beb4c8f75cb54c2e070498e56febd468acdougmretry:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (share = sa_get_share(group, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = sa_get_next_share(share)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* now see if the share is in the dfstab file */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm path = sa_get_share_attr(share, "path");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (path != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm item = finddfsentry(list, path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (item == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* The share was removed this way */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_remove_share(share);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Start over since the list was broken
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto retry;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (list != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm dfs_free_list(list);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * getlegacyconfig(path, root)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Parse dfstab and build the legacy configuration. This only gets
6185db853e024a486ff8837e6784dd290d866112dougm * called when a change was detected.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
549ec3fff108310966327d1dc9004551b63210b7dougmgetlegacyconfig(sa_handle_t handle, char *path, xmlNodePtr *root)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t defgroup;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (root != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (*root == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *root = xmlNewNode(NULL, (xmlChar *)"sharecfg");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (*root != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(path, SA_LEGACY_DFSTAB) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Walk the default shares and find anything
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * missing. we do this first to make sure it
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * is cleaned up since there may be legacy
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * code add/del via dfstab and we need to
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * cleanup SMF.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm defgroup = sa_get_group(handle, "default");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (defgroup != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm legacy_removes(defgroup, path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Parse the dfstab and add anything new */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm parse_dfstab(handle, path, *root);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
1cea05af420c1992d793dc442f4e30c7269fc107dougm/*
1cea05af420c1992d793dc442f4e30c7269fc107dougm * get_share_list(&err)
1cea05af420c1992d793dc442f4e30c7269fc107dougm *
1cea05af420c1992d793dc442f4e30c7269fc107dougm * Get a linked list of all the shares on the system from
1cea05af420c1992d793dc442f4e30c7269fc107dougm * /etc/dfs/sharetab. This is partially copied from libfsmgt which we
1cea05af420c1992d793dc442f4e30c7269fc107dougm * can't use due to package dependencies.
1cea05af420c1992d793dc442f4e30c7269fc107dougm */
1cea05af420c1992d793dc442f4e30c7269fc107dougmstatic xfs_sharelist_t *
1cea05af420c1992d793dc442f4e30c7269fc107dougmget_share_list(int *errp)
1cea05af420c1992d793dc442f4e30c7269fc107dougm{
1cea05af420c1992d793dc442f4e30c7269fc107dougm xfs_sharelist_t *newp;
1cea05af420c1992d793dc442f4e30c7269fc107dougm xfs_sharelist_t *headp;
1cea05af420c1992d793dc442f4e30c7269fc107dougm xfs_sharelist_t *tailp;
1cea05af420c1992d793dc442f4e30c7269fc107dougm FILE *fp;
1cea05af420c1992d793dc442f4e30c7269fc107dougm
1cea05af420c1992d793dc442f4e30c7269fc107dougm headp = NULL;
1cea05af420c1992d793dc442f4e30c7269fc107dougm tailp = NULL;
1cea05af420c1992d793dc442f4e30c7269fc107dougm
1cea05af420c1992d793dc442f4e30c7269fc107dougm if ((fp = fopen(SHARETAB, "r")) != NULL) {
1cea05af420c1992d793dc442f4e30c7269fc107dougm struct share *sharetab_entry;
1cea05af420c1992d793dc442f4e30c7269fc107dougm
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) lockf(fileno(fp), F_LOCK, 0);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) mutex_lock(&sharetab_lock);
8d7e41661dc4633488e93b13363137523ce59977jose borrego
1cea05af420c1992d793dc442f4e30c7269fc107dougm while (getshare(fp, &sharetab_entry) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newp = alloc_sharelist();
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (newp == NULL) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) mutex_unlock(&sharetab_lock);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) lockf(fileno(fp), F_ULOCK, 0);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto err;
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
1cea05af420c1992d793dc442f4e30c7269fc107dougm
1cea05af420c1992d793dc442f4e30c7269fc107dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Link into the list here so we don't leak
1cea05af420c1992d793dc442f4e30c7269fc107dougm * memory on a failure from strdup().
1cea05af420c1992d793dc442f4e30c7269fc107dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (headp == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm headp = newp;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tailp = newp;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tailp->next = newp;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tailp = newp;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newp->path = strdup(sharetab_entry->sh_path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newp->resource = strdup(sharetab_entry->sh_res);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newp->fstype = strdup(sharetab_entry->sh_fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newp->options = strdup(sharetab_entry->sh_opts);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newp->description = strdup(sharetab_entry->sh_descr);
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (newp->path == NULL || newp->resource == NULL ||
8d7e41661dc4633488e93b13363137523ce59977jose borrego newp->fstype == NULL || newp->options == NULL ||
8d7e41661dc4633488e93b13363137523ce59977jose borrego newp->description == NULL) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) mutex_unlock(&sharetab_lock);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) lockf(fileno(fp), F_ULOCK, 0);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto err;
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
1cea05af420c1992d793dc442f4e30c7269fc107dougm }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) mutex_unlock(&sharetab_lock);
a99982a76d4cc12b1e9021e88531cf425d1e7369dougm (void) lockf(fileno(fp), F_ULOCK, 0);
1cea05af420c1992d793dc442f4e30c7269fc107dougm (void) fclose(fp);
1cea05af420c1992d793dc442f4e30c7269fc107dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *errp = errno;
1cea05af420c1992d793dc442f4e30c7269fc107dougm }
1cea05af420c1992d793dc442f4e30c7269fc107dougm
1cea05af420c1992d793dc442f4e30c7269fc107dougm /*
1cea05af420c1992d793dc442f4e30c7269fc107dougm * Caller must free the mount list
1cea05af420c1992d793dc442f4e30c7269fc107dougm */
1cea05af420c1992d793dc442f4e30c7269fc107dougm return (headp);
1cea05af420c1992d793dc442f4e30c7269fc107dougmerr:
1cea05af420c1992d793dc442f4e30c7269fc107dougm /*
1cea05af420c1992d793dc442f4e30c7269fc107dougm * Out of memory so cleanup and leave.
1cea05af420c1992d793dc442f4e30c7269fc107dougm */
1cea05af420c1992d793dc442f4e30c7269fc107dougm dfs_free_list(headp);
1cea05af420c1992d793dc442f4e30c7269fc107dougm (void) fclose(fp);
1cea05af420c1992d793dc442f4e30c7269fc107dougm return (NULL);
1cea05af420c1992d793dc442f4e30c7269fc107dougm}
1cea05af420c1992d793dc442f4e30c7269fc107dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
549ec3fff108310966327d1dc9004551b63210b7dougm * parse_sharetab(handle)
6185db853e024a486ff8837e6784dd290d866112dougm *
1cea05af420c1992d793dc442f4e30c7269fc107dougm * Read the /etc/dfs/sharetab file and see which entries don't exist
1cea05af420c1992d793dc442f4e30c7269fc107dougm * in the repository. These shares are marked transient. We also need
1cea05af420c1992d793dc442f4e30c7269fc107dougm * to see if they are ZFS shares since ZFS bypasses the SMF
1cea05af420c1992d793dc442f4e30c7269fc107dougm * repository.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
549ec3fff108310966327d1dc9004551b63210b7dougmparse_sharetab(sa_handle_t handle)
6185db853e024a486ff8837e6784dd290d866112dougm{
1cea05af420c1992d793dc442f4e30c7269fc107dougm xfs_sharelist_t *list, *tmplist;
6185db853e024a486ff8837e6784dd290d866112dougm int err = 0;
6185db853e024a486ff8837e6784dd290d866112dougm sa_share_t share;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t lgroup;
6185db853e024a486ff8837e6784dd290d866112dougm char *groupname;
6185db853e024a486ff8837e6784dd290d866112dougm int legacy = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char shareopts[MAXNAMLEN];
6185db853e024a486ff8837e6784dd290d866112dougm
1cea05af420c1992d793dc442f4e30c7269fc107dougm list = get_share_list(&err);
6185db853e024a486ff8837e6784dd290d866112dougm if (list == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (legacy);
6185db853e024a486ff8837e6784dd290d866112dougm
549ec3fff108310966327d1dc9004551b63210b7dougm lgroup = sa_get_group(handle, "default");
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (tmplist = list; tmplist != NULL; tmplist = tmplist->next) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = sa_find_share(handle, tmplist->path);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (share != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If this is a legacy share, mark as shared so we
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * only update sharetab appropriately. We also keep
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * the sharetab options in order to display for legacy
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * share with no arguments.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(share, "shared", "true");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) snprintf(shareopts, MAXNAMLEN, "shareopts-%s",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tmplist->fstype);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set_node_attr(share, shareopts, tmplist->options);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * This share is transient so needs to be
6185db853e024a486ff8837e6784dd290d866112dougm * added. Initially, this will be under
6185db853e024a486ff8837e6784dd290d866112dougm * default(legacy) unless it is a ZFS
6185db853e024a486ff8837e6784dd290d866112dougm * share. If zfs, we need a zfs group.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm if (tmplist->resource != NULL &&
6185db853e024a486ff8837e6784dd290d866112dougm (groupname = strchr(tmplist->resource, '@')) != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* There is a defined group */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *groupname++ = '\0';
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = sa_get_group(handle, groupname);
6185db853e024a486ff8837e6784dd290d866112dougm if (group != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw share = _sa_add_share(group, tmplist->path,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw SA_SHARE_TRANSIENT, &err,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (uint64_t)SA_FEATURE_NONE);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * While this case shouldn't
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * occur very often, it does
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * occur out of a "zfs set
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * sharenfs=off" when the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * dataset is also set to
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * canmount=off. A warning
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * will then cause the zfs
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * command to abort. Since we
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * add it to the default list,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * everything works properly
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * anyway and the library
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * doesn't need to give a
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * warning.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = _sa_add_share(lgroup,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tmplist->path, SA_SHARE_TRANSIENT,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw &err, (uint64_t)SA_FEATURE_NONE);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sa_zfs_is_shared(handle, tmplist->path)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = sa_get_group(handle, "zfs");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (group == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = sa_create_group(handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "zfs", &err);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (group == NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm err == SA_NO_PERMISSION) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = _sa_create_group(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (sa_handle_impl_t)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "zfs");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (group != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_create_optionset(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group, tmplist->fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_set_group_attr(group,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "zfs", "true");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (group != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = _sa_add_share(group,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tmplist->path, SA_SHARE_TRANSIENT,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw &err, (uint64_t)SA_FEATURE_NONE);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = _sa_add_share(lgroup, tmplist->path,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw SA_SHARE_TRANSIENT, &err,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (uint64_t)SA_FEATURE_NONE);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (share == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) printf(dgettext(TEXT_DOMAIN,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "Problem with transient: %s\n"), sa_errorstr(err));
6185db853e024a486ff8837e6784dd290d866112dougm if (share != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(share, "shared", "true");
6185db853e024a486ff8837e6784dd290d866112dougm if (err == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (tmplist->options != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strlen(tmplist->options) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sa_parse_legacy_options(share,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tmplist->options, tmplist->fstype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (tmplist->resource != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm strcmp(tmplist->resource, "-") != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(share, "resource",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm tmplist->resource);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (tmplist->description != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlNodePtr node;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm node = xmlNewChild((xmlNodePtr)share, NULL,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)"description", NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlNodeSetContent(node,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)tmplist->description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm legacy = 1;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
1cea05af420c1992d793dc442f4e30c7269fc107dougm dfs_free_list(list);
6185db853e024a486ff8837e6784dd290d866112dougm return (legacy);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Get the transient shares from the sharetab (or other) file. since
6185db853e024a486ff8837e6784dd290d866112dougm * these are transient, they only appear in the working file and not
6185db853e024a486ff8837e6784dd290d866112dougm * in a repository.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmint
549ec3fff108310966327d1dc9004551b63210b7dougmgettransients(sa_handle_impl_t ihandle, xmlNodePtr *root)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int legacy = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int numproto;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char **protocols = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int i;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (root != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (*root == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *root = xmlNewNode(NULL, (xmlChar *)"sharecfg");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*root != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm legacy = parse_sharetab(ihandle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw numproto = sa_get_protocols(&protocols);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (i = 0; i < numproto; i++)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw legacy |= sa_proto_get_transients(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (sa_handle_t)ihandle, protocols[i]);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (protocols != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(protocols);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (legacy);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_has_prop(optionset, prop)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Is the specified property a member of the optionset?
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_has_prop(sa_optionset_t optionset, sa_property_t prop)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm char *name;
6185db853e024a486ff8837e6784dd290d866112dougm sa_property_t otherprop;
6185db853e024a486ff8837e6784dd290d866112dougm int result = 0;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (optionset != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm name = sa_get_property_attr(prop, "type");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (name != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm otherprop = sa_get_property(optionset, name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (otherprop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm result = 1;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (result);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * Update legacy files
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Provides functions to add/remove/modify individual entries
6185db853e024a486ff8837e6784dd290d866112dougm * in dfstab and sharetab
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
549ec3fff108310966327d1dc9004551b63210b7dougmupdate_legacy_config(sa_handle_t handle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm /*
6185db853e024a486ff8837e6784dd290d866112dougm * no longer used -- this is a placeholder in case we need to
6185db853e024a486ff8837e6784dd290d866112dougm * add it back later.
6185db853e024a486ff8837e6784dd290d866112dougm */
549ec3fff108310966327d1dc9004551b63210b7dougm#ifdef lint
549ec3fff108310966327d1dc9004551b63210b7dougm handle = handle;
549ec3fff108310966327d1dc9004551b63210b7dougm#endif
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
687915e946710e354e302fa654bf53bf38b57cc6dougm * sa_valid_property(handle, object, proto, property)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * check to see if the specified property is valid relative to the
6185db853e024a486ff8837e6784dd290d866112dougm * specified protocol. The protocol plugin is called to do the work.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
687915e946710e354e302fa654bf53bf38b57cc6dougmsa_valid_property(sa_handle_t handle, void *object, char *proto,
687915e946710e354e302fa654bf53bf38b57cc6dougm sa_property_t property)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (proto != NULL && property != NULL) {
687915e946710e354e302fa654bf53bf38b57cc6dougm ret = sa_proto_valid_prop(handle, proto, property, object);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_fstype(path)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Given path, return the string representing the path's file system
6185db853e024a486ff8837e6784dd290d866112dougm * type. This is used to discover ZFS shares.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmchar *
6185db853e024a486ff8837e6784dd290d866112dougmsa_fstype(char *path)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int err;
6185db853e024a486ff8837e6784dd290d866112dougm struct stat st;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm err = stat(path, &st);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (err < 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm err = SA_NO_SUCH_PATH;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm err = SA_OK;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If we have a valid path at this point ret, return the fstype.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (err == SA_OK)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (strdup(st.st_fstype));
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm return (NULL);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
6185db853e024a486ff8837e6784dd290d866112dougmsa_free_fstype(char *type)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm free(type);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_get_derived_optionset(object, proto, hier)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Work backward to the top of the share object tree and start
6185db853e024a486ff8837e6784dd290d866112dougm * copying protocol specific optionsets into a newly created
6185db853e024a486ff8837e6784dd290d866112dougm * optionset that doesn't have a parent (it will be freed
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * later). This provides for the property inheritance model. That
6185db853e024a486ff8837e6784dd290d866112dougm * is, properties closer to the share take precedence over group
6185db853e024a486ff8837e6784dd290d866112dougm * level. This also provides for groups of groups in the future.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmsa_optionset_t
6185db853e024a486ff8837e6784dd290d866112dougmsa_get_derived_optionset(void *object, char *proto, int hier)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_optionset_t newoptionset;
6185db853e024a486ff8837e6784dd290d866112dougm sa_optionset_t optionset;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (hier &&
6185db853e024a486ff8837e6784dd290d866112dougm (group = sa_get_parent_group((sa_share_t)object)) != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newoptionset = sa_get_derived_optionset((void *)group, proto,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm hier);
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newoptionset = (sa_optionset_t)xmlNewNode(NULL,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)"optionset");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (newoptionset != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_set_optionset_attr(newoptionset, "type", proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Dont' do anything if memory wasn't allocated */
6185db853e024a486ff8837e6784dd290d866112dougm if (newoptionset == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (NULL);
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Found the top so working back down the stack */
6185db853e024a486ff8837e6784dd290d866112dougm optionset = sa_get_optionset((sa_optionset_t)object, proto);
6185db853e024a486ff8837e6784dd290d866112dougm if (optionset != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t prop;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* add optionset to the newoptionset */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (prop = sa_get_property(optionset, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = sa_get_next_property(prop)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t newprop;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *name;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *value;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm name = sa_get_property_attr(prop, "type");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value = sa_get_property_attr(prop, "value");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (name == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newprop = sa_get_property(newoptionset, name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Replace the value with the new value */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (newprop != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Only set if value is non NULL, old value ok
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * if it is NULL.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm set_node_attr(newprop, "value", value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* an entirely new property */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newprop = sa_create_property(name,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (newprop != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newprop = (sa_property_t)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlAddChild(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlNodePtr)newoptionset,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlNodePtr)newprop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(value);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (newoptionset);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
6185db853e024a486ff8837e6784dd290d866112dougmsa_free_derived_optionset(sa_optionset_t optionset)
6185db853e024a486ff8837e6784dd290d866112dougm{
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* While it shouldn't be linked, it doesn't hurt */
6185db853e024a486ff8837e6784dd290d866112dougm if (optionset != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlUnlinkNode((xmlNodePtr) optionset);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlFreeNode((xmlNodePtr) optionset);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_get_all_security_types(object, proto, hier)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Find all the security types set for this object. This is
6185db853e024a486ff8837e6784dd290d866112dougm * preliminary to getting a derived security set. The return value is an
6185db853e024a486ff8837e6784dd290d866112dougm * optionset containg properties which are the sectype values found by
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * walking up the XML document structure. The returned optionset
6185db853e024a486ff8837e6784dd290d866112dougm * is a derived optionset.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * If hier is 0, only look at object. If non-zero, walk up the tree.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmsa_optionset_t
6185db853e024a486ff8837e6784dd290d866112dougmsa_get_all_security_types(void *object, char *proto, int hier)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_optionset_t options;
6185db853e024a486ff8837e6784dd290d866112dougm sa_security_t security;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
6185db853e024a486ff8837e6784dd290d866112dougm sa_property_t prop;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm options = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (hier &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (group = sa_get_parent_group((sa_share_t)object)) != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm options = sa_get_all_security_types((void *)group, proto, hier);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm options = (sa_optionset_t)xmlNewNode(NULL,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)"optionset");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (options == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (options);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Hit the top so collect the security types working back. */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (security = sa_get_security((sa_group_t)object, NULL, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm security != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm security = sa_get_next_security(security)) {
6185db853e024a486ff8837e6784dd290d866112dougm char *type;
6185db853e024a486ff8837e6784dd290d866112dougm char *sectype;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm type = sa_get_security_attr(security, "type");
6185db853e024a486ff8837e6784dd290d866112dougm if (type != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(type, proto) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(type);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sectype = sa_get_security_attr(security, "sectype");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sectype != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Have a security type, check to see if
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * already present in optionset and add if it
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * isn't.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sa_get_property(options, sectype) == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = sa_create_property(sectype,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "true");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = (sa_property_t)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlAddChild(
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlNodePtr)options,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlNodePtr)prop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(sectype);
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(type);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm return (options);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_get_derived_security(object, sectype, proto, hier)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Get the derived security(named optionset) for the object given the
6185db853e024a486ff8837e6784dd290d866112dougm * sectype and proto. If hier is non-zero, walk up the tree to get all
6185db853e024a486ff8837e6784dd290d866112dougm * properties defined for this object, otherwise just those on the
6185db853e024a486ff8837e6784dd290d866112dougm * object.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmsa_security_t
6185db853e024a486ff8837e6784dd290d866112dougmsa_get_derived_security(void *object, char *sectype, char *proto, int hier)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_security_t newsecurity;
6185db853e024a486ff8837e6784dd290d866112dougm sa_security_t security;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t prop;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (hier &&
6185db853e024a486ff8837e6784dd290d866112dougm (group = sa_get_parent_group((sa_share_t)object)) != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newsecurity = sa_get_derived_security((void *)group,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sectype, proto, hier);
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newsecurity = (sa_security_t)xmlNewNode(NULL,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)"security");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (newsecurity != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_set_security_attr(newsecurity, "type", proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_set_security_attr(newsecurity, "sectype", sectype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Don't do anything if memory wasn't allocated */
6185db853e024a486ff8837e6784dd290d866112dougm if (newsecurity == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (newsecurity);
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Found the top so working back down the stack. */
6185db853e024a486ff8837e6784dd290d866112dougm security = sa_get_security((sa_security_t)object, sectype, proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (security == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (newsecurity);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* add security to the newsecurity */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (prop = sa_get_property(security, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop != NULL; prop = sa_get_next_property(prop)) {
6185db853e024a486ff8837e6784dd290d866112dougm sa_property_t newprop;
6185db853e024a486ff8837e6784dd290d866112dougm char *name;
6185db853e024a486ff8837e6784dd290d866112dougm char *value;
6185db853e024a486ff8837e6784dd290d866112dougm name = sa_get_property_attr(prop, "type");
6185db853e024a486ff8837e6784dd290d866112dougm value = sa_get_property_attr(prop, "value");
6185db853e024a486ff8837e6784dd290d866112dougm if (name != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newprop = sa_get_property(newsecurity, name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Replace the value with the new value */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (newprop != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
97df5ac96dbf15a7624a8e07b7dd686404d988c0dougm * Only set if value is non NULL, old
97df5ac96dbf15a7624a8e07b7dd686404d988c0dougm * value ok if it is NULL. The value
97df5ac96dbf15a7624a8e07b7dd686404d988c0dougm * must be associated with the "value"
97df5ac96dbf15a7624a8e07b7dd686404d988c0dougm * tag within XML.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL)
97df5ac96dbf15a7624a8e07b7dd686404d988c0dougm set_node_attr(newprop, "value", value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* An entirely new property */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newprop = sa_create_property(name,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm newprop = (sa_property_t)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlAddChild((xmlNodePtr)newsecurity,
6185db853e024a486ff8837e6784dd290d866112dougm (xmlNodePtr)newprop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(name);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(value);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (newsecurity);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
6185db853e024a486ff8837e6784dd290d866112dougmsa_free_derived_security(sa_security_t security)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm /* while it shouldn't be linked, it doesn't hurt */
6185db853e024a486ff8837e6784dd290d866112dougm if (security != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlUnlinkNode((xmlNodePtr)security);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlFreeNode((xmlNodePtr)security);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sharetab utility functions
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Makes use of the original sharetab.c from fs.d/nfs/lib
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * sa_fillshare(share, proto, sh)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Fill the struct share with values obtained from the share object.
6185db853e024a486ff8837e6784dd290d866112dougm */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksvoid
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkssa_fillshare(sa_share_t share, char *proto, struct share *sh)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm char *groupname = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm char *value;
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
6185db853e024a486ff8837e6784dd290d866112dougm char *buff;
6185db853e024a486ff8837e6784dd290d866112dougm char *zfs;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *rsrcname = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *defprop;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * We only want to deal with the path level shares for the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sharetab file. If a resource, get the parent.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (sa_is_resource(share)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource = (sa_resource_t)share;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw share = sa_get_resource_parent(resource);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rsrcname = sa_get_resource_attr(resource, "name");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm group = sa_get_parent_group(share);
6185db853e024a486ff8837e6784dd290d866112dougm if (group != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm zfs = sa_get_group_attr(group, "zfs");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm groupname = sa_get_group_attr(group, "name");
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (groupname != NULL &&
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (strcmp(groupname, "default") == 0 || zfs != NULL)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * since the groupname is either "default" or the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * group is a ZFS group, we don't want to keep
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * groupname. We do want it if it is any other type of
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * group.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm groupname = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (zfs != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(zfs);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm value = sa_get_share_attr(share, "path");
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sh->sh_path = strdup(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(value);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rsrcname != NULL || groupname != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm int len = 0;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rsrcname != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw len += strlen(rsrcname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (groupname != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm len += strlen(groupname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm len += 3; /* worst case */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm buff = malloc(len);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) snprintf(buff, len, "%s%s%s",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (rsrcname != NULL &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strlen(rsrcname) > 0) ? rsrcname : "-",
6185db853e024a486ff8837e6784dd290d866112dougm groupname != NULL ? "@" : "",
6185db853e024a486ff8837e6784dd290d866112dougm groupname != NULL ? groupname : "");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sh->sh_res = buff;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (rsrcname != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(rsrcname);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (groupname != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sh->sh_res = strdup("-");
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Get correct default prop string. NFS uses "rw", others use
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * "".
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(proto, "nfs") != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw defprop = "\"\"";
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw defprop = "rw";
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm sh->sh_fstype = strdup(proto);
6185db853e024a486ff8837e6784dd290d866112dougm value = sa_proto_legacy_format(proto, share, 1);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strlen(value) > 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sh->sh_opts = strdup(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sh->sh_opts = strdup(defprop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sh->sh_opts = strdup(defprop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm value = sa_get_share_description(share);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sh->sh_descr = strdup(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_share_description(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sh->sh_descr = strdup("");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * sa_emptyshare(sh)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Free the strings in the non-NULL members of sh.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksvoid
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkssa_emptyshare(struct share *sh)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm if (sh->sh_path != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(sh->sh_path);
6185db853e024a486ff8837e6784dd290d866112dougm sh->sh_path = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm if (sh->sh_res != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(sh->sh_res);
6185db853e024a486ff8837e6784dd290d866112dougm sh->sh_res = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm if (sh->sh_fstype != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(sh->sh_fstype);
6185db853e024a486ff8837e6784dd290d866112dougm sh->sh_fstype = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm if (sh->sh_opts != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(sh->sh_opts);
6185db853e024a486ff8837e6784dd290d866112dougm sh->sh_opts = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm if (sh->sh_descr != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(sh->sh_descr);
6185db853e024a486ff8837e6784dd290d866112dougm sh->sh_descr = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm/*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * sa_update_sharetab_ts(handle)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm *
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * Update the internal timestamp of when sharetab was last
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * changed. This needs to be public for ZFS to get at it.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmvoid
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmsa_update_sharetab_ts(sa_handle_t handle)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm{
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm struct stat st;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_handle_impl_t implhandle = (sa_handle_impl_t)handle;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (implhandle != NULL && stat(SA_LEGACY_SHARETAB, &st) == 0)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm implhandle->tssharetab = TSTAMP(st.st_mtim);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm}
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_update_sharetab(share, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Update the sharetab file with info from the specified share.
6185db853e024a486ff8837e6784dd290d866112dougm * This could be an update or add.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_update_sharetab(sa_share_t share, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
a237e38e9161f0acd6451439d4a7dd597e66291dth int ret = SA_OK;
a237e38e9161f0acd6451439d4a7dd597e66291dth share_t sh;
a237e38e9161f0acd6451439d4a7dd597e66291dth char *path;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_handle_t handle;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm path = sa_get_share_attr(share, "path");
6185db853e024a486ff8837e6784dd290d866112dougm if (path != NULL) {
a237e38e9161f0acd6451439d4a7dd597e66291dth (void) memset(&sh, '\0', sizeof (sh));
a237e38e9161f0acd6451439d4a7dd597e66291dth
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm handle = sa_find_group_handle((sa_group_t)share);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (handle != NULL) {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm /*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * Fill in share structure and send it to the kernel.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm (void) sa_fillshare(share, proto, &sh);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm (void) _sharefs(SHAREFS_ADD, &sh);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm /*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * We need the timestamp of the sharetab file right
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * after the update was done. This lets us detect a
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * change that made by a different process.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_update_sharetab_ts(handle);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_emptyshare(&sh);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm } else {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm ret = SA_CONFIG_ERR;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm }
a237e38e9161f0acd6451439d4a7dd597e66291dth sa_free_attr_string(path);
6185db853e024a486ff8837e6784dd290d866112dougm }
a237e38e9161f0acd6451439d4a7dd597e66291dth
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * sa_delete_sharetab(handle, path, proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * remove the specified share from sharetab.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmsa_delete_sharetab(sa_handle_t handle, char *path, char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
a237e38e9161f0acd6451439d4a7dd597e66291dth int ret = SA_OK;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm struct stat st;
6185db853e024a486ff8837e6784dd290d866112dougm
a237e38e9161f0acd6451439d4a7dd597e66291dth share_t sh;
a237e38e9161f0acd6451439d4a7dd597e66291dth /*
a237e38e9161f0acd6451439d4a7dd597e66291dth * Both the path and the proto are
a237e38e9161f0acd6451439d4a7dd597e66291dth * keys into the sharetab.
a237e38e9161f0acd6451439d4a7dd597e66291dth */
a237e38e9161f0acd6451439d4a7dd597e66291dth if (path != NULL && proto != NULL) {
a237e38e9161f0acd6451439d4a7dd597e66291dth (void) memset(&sh, '\0', sizeof (sh));
a237e38e9161f0acd6451439d4a7dd597e66291dth sh.sh_path = path;
a237e38e9161f0acd6451439d4a7dd597e66291dth sh.sh_fstype = proto;
a237e38e9161f0acd6451439d4a7dd597e66291dth
a3175730a459223fb8f26a2915aa0a31f6b36f98th ret = _sharefs(SHAREFS_REMOVE, &sh);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (handle != NULL && stat(SA_LEGACY_SHARETAB, &st) == 0)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_update_sharetab_ts(handle);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm/*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * sa_needs_refresh(handle)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm *
09c9e6dc9b69d10b771bb87e01040ec320a0bfd3Chris Williamson * Returns B_TRUE if the internal cache needs to be refreshed due to a
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * change by another process. B_FALSE returned otherwise.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmboolean_t
b83b3cacf4b470a7fd949dbb89d44d56d23c8a8fdougmsa_needs_refresh(sa_handle_t handle)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm{
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_handle_impl_t implhandle = (sa_handle_impl_t)handle;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm struct stat st;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm char *str;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm uint64_t tstamp;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scf_simple_prop_t *prop;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (handle == NULL)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return (B_TRUE);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm /*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * If sharetab has changed, then there was an external
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * change. Check sharetab first since it is updated by ZFS as
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * well as sharemgr. This is where external ZFS changes are
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * caught.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (stat(SA_LEGACY_SHARETAB, &st) == 0 &&
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm TSTAMP(st.st_mtim) != implhandle->tssharetab)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return (B_TRUE);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm /*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * If sharetab wasn't changed, check whether there were any
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * SMF transactions that modified the config but didn't
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * initiate a share. This is less common but does happen.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm prop = scf_simple_prop_get(implhandle->scfhandle->handle,
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm (const char *)SA_SVC_FMRI_BASE ":default", "state",
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm "lastupdate");
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (prop != NULL) {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm str = scf_simple_prop_next_astring(prop);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (str != NULL)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm tstamp = strtoull(str, NULL, 0);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm else
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm tstamp = 0;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scf_simple_prop_free(prop);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (tstamp != implhandle->tstrans)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return (B_TRUE);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm }
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return (B_FALSE);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm}
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sa_fix_resource_name(path)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * Convert invalid characters in a resource name (SMB share name)
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * to underscores ('_'). The list of invalid characters includes
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * control characters and the following:
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego *
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * " / \ [ ] : | < > + ; , ? * =
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego *
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * The caller must pass a valid path. Leading and trailing slashes
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * are stripped from the path before converting invalid characters.
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * Resource names are restricted to SA_MAX_RESOURCE_NAME characters.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsa_fix_resource_name(char *path)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego char *invalid = "\"/\\[]:|<>+;,?*=";
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego char *p = path;
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego char *q;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size_t len;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw assert(path != NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego /*
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * Strip leading and trailing /'s.
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego */
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego p += strspn(p, "/");
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego q = strchr(p, '\0');
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego if (q != NULL && q != path) {
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego while ((--q, *q == '/'))
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego *q = '\0';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego if (*p == '\0') {
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego (void) strcpy(path, "_");
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego return;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * Stride over path components until the remaining
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * path is no longer than SA_MAX_RESOURCE_NAME.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego q = p;
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego while ((q != NULL) && (strlen(q) > SA_MAX_RESOURCE_NAME)) {
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego if ((q = strchr(q, '/')) != NULL) {
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego ++q;
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego p = q;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego }
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego /*
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * If the path is still longer than SA_MAX_RESOURCE_NAME,
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego * take the trailing SA_MAX_RESOURCE_NAME characters.
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego */
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego if ((len = strlen(p)) > SA_MAX_RESOURCE_NAME) {
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego len = SA_MAX_RESOURCE_NAME;
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego p = strchr(p, '\0') - (SA_MAX_RESOURCE_NAME - 1);
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego }
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego (void) memmove(path, p, len);
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego path[len] = '\0';
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego for (p = path; *p != '\0'; ++p) {
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego if ((iscntrl(*p)) || strchr(invalid, *p))
89dc44ce9705974a8bc4a39f1e878a0491a5be61jose borrego *p = '_';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}