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 * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
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 * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
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 * - 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 * 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 * 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 * cstack_new
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 if ((stk = ndmp_malloc(sizeof (cstack_t))) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_delete
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 NDMP_LOG(LOG_DEBUG, "cstack_delete: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_delete(element): 0x%p", tmp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_delete: 0x%p", stk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_push
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 * Returns 0 on success. Otherwise returns -1 to indicate overflow.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_push: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((stk_node = ndmp_malloc(sizeof (cstack_t))) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_push(0x%p): 0x%p", stk, stk_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_pop
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 * Returns 0 on success. Otherwise returns -1 to indicate underflow.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop(0x%p): 0x%p", stk, stk_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cstack_top
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the top data element on the stack without removing it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns 0 on success. Otherwise returns -1 to indicate underflow.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cstack_pop: invalid stack");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
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 for (; ; ) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (*str == 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*str != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Match recursive call
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * "<" is a special pattern that matches only those names
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * that do NOT have an extension. "." and ".." are ok.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((strcmp(str, ".") == 0) || (strcmp(str, "..") == 0))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (; ; ) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (*str == 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*str != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* NOT REACHED */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Linear matching against a list utility function
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*sep != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* compare this char with the seperator list */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the next entry of the list after
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * each separator
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (**line != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* hit a terminator, skip trailing terminators */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert an octal string to integer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p == ' ')
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar v += c - '0';
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 unsigned char *p = (unsigned char *)s;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * trim_whitespace
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 while (*p && isspace(*p))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while ((*q = *p++) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while ((--q, isspace(*q)) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Trims the slash and dot slash from the beginning of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get_volname
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Extract the volume name from the path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fs_volexist
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Check if the volume exists
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * tlm_tarhdr_size
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the size of the TLM_TAR_HDR structure.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (sizeof (tlm_tar_hdr_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dup_dir_info
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Make and return a copy of the directory info.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_dir_info = ndmp_malloc(sizeof (struct full_dir_info));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (struct full_dir_info));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * tlm_new_dir_info
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 Sabdartlm_new_dir_info(struct fs_fhandle *fhp, char *dir, char *nm)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!(fdip = ndmp_malloc(sizeof (struct full_dir_info))))
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 NDMP_LOG(LOG_DEBUG, "TAPE BACKUP Find> path too long [%s][%s]",
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * sysattr_rdonly
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * Check if the attribute file is one of the readonly system
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * attributes.
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar return (name && strcmp(name, SYSATTR_RDONLY) == 0);
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * sysattr_rw
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * Check if the attribute file is one of the read/write system
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar * attributes.