2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Use is subject to license terms.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <string.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <strings.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <cstack.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ctype.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <tlm.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "tlm_proto.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Implementation of a list based stack class. The stack only holds
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * pointers/references to application objects. The objects are not
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * copied and the stack never attempts to dereference or access the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data objects. Applications should treat cstack_t references as
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * opaque handles.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_new
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Allocate and initialize a new stack, which is just an empty cstack_t.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A pointer to the new stack is returned. This should be treated as an
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * opaque handle by the caller.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcstack_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcstack_new(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cstack_t *stk;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((stk = ndmp_malloc(sizeof (cstack_t))) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (stk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_delete
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Deallocate the stack. This goes through the list freeing all of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack nodes but not the data because we don't know how the data was
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * allocated. A stack really should be empty before it is deleted.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcstack_delete(cstack_t *stk)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cstack_t *tmp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stk == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_delete: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while ((tmp = stk->next) != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar stk->next = tmp->next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_delete(element): 0x%p", tmp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(tmp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_delete: 0x%p", stk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(stk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_push
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Push an element onto the stack. Allocate a new node and assign the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data and len values. We don't care what about the real values of
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data or len and we never try to access them. The stack head will
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * point to the new node.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns 0 on success. Otherwise returns -1 to indicate overflow.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcstack_push(cstack_t *stk, void *data, int len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cstack_t *stk_node;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stk == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_push: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((stk_node = ndmp_malloc(sizeof (cstack_t))) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar stk_node->data = data;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar stk_node->len = len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar stk_node->next = stk->next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar stk->next = stk_node;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_push(0x%p): 0x%p", stk, stk_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_pop
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Pop an element off the stack. Set up the data and len references for
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the caller, advance the stack head and free the popped stack node.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns 0 on success. Otherwise returns -1 to indicate underflow.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcstack_pop(cstack_t *stk, void **data, int *len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cstack_t *stk_node;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stk == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((stk_node = stk->next) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop: underflow");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (data)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *data = stk_node->data;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *len = stk_node->len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar stk->next = stk_node->next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop(0x%p): 0x%p", stk, stk_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(stk_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_top
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the top data element on the stack without removing it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns 0 on success. Otherwise returns -1 to indicate underflow.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcstack_top(cstack_t *stk, void **data, int *len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stk == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stk->next == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop: underflow");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (data)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *data = stk->next->data;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *len = stk->next->len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * match
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Matching rules:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * c Any non-special character matches itslef
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ? Match any character
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ab character 'a' followed by character 'b'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * S Any string of non-special characters
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AB String 'A' followed by string 'B'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * * Any String, including the empty string
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmatch(char *patn, char *str)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (; ; ) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (*patn) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 0:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (*str == 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case '?':
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*str != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar str++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar patn++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case '*':
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar patn++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*patn == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*str) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (match(patn, str))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar str++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*str != *patn)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar str++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar patn++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Match recursive call
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmatch_ci(char *patn, char *str)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * "<" is a special pattern that matches only those names
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * that do NOT have an extension. "." and ".." are ok.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(patn, "<") == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((strcmp(str, ".") == 0) || (strcmp(str, "..") == 0))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strchr(str, '.') == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (; ; ) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (*patn) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 0:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (*str == 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case '?':
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*str != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar str++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar patn++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case '*':
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar patn++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*patn == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*str) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (match_ci(patn, str))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar str++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*str != *patn) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int c1 = *str;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int c2 = *patn;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar c1 = tolower(c1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar c2 = tolower(c2);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (c1 != c2)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar str++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar patn++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* NOT REACHED */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Linear matching against a list utility function
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic boolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarparse_match(char line, char *seps)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *sep = seps;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*sep != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* compare this char with the seperator list */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*sep == line)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sep++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the next entry of the list after
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * each separator
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarparse(char **line, char *seps)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *start = *line;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (**line != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *line = *line + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (parse_match(**line, seps)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* hit a terminator, skip trailing terminators */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (parse_match(**line, seps)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar **line = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *line = *line + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (start);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * oct_atoi
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert an octal string to integer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdaroct_atoi(char *p)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int v = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int c;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p == ' ')
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while ('0' <= (c = *p++) && c <= '7') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar v <<= 3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar v += c - '0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (v);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * strupr
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert a string to uppercase using the appropriate codepage. The
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * string is converted in place. A pointer to the string is returned.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * There is an assumption here that uppercase and lowercase values
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * always result encode to the same length.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstrupr(char *s)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char c;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned char *p = (unsigned char *)s;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar c = toupper(*p);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p++ = c;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (s);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * trim_whitespace
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Trim leading and trailing whitespace chars(as defined by isspace)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * from a buffer. Example; if the input buffer contained " text ",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * it will contain "text", when we return. We assume that the buffer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * contains a null terminated string. A pointer to the buffer is
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * returned.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartrim_whitespace(char *buf)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *p = buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *q = buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (buf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p && isspace(*p))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ++p;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while ((*q = *p++) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ++q;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (q != buf) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while ((--q, isspace(*q)) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *q = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * trim_name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Trims the slash and dot slash from the beginning of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartrim_name(char *nm)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*nm) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*nm == '/') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nm++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*nm == '.' && nm[1] == '/' && nm[2]) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nm += 2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (nm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get_volname
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Extract the volume name from the path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarget_volname(char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *cp, *save;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int sp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(save = strdup(path)))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp = strspn(path, "/");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*(path + sp) == '\0') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(save);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((cp = strchr(save + sp, '/')))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *cp = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (save);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fs_volexist
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Check if the volume exists
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarfs_volexist(char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *p;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((p = get_volname(path)) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stat64(p, &st) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(p);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(p);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * tlm_tarhdr_size
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the size of the TLM_TAR_HDR structure.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_tarhdr_size(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (sizeof (tlm_tar_hdr_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dup_dir_info
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Make and return a copy of the directory info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct full_dir_info *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardup_dir_info(struct full_dir_info *old_dir_info)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct full_dir_info *new_dir_info;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_dir_info = ndmp_malloc(sizeof (struct full_dir_info));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (new_dir_info) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar bcopy(old_dir_info, new_dir_info,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (struct full_dir_info));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (new_dir_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * tlm_new_dir_info
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create a new structure, set fh field to what is specified and the path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to the concatenation of directory and the component
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct full_dir_info *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_new_dir_info(struct fs_fhandle *fhp, char *dir, char *nm)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct full_dir_info *fdip;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(fdip = ndmp_malloc(sizeof (struct full_dir_info))))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memcpy(&fdip->fd_dir_fh, fhp, sizeof (fs_fhandle_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!tlm_cat_path(fdip->fd_dir_name, dir, nm)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(fdip);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "TAPE BACKUP Find> path too long [%s][%s]",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir, nm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (fdip);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar/*
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * sysattr_rdonly
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar *
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * Check if the attribute file is one of the readonly system
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * attributes.
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar */
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdarint
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdarsysattr_rdonly(char *name)
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar{
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar return (name && strcmp(name, SYSATTR_RDONLY) == 0);
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar}
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar/*
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * sysattr_rw
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar *
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * Check if the attribute file is one of the read/write system
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * attributes.
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar */
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdarint
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdarsysattr_rw(char *name)
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar{
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar return (name && strcmp(name, SYSATTR_RW) == 0);
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar}