2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * Copyright (c) 2007, 2010, Oracle and/or its affiliates. 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/* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 2007, The Storage Networking Industry Association. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * File history callback functions called by backup modules. NDMP file history
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * supports 2 file history models: path based and inode/directory based.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Backup/recover modules similar to unix dump/restore utilize the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * inode/directory based model. During the filesystem scan pass,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_dir() is called. During the file backup pass,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_node() is called. This model is appropriate for
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modules whose code is structured such that file name and file attribute
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data is not available at the same time. Backup/recover modules similar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to tar or cpio utilize the path based model. The simple dump/restore module
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * included with the SDK uses the path based model.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/stat.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <dirent.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <string.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <dirent.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <bitmap.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define N_PATH_ENTRIES 1000
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define N_FILE_ENTRIES N_PATH_ENTRIES
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define N_DIR_ENTRIES 1000
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define N_NODE_ENTRIES 1000
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Figure an average of 32 bytes per path name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define PATH_NAMEBUF_SIZE (N_PATH_ENTRIES * 32)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Figure an average of 16 bytes per file name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define DIR_NAMEBUF_SIZE (N_PATH_ENTRIES * 16)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic boolean_t fh_requested(void *cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmpd_file_history_cleanup_v2(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar boolean_t send_flag);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmpd_file_history_cleanup_v3(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar boolean_t send_flag);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmpd_module_params_t *get_params(void *cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Each file history as a separate message to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_syncfh = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V2 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_api_file_history_path_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file history path entry to the buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * History data is buffered until the buffer is filled.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Full buffers are then sent to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * name (input) - file name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NULL forces buffered data to be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file_stat (input) - file status pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fh_info (input) - data stream position of file data used during
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fast restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_api_file_history_path_v2(void *cookie, char *name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *file_stat, u_longlong_t fh_info)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_unix_path *entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL && session->ns_fh.fh_path_index == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the buffer does not have space
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for the current entry, send the buffered data to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A NULL name indicates that any buffered data should be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (ndmp_syncfh && session->ns_fh.fh_path_index != 0) ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_index == N_PATH_ENTRIES ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf_index + strlen(name) + 1 >
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar PATH_NAMEBUF_SIZE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_add_unix_path_request request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending %ld entries", session->ns_fh.fh_path_index);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.paths.paths_val = session->ns_fh.fh_path_entries;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.paths.paths_len = session->ns_fh.fh_path_index;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FH_ADD_UNIX_PATH, NDMP_NO_ERR, (void *) &request,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Sending file history data");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_path_entries == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_entries = ndmp_malloc(N_PATH_ENTRIES *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (ndmp_fh_unix_path));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_path_entries == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_path_name_buf == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(PATH_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_path_name_buf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry = &session->ns_fh.fh_path_entries[session->ns_fh.fh_path_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_get_file_entry_type(file_stat->st_mode, &entry->fstat.ftype);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->name = &session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh.fh_path_name_buf[session->ns_fh.fh_path_name_buf_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(entry->name, name, PATH_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf_index += strlen(name) + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.mtime = (ulong_t)file_stat->st_mtime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.atime = (ulong_t)file_stat->st_atime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.ctime = (ulong_t)file_stat->st_ctime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.uid = file_stat->st_uid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.gid = file_stat->st_gid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.mode = (file_stat->st_mode) & 0x0fff;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.size = long_long_to_quad((u_longlong_t)file_stat->st_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.fh_info = long_long_to_quad((u_longlong_t)fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_index++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_api_file_history_dir_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file history dir entry to the buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * History data is buffered until the buffer is filled.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Full buffers are then sent to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * name (input) - file name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NULL forces buffered data to be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * node (input) - file inode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * parent (input) - file parent inode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Should equal node if the file is the root of
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the filesystem and has no parent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_api_file_history_dir_v2(void *cookie, char *name, ulong_t node,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t parent)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_unix_dir *entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL && session->ns_fh.fh_dir_index == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the buffer does not have space for the current entry,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * send the buffered data to the client. A NULL name indicates
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * that any buffered data should be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (ndmp_syncfh && session->ns_fh.fh_dir_index != 0) ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_index == N_DIR_ENTRIES ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf_index + strlen(name) + 1 >
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar DIR_NAMEBUF_SIZE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_add_unix_dir_request request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending %ld entries", session->ns_fh.fh_dir_index);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.dirs.dirs_val = session->ns_fh.fh_dir_entries;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.dirs.dirs_len = session->ns_fh.fh_dir_index;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FH_ADD_UNIX_DIR, NDMP_NO_ERR, (void *) &request,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Sending file history data");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_dir_entries == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_entries = ndmp_malloc(N_DIR_ENTRIES
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sizeof (ndmp_fh_unix_dir));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_dir_entries == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_dir_name_buf == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf = ndmp_malloc(DIR_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_dir_name_buf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry = &session->ns_fh.fh_dir_entries[session->ns_fh.fh_dir_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->name = &session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh.fh_dir_name_buf[session->ns_fh.fh_dir_name_buf_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(&session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh.fh_dir_name_buf[session->ns_fh.fh_dir_name_buf_index],
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar name, PATH_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf_index += strlen(name) + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->node = node;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->parent = parent;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_index++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_api_file_history_node_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file history node entry to the buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * History data is buffered until the buffer is filled.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Full buffers are then sent to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * node (input) - file inode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * must match a node from a prior ndmpd_api_file_history_dir()
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * call.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file_stat (input) - file status pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 forces buffered data to be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fh_info (input) - data stream position of file data used during
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fast restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_api_file_history_node_v2(void *cookie, ulong_t node,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *file_stat, u_longlong_t fh_info)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_unix_node *entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (file_stat == NULL && session->ns_fh.fh_node_index == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the buffer does not have space
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for the current entry, send the buffered data to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A 0 file_stat pointer indicates that any buffered data should
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (file_stat == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (ndmp_syncfh && session->ns_fh.fh_node_index != 0) ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_index == N_NODE_ENTRIES) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_add_unix_node_request request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending %ld entries", session->ns_fh.fh_node_index);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.nodes.nodes_val = session->ns_fh.fh_node_entries;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.nodes.nodes_len = session->ns_fh.fh_node_index;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Need to send Dir entry as well. Since Dir entry is more than
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Node entry, we may send a Node entry that hasn't have
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * its dir entry sent. Therefore, we need to flush Dir entry
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as well everytime the Dir entry is send.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_dir_v2(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FH_ADD_UNIX_NODE, NDMP_NO_ERR, (void *) &request,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Sending file history data");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (file_stat == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_node_entries == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_entries = ndmp_malloc(N_NODE_ENTRIES
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sizeof (ndmp_fh_unix_node));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_node_entries == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry = &session->ns_fh.fh_node_entries[session->ns_fh.fh_node_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_get_file_entry_type(file_stat->st_mode, &entry->fstat.ftype);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->node = node;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.mtime = (ulong_t)file_stat->st_mtime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.atime = (ulong_t)file_stat->st_atime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.ctime = (ulong_t)file_stat->st_ctime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.uid = file_stat->st_uid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.gid = file_stat->st_gid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.mode = (file_stat->st_mode) & 0x0fff;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.size = long_long_to_quad((u_longlong_t)file_stat->st_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entry->fstat.fh_info = long_long_to_quad(fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_index++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V3 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_api_file_history_file_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file history file entry to the buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * History data is buffered until the buffer is filled.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Full buffers are then sent to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * name (input) - file name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NULL forces buffered data to be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file_stat (input) - file status pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fh_info (input) - data stream position of file data used during
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fast restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_api_file_history_file_v3(void *cookie, char *name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *file_stat, u_longlong_t fh_info)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_file_v3 *file_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_file_name_v3 *file_name_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_file_stat_v3 *file_stat_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_add_file_request_v3 request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL && session->ns_fh_v3.fh_file_index == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the buffer does not have space
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for the current entry, send the buffered data to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A NULL name indicates that any buffered data should be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_index == N_FILE_ENTRIES ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf_index + strlen(name) + 1 >
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar PATH_NAMEBUF_SIZE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "sending %ld entries",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_index);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.files.files_len = session->ns_fh_v3.fh_file_index;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.files.files_val = session->ns_fh_v3.fh_files;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FH_ADD_FILE, NDMP_NO_ERR, (void *) &request, 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Sending ndmp_fh_add_file request");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_files == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_files = ndmp_malloc(sizeof (ndmp_file_v3) *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar N_FILE_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_files == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_names == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_names =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_file_name_v3) * N_FILE_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_names == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_name_buf == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (char) * PATH_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_name_buf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_stats == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_stats =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_file_stat_v3) * N_FILE_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_stats == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_files[session->ns_fh_v3.fh_file_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_name_entry =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_file_names[session->ns_fh_v3.fh_file_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_file_stats[session->ns_fh_v3.fh_file_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry->names.names_len = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry->names.names_val = file_name_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry->stats.stats_len = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry->stats.stats_val = file_stat_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry->node = long_long_to_quad(file_stat->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_entry->fh_info = long_long_to_quad(fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_name_entry->fs_type = NDMP_FS_UNIX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_name_entry->ndmp_file_name_v3_u.unix_name =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_file_name_buf[session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh_v3.fh_file_name_buf_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(&session->ns_fh_v3.fh_file_name_buf[session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh_v3.fh_file_name_buf_index], name, PATH_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf_index += strlen(name) + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_get_file_entry_type(file_stat->st_mode, &file_stat_entry->ftype);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->invalid = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->fs_type = NDMP_FS_UNIX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->mtime = file_stat->st_mtime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->atime = file_stat->st_atime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->ctime = file_stat->st_ctime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->owner = file_stat->st_uid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->group = file_stat->st_gid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->fattr = file_stat->st_mode & 0x0fff;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->size =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad((u_longlong_t)file_stat->st_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->links = file_stat->st_nlink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_index++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_api_file_history_dir_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file history dir entry to the buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * History data is buffered until the buffer is filled.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Full buffers are then sent to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * name (input) - file name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NULL forces buffered data to be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * node (input) - file inode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * parent (input) - file parent inode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Should equal node if the file is the root of
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the filesystem and has no parent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_api_file_history_dir_v3(void *cookie, char *name, ulong_t node,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t parent)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dir_v3 *dir_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_file_name_v3 *dir_name_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_add_dir_request_v3 request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL && session->ns_fh_v3.fh_dir_index == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the buffer does not have space
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for the current entry, send the buffered data to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A NULL name indicates that any buffered data should be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_index == N_DIR_ENTRIES ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf_index + strlen(name) + 1 >
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar DIR_NAMEBUF_SIZE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "sending %ld entries",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_index);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.dirs.dirs_val = session->ns_fh_v3.fh_dirs;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.dirs.dirs_len = session->ns_fh_v3.fh_dir_index;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FH_ADD_DIR, NDMP_NO_ERR, (void *) &request, 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Sending ndmp_fh_add_dir request");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dirs == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dirs =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_dir_v3) * N_DIR_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dirs == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dir_names == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_names =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_file_name_v3) * N_DIR_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dir_names == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dir_name_buf == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (char) * DIR_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dir_name_buf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_entry = &session->ns_fh_v3.fh_dirs[session->ns_fh_v3.fh_dir_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_name_entry =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_dir_names[session->ns_fh_v3.fh_dir_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_name_entry->fs_type = NDMP_FS_UNIX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_name_entry->ndmp_file_name_v3_u.unix_name =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_dir_name_buf[session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh_v3.fh_dir_name_buf_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(&session->ns_fh_v3.fh_dir_name_buf[session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_fh_v3.fh_dir_name_buf_index], name, PATH_NAMEBUF_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf_index += strlen(name) + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_entry->names.names_len = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_entry->names.names_val = dir_name_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_entry->node = long_long_to_quad(node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir_entry->parent = long_long_to_quad(parent);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_index++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_api_file_history_node_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file history node entry to the buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * History data is buffered until the buffer is filled.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Full buffers are then sent to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * node (input) - file inode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * must match a node from a prior ndmpd_api_file_history_dir()
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * call.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file_stat (input) - file status pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 forces buffered data to be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fh_info (input) - data stream position of file data used during
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fast restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_api_file_history_node_v3(void *cookie, ulong_t node,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *file_stat, u_longlong_t fh_info)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_node_v3 *node_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_file_stat_v3 *file_stat_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fh_add_node_request_v3 request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (file_stat == NULL && session->ns_fh_v3.fh_node_index == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the buffer does not have space
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for the current entry, send the buffered data to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A 0 file_stat pointer indicates that any buffered data should
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * be sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (file_stat == NULL ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_index == N_NODE_ENTRIES) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "sending %ld entries",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_index);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Need to send Dir entry as well. Since Dir entry is more
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * than a Node entry, we may send a Node entry that hasn't
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * had its Dir entry sent. Therefore, we need to flush Dir
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * entry as well every time the Dir entry is sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_dir_v3(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.nodes.nodes_len = session->ns_fh_v3.fh_node_index;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.nodes.nodes_val = session->ns_fh_v3.fh_nodes;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FH_ADD_NODE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_NO_ERR, (void *) &request, 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Sending ndmp_fh_add_node request");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (file_stat == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_nodes == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_nodes =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_node_v3) * N_NODE_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_nodes == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_node_stats == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_stats =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_file_stat_v3) * N_NODE_ENTRIES);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_node_stats == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar node_entry =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_nodes[session->ns_fh_v3.fh_node_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_fh_v3.fh_node_stats[session->ns_fh_v3.fh_node_index];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_get_file_entry_type(file_stat->st_mode, &file_stat_entry->ftype);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->invalid = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->fs_type = NDMP_FS_UNIX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->mtime = file_stat->st_mtime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->atime = file_stat->st_atime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->ctime = file_stat->st_ctime;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->owner = file_stat->st_uid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->group = file_stat->st_gid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->fattr = file_stat->st_mode & 0x0fff;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->size =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad((u_longlong_t)file_stat->st_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar file_stat_entry->links = file_stat->st_nlink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar node_entry->stats.stats_len = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar node_entry->stats.stats_val = file_stat_entry;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar node_entry->node = long_long_to_quad((u_longlong_t)node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar node_entry->fh_info = long_long_to_quad(fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_index++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V4 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_fhpath_v3_cb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Callback function for file history path information
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t *cbp, char *path, struct stat64 *stp,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t off)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!cbp->fh_cookie) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cookie is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "path is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "pname(%s)", path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_ISSET(nlp, NLPF_FH)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!NLP_ISSET(nlp, NLPF_DIRECT)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "DAR NOT SET!");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar off = 0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = get_params(cbp->fh_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params || !params->mp_file_history_path_func) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang char *p =
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_get_relative_path(get_backup_path_v3(params),
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((err = ndmpd_api_file_history_file_v3(cbp->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fh_cookie, p, stp, off)) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s\" %d", path, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_fhdir_v3_cb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Callback function for file history dir information
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t *cbp, char *dir, struct stat64 *stp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char nm[PATH_MAX+1];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nml;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t ino, pino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t pos;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar DIR *dirp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char dirpath[PATH_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!cbp->fh_cookie) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cookie is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!dir) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dir is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "d(%s)", dir);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!NLP_ISSET(nlp, NLPF_FH))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Veritas net_backup accepts only 2 as the inode number of the backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * root directory. The other way compares the path against the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backup path which is slower.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stp->st_ino == nlp->nlp_bkdirino)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pino = stp->st_ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * There is nothing below this directory to be backed up.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If there was, the bit for this directory would have
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * been set. Backup root directory is exception. We
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * always send the dir file history records of it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pino != ROOT_INODE &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar !dbm_getone(nlp->nlp_bkmap, (u_longlong_t)stp->st_ino)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nothing below here");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params || !params->mp_file_history_dir_func)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pos = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dirp = opendir(dir);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dirp == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nml = PATH_MAX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = dp_readdir(dirp, &pos, nm, &nml, &ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "%d reading pos %u dir \"%s\"", err, pos, dir);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nml == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nm[nml] = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pino == ROOT_INODE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rootfs_dot_or_dotdot(nm))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (ino == nlp->nlp_bkdirino && IS_DOTDOT(nm)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nm(%s): %lu", nm, ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!dbm_getone(nlp->nlp_bkmap, (u_longlong_t)ino))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the entry is on exclusion list dont send the info
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (tlm_is_excluded(dir, nm, ndmp_excl_list)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "name \"%s\" skipped", nm == 0 ? "nil" : nm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = (*params->mp_file_history_dir_func)(cbp->fh_cookie, nm,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino, pino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s\": %d", dir, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is a requirement by some DMA's (net_vault) that during
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the incremental backup, the node info should also be sent
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * along with the dir info for all directories leading to a
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backed up file.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_fhinode) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 ret_attr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(dirpath, dir, PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcat(dirpath, "/", PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcat(dirpath, nm, PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = stat64(dirpath, &ret_attr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Error looking up %s", nm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (S_ISDIR(ret_attr.st_mode)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = (*params->mp_file_history_node_func)(cbp->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fh_cookie, ino, &ret_attr, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/\": %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (err == 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) closedir(dirp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_fhnode_v3_cb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Callback function for file history node information
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t *cbp, char *dir, char *file,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *stp, u_longlong_t off)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!cbp->fh_cookie) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cookie is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!dir) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dir is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!file) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "file is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!stp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "stp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "d(%s), f(%s)", dir, file);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_ISSET(nlp, NLPF_FH)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!NLP_ISSET(nlp, NLPF_DIRECT))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar off = 0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stp->st_ino == nlp->nlp_bkdirino) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "bkroot %d -> %d", stp->st_ino, ROOT_INODE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = stp->st_ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params || !params->mp_file_history_node_func)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if ((err = (*params->mp_file_history_node_func)(cbp->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fh_cookie, ino, stp, off)) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/%s\" %d", dir, file, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_send_recovery_stat_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send the recovery status to the DMA
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_send_recovery_stat_v3(ndmpd_module_params_t *params,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp, int idx, int stat)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mem_ndmp_name_v3_t *ep;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "params == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!params->mp_file_recovered_func) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "paramsfile_recovered_func == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!nlp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (idx < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "idx(%d) < 0", idx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!(ep = (mem_ndmp_name_v3_t *)MOD_GETNAME(params, idx))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlist[%d] == NULL", idx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!ep->nm3_opath) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlist[%d].nm3_opath == NULL", idx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ep[%d].nm3_opath \"%s\"", idx, ep->nm3_opath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = MOD_FILERECOVERD(params, ep->nm3_opath, stat);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_path_restored_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send the recovery status and the information for the restored
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_path_restored_v3(lbr_fhlog_call_backs_t *cbp, char *name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *st, u_longlong_t ll_idx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int idx = (int)ll_idx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!name) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "name is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "name: \"%s\", idx: %d", name, idx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(cbp->fh_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!nlp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (idx < 0 || idx >= nlp->nlp_nfiles) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid idx: %d", idx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params || !params->mp_file_recovered_func)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_lastidx == -1)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_lastidx = idx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) bm_setone(nlp->nlp_rsbm, (u_longlong_t)idx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Note: We should set the nm3_err here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_lastidx != idx) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = ndmp_send_recovery_stat_v3(params, nlp, nlp->nlp_lastidx,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_lastidx = idx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_init
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Initialize file history variables.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Note that the entry and name buffers are not allocated here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Since it is not know if the backup module will be sending file history
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data or what kind of data (path or dir/node), the entry and name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buffers are not allocated until the first call to one of the file history
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * entry functions is made. This way resources are only allocated as
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * needed.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_init(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_entries = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_entries = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_entries = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * V3.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_files = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dirs = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_nodes = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_names = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_names = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_stats = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_stats = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_cleanup_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send (or discard) any buffered file history entries.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * send_flag (input) - if TRUE buffered entries are sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * if FALSE buffered entries are discarded.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_cleanup_v2(ndmpd_session_t *session, boolean_t send_flag)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (send_flag == TRUE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_path_v2(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_dir_v2(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_node_v2(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_path_entries != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh.fh_path_entries);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_entries = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_dir_entries != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh.fh_dir_entries);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_entries = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_node_entries != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh.fh_node_entries);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_entries = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_path_name_buf != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh.fh_path_name_buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh.fh_dir_name_buf != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh.fh_dir_name_buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_node_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_path_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh.fh_dir_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_cleanup_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send (or discard) any buffered file history entries.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * send_flag (input) - if TRUE buffered entries are sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * if FALSE buffered entries are discarded.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_cleanup_v3(ndmpd_session_t *session, boolean_t send_flag)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (send_flag == TRUE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_file_v3(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_dir_v3(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_api_file_history_node_v3(session, 0, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_files != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_files);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_files = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dirs != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_dirs);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dirs = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_nodes != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_nodes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_nodes = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_names != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_file_names);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_names = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dir_names != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_dir_names);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_names = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_stats != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_file_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_stats = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_node_stats != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_node_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_stats = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_file_name_buf != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_file_name_buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_fh_v3.fh_dir_name_buf != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_fh_v3.fh_dir_name_buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_node_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_file_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_fh_v3.fh_dir_name_buf_index = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_cleanup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send any pending posts and clean up
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_cleanup(ndmpd_session_t *session, boolean_t send_flag)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_protocol_version) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 1:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 2:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_cleanup_v2(session, send_flag);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 3:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 4:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_cleanup_v3(session, send_flag);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unknown version %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get_params
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Callbacks from LBR.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmpd_module_params_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarget_params(void *cookie)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(cookie)) == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fh_requested
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Check in LB parameters if file history is requested
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic boolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarfh_requested(void *cookie)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(cookie)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_fh %c", NDMP_YORN(NLP_ISSET(nlp, NLPF_FH)));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NLP_ISSET(nlp, NLPF_FH));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Generates file history path information posts
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Note:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Action must be determined when the 'dir' and/or 'file'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * arguments of ndmpd_file_history_path(), ndmpd_file_history_dir(), and
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_node() are NULL.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_path(lbr_fhlog_call_backs_t *cbp, char *path,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *stp, u_longlong_t off)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!cbp->fh_cookie) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cookie is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "path is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!stp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "stp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "path: \"%s\"", path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fh_requested(cbp->fh_cookie)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = get_params(cbp->fh_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (params == NULL || params->mp_file_history_path_func == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if ((err = (*params->mp_file_history_path_func)(cbp->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fh_cookie, path, stp, 0)) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s\": %d", path, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_dir
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Generate file history directory information posts
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_dir(lbr_fhlog_call_backs_t *cbp, char *dir,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *stp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char nm[PATH_MAX+1];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nml;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t ino, pino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t pos;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar DIR *dirp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char dirpath[PATH_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!cbp->fh_cookie) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cookie is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!dir) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dir is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!stp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "stp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dir: \"%s\"", dir);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!fh_requested(cbp->fh_cookie))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Veritas net_backup accepts only 2 as the inode number of the backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * root directory. The other way compares the path against the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backup path which is slower.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stp->st_ino == nlp->nlp_bkdirino)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pino = stp->st_ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * There is nothing below this directory to be backed up.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If there was, the bit for this directory would have
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * been set. Backup root directory is exception. We
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * always send the dir file history records of it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pino != ROOT_INODE &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar !dbm_getone(nlp->nlp_bkmap, (u_longlong_t)stp->st_ino)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nothing below here");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = get_params(cbp->fh_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (params == NULL || params->mp_file_history_dir_func == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pos = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dirp = opendir(dir);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dirp == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nml = PATH_MAX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = dp_readdir(dirp, &pos, nm, &nml, &ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "%d reading pos %u dir \"%s\"", err, pos, dir);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nml == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nm[nml] = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pino == ROOT_INODE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rootfs_dot_or_dotdot(nm))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (ino == nlp->nlp_bkdirino && IS_DOTDOT(nm)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nm(%s): %lu", nm, ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!dbm_getone(nlp->nlp_bkmap, (u_longlong_t)ino))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = (*params->mp_file_history_dir_func)(cbp->fh_cookie, nm,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino, pino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/%s\": %d", dir, nm, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is a requirement by some DMA's (net_vault) that during
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the incremental backup, the node info should also be sent
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * along with the dir info for all directories leading to a
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backed up file.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_fhinode) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 ret_attr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(dirpath, dir, PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcat(dirpath, "/", PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcat(dirpath, nm, PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = stat64(dirpath, &ret_attr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Error looking up %s", nm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (S_ISDIR(ret_attr.st_mode)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = (*params->mp_file_history_node_func)(cbp->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fh_cookie, ino, &ret_attr, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/\": %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (err == 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) closedir(dirp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_file_history_node
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Generate file history node information posts
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_file_history_node(lbr_fhlog_call_backs_t *cbp, char *dir, char *file,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *stp, u_longlong_t off)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!cbp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!cbp->fh_cookie) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cookie is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!dir) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dir is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!file) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "file is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!stp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "stp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "d(%s), f(%s)", dir, file);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fh_requested(cbp->fh_cookie) == TRUE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stp->st_ino == nlp->nlp_bkdirino) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = ROOT_INODE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "bkroot %d -> %d", stp->st_ino, ROOT_INODE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ino = stp->st_ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = get_params(cbp->fh_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (params == NULL || params->mp_file_history_node_func == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if ((err = (*params->mp_file_history_node_func)(cbp->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fh_cookie, ino, stp, 0)) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/\": %d", dir, file, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_path_restored
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Mark the specified path as a restored path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_path_restored(lbr_fhlog_call_backs_t *cbp, char *name, struct stat64 *stp,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t ll_pos)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_name *entp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int pos = (int)ll_pos;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cbp == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cbp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (name == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "name is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "name: \"%s\", pos: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar name, pos);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(cbp->fh_cookie)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp is NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pos < 0 || pos >= nlp->nlp_nfiles) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid pos: %d", pos);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = get_params(cbp->fh_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (params == NULL || params->mp_file_recovered_func == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!nlp->nlp_restored[pos]) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar entp = (ndmp_name *)MOD_GETNAME(params, pos);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (entp && entp->name)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar name = entp->name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((rv = MOD_FILERECOVERD(params, name, 0)) >= 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_restored[pos] = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dp_readdir
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Reads the entry of the directory and provides other information
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * such as i-number, name, length and saves the dir entry position
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * in a cookie for future calls.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardp_readdir(DIR *dirp, unsigned long *cookiep, char *name, int *n_namep,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned long *fileidp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct dirent *entp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err = errno;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((entp = readdir(dirp)) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err == errno) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *n_namep = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (errno);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *fileidp = entp->d_ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(name, entp->d_name, *n_namep);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *n_namep = entp->d_reclen + 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *cookiep = telldir(dirp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}