17917SReza.Sabdar@Sun.COM /*
2*12186SJanice.Chang@Sun.COM * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
37917SReza.Sabdar@Sun.COM */
47917SReza.Sabdar@Sun.COM
57917SReza.Sabdar@Sun.COM /*
67917SReza.Sabdar@Sun.COM * BSD 3 Clause License
77917SReza.Sabdar@Sun.COM *
87917SReza.Sabdar@Sun.COM * Copyright (c) 2007, The Storage Networking Industry Association.
97917SReza.Sabdar@Sun.COM *
107917SReza.Sabdar@Sun.COM * Redistribution and use in source and binary forms, with or without
117917SReza.Sabdar@Sun.COM * modification, are permitted provided that the following conditions
127917SReza.Sabdar@Sun.COM * are met:
137917SReza.Sabdar@Sun.COM * - Redistributions of source code must retain the above copyright
147917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer.
157917SReza.Sabdar@Sun.COM *
167917SReza.Sabdar@Sun.COM * - Redistributions in binary form must reproduce the above copyright
177917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer in
187917SReza.Sabdar@Sun.COM * the documentation and/or other materials provided with the
197917SReza.Sabdar@Sun.COM * distribution.
207917SReza.Sabdar@Sun.COM *
217917SReza.Sabdar@Sun.COM * - Neither the name of The Storage Networking Industry Association (SNIA)
227917SReza.Sabdar@Sun.COM * nor the names of its contributors may be used to endorse or promote
237917SReza.Sabdar@Sun.COM * products derived from this software without specific prior written
247917SReza.Sabdar@Sun.COM * permission.
257917SReza.Sabdar@Sun.COM *
267917SReza.Sabdar@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
277917SReza.Sabdar@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
287917SReza.Sabdar@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
297917SReza.Sabdar@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
307917SReza.Sabdar@Sun.COM * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
317917SReza.Sabdar@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
327917SReza.Sabdar@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
337917SReza.Sabdar@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
347917SReza.Sabdar@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
357917SReza.Sabdar@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
367917SReza.Sabdar@Sun.COM * POSSIBILITY OF SUCH DAMAGE.
377917SReza.Sabdar@Sun.COM */
387917SReza.Sabdar@Sun.COM /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
397917SReza.Sabdar@Sun.COM /* Copyright (c) 2007, The Storage Networking Industry Association. */
407917SReza.Sabdar@Sun.COM
417917SReza.Sabdar@Sun.COM /*
427917SReza.Sabdar@Sun.COM * File history callback functions called by backup modules. NDMP file history
437917SReza.Sabdar@Sun.COM * supports 2 file history models: path based and inode/directory based.
447917SReza.Sabdar@Sun.COM * Backup/recover modules similar to unix dump/restore utilize the
457917SReza.Sabdar@Sun.COM * inode/directory based model. During the filesystem scan pass,
467917SReza.Sabdar@Sun.COM * ndmpd_file_history_dir() is called. During the file backup pass,
477917SReza.Sabdar@Sun.COM * ndmpd_file_history_node() is called. This model is appropriate for
487917SReza.Sabdar@Sun.COM * modules whose code is structured such that file name and file attribute
497917SReza.Sabdar@Sun.COM * data is not available at the same time. Backup/recover modules similar
507917SReza.Sabdar@Sun.COM * to tar or cpio utilize the path based model. The simple dump/restore module
517917SReza.Sabdar@Sun.COM * included with the SDK uses the path based model.
527917SReza.Sabdar@Sun.COM */
537917SReza.Sabdar@Sun.COM
547917SReza.Sabdar@Sun.COM #include <sys/stat.h>
557917SReza.Sabdar@Sun.COM #include <sys/types.h>
567917SReza.Sabdar@Sun.COM #include <dirent.h>
577917SReza.Sabdar@Sun.COM #include <errno.h>
587917SReza.Sabdar@Sun.COM #include <stdlib.h>
597917SReza.Sabdar@Sun.COM #include <string.h>
607917SReza.Sabdar@Sun.COM #include "ndmpd.h"
617917SReza.Sabdar@Sun.COM #include <dirent.h>
627917SReza.Sabdar@Sun.COM #include <bitmap.h>
637917SReza.Sabdar@Sun.COM
647917SReza.Sabdar@Sun.COM
657917SReza.Sabdar@Sun.COM #define N_PATH_ENTRIES 1000
667917SReza.Sabdar@Sun.COM #define N_FILE_ENTRIES N_PATH_ENTRIES
677917SReza.Sabdar@Sun.COM #define N_DIR_ENTRIES 1000
687917SReza.Sabdar@Sun.COM #define N_NODE_ENTRIES 1000
697917SReza.Sabdar@Sun.COM
707917SReza.Sabdar@Sun.COM /* Figure an average of 32 bytes per path name */
717917SReza.Sabdar@Sun.COM #define PATH_NAMEBUF_SIZE (N_PATH_ENTRIES * 32)
727917SReza.Sabdar@Sun.COM
737917SReza.Sabdar@Sun.COM /* Figure an average of 16 bytes per file name */
747917SReza.Sabdar@Sun.COM #define DIR_NAMEBUF_SIZE (N_PATH_ENTRIES * 16)
757917SReza.Sabdar@Sun.COM
767917SReza.Sabdar@Sun.COM static boolean_t fh_requested(void *cookie);
777917SReza.Sabdar@Sun.COM static void ndmpd_file_history_cleanup_v2(ndmpd_session_t *session,
787917SReza.Sabdar@Sun.COM boolean_t send_flag);
797917SReza.Sabdar@Sun.COM static void ndmpd_file_history_cleanup_v3(ndmpd_session_t *session,
807917SReza.Sabdar@Sun.COM boolean_t send_flag);
817917SReza.Sabdar@Sun.COM static ndmpd_module_params_t *get_params(void *cookie);
827917SReza.Sabdar@Sun.COM
837917SReza.Sabdar@Sun.COM
847917SReza.Sabdar@Sun.COM /*
857917SReza.Sabdar@Sun.COM * Each file history as a separate message to the client.
867917SReza.Sabdar@Sun.COM */
877917SReza.Sabdar@Sun.COM static int ndmp_syncfh = 0;
887917SReza.Sabdar@Sun.COM
897917SReza.Sabdar@Sun.COM
907917SReza.Sabdar@Sun.COM /*
917917SReza.Sabdar@Sun.COM * ************************************************************************
927917SReza.Sabdar@Sun.COM * NDMP V2 HANDLERS
937917SReza.Sabdar@Sun.COM * ************************************************************************
947917SReza.Sabdar@Sun.COM */
957917SReza.Sabdar@Sun.COM
967917SReza.Sabdar@Sun.COM /*
977917SReza.Sabdar@Sun.COM * ndmpd_api_file_history_path_v2
987917SReza.Sabdar@Sun.COM *
997917SReza.Sabdar@Sun.COM * Add a file history path entry to the buffer.
1007917SReza.Sabdar@Sun.COM * History data is buffered until the buffer is filled.
1017917SReza.Sabdar@Sun.COM * Full buffers are then sent to the client.
1027917SReza.Sabdar@Sun.COM *
1037917SReza.Sabdar@Sun.COM * Parameters:
1047917SReza.Sabdar@Sun.COM * cookie (input) - session pointer.
1057917SReza.Sabdar@Sun.COM * name (input) - file name.
1067917SReza.Sabdar@Sun.COM * NULL forces buffered data to be sent.
1077917SReza.Sabdar@Sun.COM * file_stat (input) - file status pointer.
1087917SReza.Sabdar@Sun.COM * fh_info (input) - data stream position of file data used during
1097917SReza.Sabdar@Sun.COM * fast restore.
1107917SReza.Sabdar@Sun.COM *
1117917SReza.Sabdar@Sun.COM * Returns:
1127917SReza.Sabdar@Sun.COM * 0 - success
1137917SReza.Sabdar@Sun.COM * -1 - error
1147917SReza.Sabdar@Sun.COM */
1157917SReza.Sabdar@Sun.COM int
ndmpd_api_file_history_path_v2(void * cookie,char * name,struct stat64 * file_stat,u_longlong_t fh_info)1167917SReza.Sabdar@Sun.COM ndmpd_api_file_history_path_v2(void *cookie, char *name,
1177917SReza.Sabdar@Sun.COM struct stat64 *file_stat, u_longlong_t fh_info)
1187917SReza.Sabdar@Sun.COM {
1197917SReza.Sabdar@Sun.COM ndmpd_session_t *session = (ndmpd_session_t *)cookie;
1207917SReza.Sabdar@Sun.COM ndmp_fh_unix_path *entry;
1217917SReza.Sabdar@Sun.COM
1227917SReza.Sabdar@Sun.COM if (name == NULL && session->ns_fh.fh_path_index == 0)
1237917SReza.Sabdar@Sun.COM return (0);
1247917SReza.Sabdar@Sun.COM
1257917SReza.Sabdar@Sun.COM /*
1267917SReza.Sabdar@Sun.COM * If the buffer does not have space
1277917SReza.Sabdar@Sun.COM * for the current entry, send the buffered data to the client.
1287917SReza.Sabdar@Sun.COM * A NULL name indicates that any buffered data should be sent.
1297917SReza.Sabdar@Sun.COM */
1307917SReza.Sabdar@Sun.COM if (name == NULL ||
1317917SReza.Sabdar@Sun.COM (ndmp_syncfh && session->ns_fh.fh_path_index != 0) ||
1327917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_index == N_PATH_ENTRIES ||
1337917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf_index + strlen(name) + 1 >
1347917SReza.Sabdar@Sun.COM PATH_NAMEBUF_SIZE) {
1357917SReza.Sabdar@Sun.COM ndmp_fh_add_unix_path_request request;
1367917SReza.Sabdar@Sun.COM
1377917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
1387917SReza.Sabdar@Sun.COM "sending %ld entries", session->ns_fh.fh_path_index);
1397917SReza.Sabdar@Sun.COM
1407917SReza.Sabdar@Sun.COM request.paths.paths_val = session->ns_fh.fh_path_entries;
1417917SReza.Sabdar@Sun.COM request.paths.paths_len = session->ns_fh.fh_path_index;
1427917SReza.Sabdar@Sun.COM
1437917SReza.Sabdar@Sun.COM if (ndmp_send_request_lock(session->ns_connection,
1447917SReza.Sabdar@Sun.COM NDMP_FH_ADD_UNIX_PATH, NDMP_NO_ERR, (void *) &request,
1457917SReza.Sabdar@Sun.COM 0) < 0) {
1467917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "Sending file history data");
1477917SReza.Sabdar@Sun.COM return (-1);
1487917SReza.Sabdar@Sun.COM }
1497917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_index = 0;
1507917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf_index = 0;
1517917SReza.Sabdar@Sun.COM }
1527917SReza.Sabdar@Sun.COM if (name == NULL)
1537917SReza.Sabdar@Sun.COM return (0);
1547917SReza.Sabdar@Sun.COM
1557917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_path_entries == 0) {
1567917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_entries = ndmp_malloc(N_PATH_ENTRIES *
1577917SReza.Sabdar@Sun.COM sizeof (ndmp_fh_unix_path));
1587917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_path_entries == 0)
1597917SReza.Sabdar@Sun.COM return (-1);
1607917SReza.Sabdar@Sun.COM }
1617917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_path_name_buf == 0) {
1627917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf =
1637917SReza.Sabdar@Sun.COM ndmp_malloc(PATH_NAMEBUF_SIZE);
1647917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_path_name_buf == 0)
1657917SReza.Sabdar@Sun.COM return (-1);
1667917SReza.Sabdar@Sun.COM }
1677917SReza.Sabdar@Sun.COM entry = &session->ns_fh.fh_path_entries[session->ns_fh.fh_path_index];
1687917SReza.Sabdar@Sun.COM ndmpd_get_file_entry_type(file_stat->st_mode, &entry->fstat.ftype);
1697917SReza.Sabdar@Sun.COM
1707917SReza.Sabdar@Sun.COM entry->name = &session->
1717917SReza.Sabdar@Sun.COM ns_fh.fh_path_name_buf[session->ns_fh.fh_path_name_buf_index];
1727917SReza.Sabdar@Sun.COM (void) strlcpy(entry->name, name, PATH_NAMEBUF_SIZE);
1737917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf_index += strlen(name) + 1;
1747917SReza.Sabdar@Sun.COM entry->fstat.mtime = (ulong_t)file_stat->st_mtime;
1757917SReza.Sabdar@Sun.COM entry->fstat.atime = (ulong_t)file_stat->st_atime;
1767917SReza.Sabdar@Sun.COM entry->fstat.ctime = (ulong_t)file_stat->st_ctime;
1777917SReza.Sabdar@Sun.COM entry->fstat.uid = file_stat->st_uid;
1787917SReza.Sabdar@Sun.COM entry->fstat.gid = file_stat->st_gid;
1797917SReza.Sabdar@Sun.COM entry->fstat.mode = (file_stat->st_mode) & 0x0fff;
1807917SReza.Sabdar@Sun.COM entry->fstat.size = long_long_to_quad((u_longlong_t)file_stat->st_size);
1817917SReza.Sabdar@Sun.COM entry->fstat.fh_info = long_long_to_quad((u_longlong_t)fh_info);
1827917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_index++;
1837917SReza.Sabdar@Sun.COM return (0);
1847917SReza.Sabdar@Sun.COM }
1857917SReza.Sabdar@Sun.COM
1867917SReza.Sabdar@Sun.COM
1877917SReza.Sabdar@Sun.COM /*
1887917SReza.Sabdar@Sun.COM * ndmpd_api_file_history_dir_v2
1897917SReza.Sabdar@Sun.COM *
1907917SReza.Sabdar@Sun.COM * Add a file history dir entry to the buffer.
1917917SReza.Sabdar@Sun.COM * History data is buffered until the buffer is filled.
1927917SReza.Sabdar@Sun.COM * Full buffers are then sent to the client.
1937917SReza.Sabdar@Sun.COM *
1947917SReza.Sabdar@Sun.COM * Parameters:
1957917SReza.Sabdar@Sun.COM * cookie (input) - session pointer.
1967917SReza.Sabdar@Sun.COM * name (input) - file name.
1977917SReza.Sabdar@Sun.COM * NULL forces buffered data to be sent.
1987917SReza.Sabdar@Sun.COM * node (input) - file inode.
1997917SReza.Sabdar@Sun.COM * parent (input) - file parent inode.
2007917SReza.Sabdar@Sun.COM * Should equal node if the file is the root of
2017917SReza.Sabdar@Sun.COM * the filesystem and has no parent.
2027917SReza.Sabdar@Sun.COM *
2037917SReza.Sabdar@Sun.COM * Returns:
2047917SReza.Sabdar@Sun.COM * 0 - success
2057917SReza.Sabdar@Sun.COM * -1 - error
2067917SReza.Sabdar@Sun.COM */
2077917SReza.Sabdar@Sun.COM int
ndmpd_api_file_history_dir_v2(void * cookie,char * name,ulong_t node,ulong_t parent)2087917SReza.Sabdar@Sun.COM ndmpd_api_file_history_dir_v2(void *cookie, char *name, ulong_t node,
2097917SReza.Sabdar@Sun.COM ulong_t parent)
2107917SReza.Sabdar@Sun.COM {
2117917SReza.Sabdar@Sun.COM ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2127917SReza.Sabdar@Sun.COM ndmp_fh_unix_dir *entry;
2137917SReza.Sabdar@Sun.COM
2147917SReza.Sabdar@Sun.COM if (name == NULL && session->ns_fh.fh_dir_index == 0)
2157917SReza.Sabdar@Sun.COM return (0);
2167917SReza.Sabdar@Sun.COM
2177917SReza.Sabdar@Sun.COM /*
2187917SReza.Sabdar@Sun.COM * If the buffer does not have space for the current entry,
2197917SReza.Sabdar@Sun.COM * send the buffered data to the client. A NULL name indicates
2207917SReza.Sabdar@Sun.COM * that any buffered data should be sent.
2217917SReza.Sabdar@Sun.COM */
2227917SReza.Sabdar@Sun.COM if (name == NULL ||
2237917SReza.Sabdar@Sun.COM (ndmp_syncfh && session->ns_fh.fh_dir_index != 0) ||
2247917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_index == N_DIR_ENTRIES ||
2257917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf_index + strlen(name) + 1 >
2267917SReza.Sabdar@Sun.COM DIR_NAMEBUF_SIZE) {
2277917SReza.Sabdar@Sun.COM ndmp_fh_add_unix_dir_request request;
2287917SReza.Sabdar@Sun.COM
2297917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
2307917SReza.Sabdar@Sun.COM "sending %ld entries", session->ns_fh.fh_dir_index);
2317917SReza.Sabdar@Sun.COM
2327917SReza.Sabdar@Sun.COM request.dirs.dirs_val = session->ns_fh.fh_dir_entries;
2337917SReza.Sabdar@Sun.COM request.dirs.dirs_len = session->ns_fh.fh_dir_index;
2347917SReza.Sabdar@Sun.COM if (ndmp_send_request_lock(session->ns_connection,
2357917SReza.Sabdar@Sun.COM NDMP_FH_ADD_UNIX_DIR, NDMP_NO_ERR, (void *) &request,
2367917SReza.Sabdar@Sun.COM 0) < 0) {
2377917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "Sending file history data");
2387917SReza.Sabdar@Sun.COM return (-1);
2397917SReza.Sabdar@Sun.COM }
2407917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_index = 0;
2417917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf_index = 0;
2427917SReza.Sabdar@Sun.COM }
2437917SReza.Sabdar@Sun.COM if (name == NULL)
2447917SReza.Sabdar@Sun.COM return (0);
2457917SReza.Sabdar@Sun.COM
2467917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_dir_entries == 0) {
2477917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_entries = ndmp_malloc(N_DIR_ENTRIES
2487917SReza.Sabdar@Sun.COM * sizeof (ndmp_fh_unix_dir));
2497917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_dir_entries == 0)
2507917SReza.Sabdar@Sun.COM return (-1);
2517917SReza.Sabdar@Sun.COM }
2527917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_dir_name_buf == 0) {
2537917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf = ndmp_malloc(DIR_NAMEBUF_SIZE);
2547917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_dir_name_buf == 0)
2557917SReza.Sabdar@Sun.COM return (-1);
2567917SReza.Sabdar@Sun.COM }
2577917SReza.Sabdar@Sun.COM entry = &session->ns_fh.fh_dir_entries[session->ns_fh.fh_dir_index];
2587917SReza.Sabdar@Sun.COM
2597917SReza.Sabdar@Sun.COM entry->name = &session->
2607917SReza.Sabdar@Sun.COM ns_fh.fh_dir_name_buf[session->ns_fh.fh_dir_name_buf_index];
2617917SReza.Sabdar@Sun.COM (void) strlcpy(&session->
2627917SReza.Sabdar@Sun.COM ns_fh.fh_dir_name_buf[session->ns_fh.fh_dir_name_buf_index],
2637917SReza.Sabdar@Sun.COM name, PATH_NAMEBUF_SIZE);
2647917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf_index += strlen(name) + 1;
2657917SReza.Sabdar@Sun.COM
2667917SReza.Sabdar@Sun.COM entry->node = node;
2677917SReza.Sabdar@Sun.COM entry->parent = parent;
2687917SReza.Sabdar@Sun.COM
2697917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_index++;
2707917SReza.Sabdar@Sun.COM return (0);
2717917SReza.Sabdar@Sun.COM }
2727917SReza.Sabdar@Sun.COM
2737917SReza.Sabdar@Sun.COM
2747917SReza.Sabdar@Sun.COM /*
2757917SReza.Sabdar@Sun.COM * ndmpd_api_file_history_node_v2
2767917SReza.Sabdar@Sun.COM *
2777917SReza.Sabdar@Sun.COM * Add a file history node entry to the buffer.
2787917SReza.Sabdar@Sun.COM * History data is buffered until the buffer is filled.
2797917SReza.Sabdar@Sun.COM * Full buffers are then sent to the client.
2807917SReza.Sabdar@Sun.COM *
2817917SReza.Sabdar@Sun.COM * Parameters:
2827917SReza.Sabdar@Sun.COM * cookie (input) - session pointer.
2837917SReza.Sabdar@Sun.COM * node (input) - file inode.
2847917SReza.Sabdar@Sun.COM * must match a node from a prior ndmpd_api_file_history_dir()
2857917SReza.Sabdar@Sun.COM * call.
2867917SReza.Sabdar@Sun.COM * file_stat (input) - file status pointer.
2877917SReza.Sabdar@Sun.COM * 0 forces buffered data to be sent.
2887917SReza.Sabdar@Sun.COM * fh_info (input) - data stream position of file data used during
2897917SReza.Sabdar@Sun.COM * fast restore.
2907917SReza.Sabdar@Sun.COM *
2917917SReza.Sabdar@Sun.COM * Returns:
2927917SReza.Sabdar@Sun.COM * 0 - success
2937917SReza.Sabdar@Sun.COM * -1 - error.
2947917SReza.Sabdar@Sun.COM */
2957917SReza.Sabdar@Sun.COM int
ndmpd_api_file_history_node_v2(void * cookie,ulong_t node,struct stat64 * file_stat,u_longlong_t fh_info)2967917SReza.Sabdar@Sun.COM ndmpd_api_file_history_node_v2(void *cookie, ulong_t node,
2977917SReza.Sabdar@Sun.COM struct stat64 *file_stat, u_longlong_t fh_info)
2987917SReza.Sabdar@Sun.COM {
2997917SReza.Sabdar@Sun.COM ndmpd_session_t *session = (ndmpd_session_t *)cookie;
3007917SReza.Sabdar@Sun.COM ndmp_fh_unix_node *entry;
3017917SReza.Sabdar@Sun.COM
3027917SReza.Sabdar@Sun.COM if (file_stat == NULL && session->ns_fh.fh_node_index == 0)
3037917SReza.Sabdar@Sun.COM return (-1);
3047917SReza.Sabdar@Sun.COM
3057917SReza.Sabdar@Sun.COM /*
3067917SReza.Sabdar@Sun.COM * If the buffer does not have space
3077917SReza.Sabdar@Sun.COM * for the current entry, send the buffered data to the client.
3087917SReza.Sabdar@Sun.COM * A 0 file_stat pointer indicates that any buffered data should
3097917SReza.Sabdar@Sun.COM * be sent.
3107917SReza.Sabdar@Sun.COM */
3117917SReza.Sabdar@Sun.COM if (file_stat == NULL ||
3127917SReza.Sabdar@Sun.COM (ndmp_syncfh && session->ns_fh.fh_node_index != 0) ||
3137917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_index == N_NODE_ENTRIES) {
3147917SReza.Sabdar@Sun.COM ndmp_fh_add_unix_node_request request;
3157917SReza.Sabdar@Sun.COM
3167917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
3177917SReza.Sabdar@Sun.COM "sending %ld entries", session->ns_fh.fh_node_index);
3187917SReza.Sabdar@Sun.COM
3197917SReza.Sabdar@Sun.COM request.nodes.nodes_val = session->ns_fh.fh_node_entries;
3207917SReza.Sabdar@Sun.COM request.nodes.nodes_len = session->ns_fh.fh_node_index;
3217917SReza.Sabdar@Sun.COM /*
3227917SReza.Sabdar@Sun.COM * Need to send Dir entry as well. Since Dir entry is more than
3237917SReza.Sabdar@Sun.COM * Node entry, we may send a Node entry that hasn't have
3247917SReza.Sabdar@Sun.COM * its dir entry sent. Therefore, we need to flush Dir entry
3257917SReza.Sabdar@Sun.COM * as well everytime the Dir entry is send.
3267917SReza.Sabdar@Sun.COM */
3277917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_dir_v2(session, 0, 0, 0);
3287917SReza.Sabdar@Sun.COM
3297917SReza.Sabdar@Sun.COM if (ndmp_send_request_lock(session->ns_connection,
3307917SReza.Sabdar@Sun.COM NDMP_FH_ADD_UNIX_NODE, NDMP_NO_ERR, (void *) &request,
3317917SReza.Sabdar@Sun.COM 0) < 0) {
3327917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "Sending file history data");
3337917SReza.Sabdar@Sun.COM return (-1);
3347917SReza.Sabdar@Sun.COM }
3357917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_index = 0;
3367917SReza.Sabdar@Sun.COM }
3377917SReza.Sabdar@Sun.COM if (file_stat == NULL)
3387917SReza.Sabdar@Sun.COM return (0);
3397917SReza.Sabdar@Sun.COM
3407917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_node_entries == 0) {
3417917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_entries = ndmp_malloc(N_NODE_ENTRIES
3427917SReza.Sabdar@Sun.COM * sizeof (ndmp_fh_unix_node));
3437917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_node_entries == 0)
3447917SReza.Sabdar@Sun.COM return (-1);
3457917SReza.Sabdar@Sun.COM }
3467917SReza.Sabdar@Sun.COM entry = &session->ns_fh.fh_node_entries[session->ns_fh.fh_node_index];
3477917SReza.Sabdar@Sun.COM ndmpd_get_file_entry_type(file_stat->st_mode, &entry->fstat.ftype);
3487917SReza.Sabdar@Sun.COM
3497917SReza.Sabdar@Sun.COM entry->node = node;
3507917SReza.Sabdar@Sun.COM entry->fstat.mtime = (ulong_t)file_stat->st_mtime;
3517917SReza.Sabdar@Sun.COM entry->fstat.atime = (ulong_t)file_stat->st_atime;
3527917SReza.Sabdar@Sun.COM entry->fstat.ctime = (ulong_t)file_stat->st_ctime;
3537917SReza.Sabdar@Sun.COM entry->fstat.uid = file_stat->st_uid;
3547917SReza.Sabdar@Sun.COM entry->fstat.gid = file_stat->st_gid;
3557917SReza.Sabdar@Sun.COM entry->fstat.mode = (file_stat->st_mode) & 0x0fff;
3567917SReza.Sabdar@Sun.COM entry->fstat.size = long_long_to_quad((u_longlong_t)file_stat->st_size);
3577917SReza.Sabdar@Sun.COM entry->fstat.fh_info = long_long_to_quad(fh_info);
3587917SReza.Sabdar@Sun.COM
3597917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_index++;
3607917SReza.Sabdar@Sun.COM return (0);
3617917SReza.Sabdar@Sun.COM }
3627917SReza.Sabdar@Sun.COM
3637917SReza.Sabdar@Sun.COM
3647917SReza.Sabdar@Sun.COM /*
3657917SReza.Sabdar@Sun.COM * ************************************************************************
3667917SReza.Sabdar@Sun.COM * NDMP V3 HANDLERS
3677917SReza.Sabdar@Sun.COM * ************************************************************************
3687917SReza.Sabdar@Sun.COM */
3697917SReza.Sabdar@Sun.COM
3707917SReza.Sabdar@Sun.COM /*
3717917SReza.Sabdar@Sun.COM * ndmpd_api_file_history_file_v3
3727917SReza.Sabdar@Sun.COM *
3737917SReza.Sabdar@Sun.COM * Add a file history file entry to the buffer.
3747917SReza.Sabdar@Sun.COM * History data is buffered until the buffer is filled.
3757917SReza.Sabdar@Sun.COM * Full buffers are then sent to the client.
3767917SReza.Sabdar@Sun.COM *
3777917SReza.Sabdar@Sun.COM * Parameters:
3787917SReza.Sabdar@Sun.COM * cookie (input) - session pointer.
3797917SReza.Sabdar@Sun.COM * name (input) - file name.
3807917SReza.Sabdar@Sun.COM * NULL forces buffered data to be sent.
3817917SReza.Sabdar@Sun.COM * file_stat (input) - file status pointer.
3827917SReza.Sabdar@Sun.COM * fh_info (input) - data stream position of file data used during
3837917SReza.Sabdar@Sun.COM * fast restore.
3847917SReza.Sabdar@Sun.COM *
3857917SReza.Sabdar@Sun.COM * Returns:
3867917SReza.Sabdar@Sun.COM * 0 - success
3877917SReza.Sabdar@Sun.COM * -1 - error
3887917SReza.Sabdar@Sun.COM */
3897917SReza.Sabdar@Sun.COM int
ndmpd_api_file_history_file_v3(void * cookie,char * name,struct stat64 * file_stat,u_longlong_t fh_info)3907917SReza.Sabdar@Sun.COM ndmpd_api_file_history_file_v3(void *cookie, char *name,
3917917SReza.Sabdar@Sun.COM struct stat64 *file_stat, u_longlong_t fh_info)
3927917SReza.Sabdar@Sun.COM {
3937917SReza.Sabdar@Sun.COM ndmpd_session_t *session = (ndmpd_session_t *)cookie;
3947917SReza.Sabdar@Sun.COM ndmp_file_v3 *file_entry;
3957917SReza.Sabdar@Sun.COM ndmp_file_name_v3 *file_name_entry;
3967917SReza.Sabdar@Sun.COM ndmp_file_stat_v3 *file_stat_entry;
3977917SReza.Sabdar@Sun.COM ndmp_fh_add_file_request_v3 request;
3987917SReza.Sabdar@Sun.COM
3997917SReza.Sabdar@Sun.COM if (name == NULL && session->ns_fh_v3.fh_file_index == 0)
4007917SReza.Sabdar@Sun.COM return (0);
4017917SReza.Sabdar@Sun.COM
4027917SReza.Sabdar@Sun.COM /*
4037917SReza.Sabdar@Sun.COM * If the buffer does not have space
4047917SReza.Sabdar@Sun.COM * for the current entry, send the buffered data to the client.
4057917SReza.Sabdar@Sun.COM * A NULL name indicates that any buffered data should be sent.
4067917SReza.Sabdar@Sun.COM */
4077917SReza.Sabdar@Sun.COM if (name == NULL ||
4087917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_index == N_FILE_ENTRIES ||
4097917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf_index + strlen(name) + 1 >
4107917SReza.Sabdar@Sun.COM PATH_NAMEBUF_SIZE) {
4117917SReza.Sabdar@Sun.COM
4127917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "sending %ld entries",
4137917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_index);
4147917SReza.Sabdar@Sun.COM
4157917SReza.Sabdar@Sun.COM request.files.files_len = session->ns_fh_v3.fh_file_index;
4167917SReza.Sabdar@Sun.COM request.files.files_val = session->ns_fh_v3.fh_files;
4177917SReza.Sabdar@Sun.COM
4187917SReza.Sabdar@Sun.COM if (ndmp_send_request_lock(session->ns_connection,
4197917SReza.Sabdar@Sun.COM NDMP_FH_ADD_FILE, NDMP_NO_ERR, (void *) &request, 0) < 0) {
4207917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
4217917SReza.Sabdar@Sun.COM "Sending ndmp_fh_add_file request");
4227917SReza.Sabdar@Sun.COM return (-1);
4237917SReza.Sabdar@Sun.COM }
4247917SReza.Sabdar@Sun.COM
4257917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_index = 0;
4267917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf_index = 0;
4277917SReza.Sabdar@Sun.COM }
4287917SReza.Sabdar@Sun.COM
4297917SReza.Sabdar@Sun.COM if (name == NULL)
4307917SReza.Sabdar@Sun.COM return (0);
4317917SReza.Sabdar@Sun.COM
4327917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_files == 0) {
4337917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_files = ndmp_malloc(sizeof (ndmp_file_v3) *
4347917SReza.Sabdar@Sun.COM N_FILE_ENTRIES);
4357917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_files == 0)
4367917SReza.Sabdar@Sun.COM return (-1);
4377917SReza.Sabdar@Sun.COM }
4387917SReza.Sabdar@Sun.COM
4397917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_names == 0) {
4407917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_names =
4417917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (ndmp_file_name_v3) * N_FILE_ENTRIES);
4427917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_names == 0)
4437917SReza.Sabdar@Sun.COM return (-1);
4447917SReza.Sabdar@Sun.COM }
4457917SReza.Sabdar@Sun.COM
4467917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_name_buf == 0) {
4477917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf =
4487917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (char) * PATH_NAMEBUF_SIZE);
4497917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_name_buf == 0)
4507917SReza.Sabdar@Sun.COM return (-1);
4517917SReza.Sabdar@Sun.COM }
4527917SReza.Sabdar@Sun.COM
4537917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_stats == 0) {
4547917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_stats =
4557917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (ndmp_file_stat_v3) * N_FILE_ENTRIES);
4567917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_stats == 0)
4577917SReza.Sabdar@Sun.COM return (-1);
4587917SReza.Sabdar@Sun.COM }
4597917SReza.Sabdar@Sun.COM
4607917SReza.Sabdar@Sun.COM file_entry =
4617917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_files[session->ns_fh_v3.fh_file_index];
4627917SReza.Sabdar@Sun.COM file_name_entry =
4637917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_file_names[session->ns_fh_v3.fh_file_index];
4647917SReza.Sabdar@Sun.COM file_stat_entry =
4657917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_file_stats[session->ns_fh_v3.fh_file_index];
4667917SReza.Sabdar@Sun.COM file_entry->names.names_len = 1;
4677917SReza.Sabdar@Sun.COM file_entry->names.names_val = file_name_entry;
4687917SReza.Sabdar@Sun.COM file_entry->stats.stats_len = 1;
4697917SReza.Sabdar@Sun.COM file_entry->stats.stats_val = file_stat_entry;
4707917SReza.Sabdar@Sun.COM file_entry->node = long_long_to_quad(file_stat->st_ino);
4717917SReza.Sabdar@Sun.COM file_entry->fh_info = long_long_to_quad(fh_info);
4727917SReza.Sabdar@Sun.COM
4737917SReza.Sabdar@Sun.COM file_name_entry->fs_type = NDMP_FS_UNIX;
4747917SReza.Sabdar@Sun.COM file_name_entry->ndmp_file_name_v3_u.unix_name =
4757917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_file_name_buf[session->
4767917SReza.Sabdar@Sun.COM ns_fh_v3.fh_file_name_buf_index];
4777917SReza.Sabdar@Sun.COM (void) strlcpy(&session->ns_fh_v3.fh_file_name_buf[session->
4787917SReza.Sabdar@Sun.COM ns_fh_v3.fh_file_name_buf_index], name, PATH_NAMEBUF_SIZE);
4797917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf_index += strlen(name) + 1;
4807917SReza.Sabdar@Sun.COM ndmpd_get_file_entry_type(file_stat->st_mode, &file_stat_entry->ftype);
4817917SReza.Sabdar@Sun.COM
4827917SReza.Sabdar@Sun.COM file_stat_entry->invalid = 0;
4837917SReza.Sabdar@Sun.COM file_stat_entry->fs_type = NDMP_FS_UNIX;
4847917SReza.Sabdar@Sun.COM file_stat_entry->mtime = file_stat->st_mtime;
4857917SReza.Sabdar@Sun.COM file_stat_entry->atime = file_stat->st_atime;
4867917SReza.Sabdar@Sun.COM file_stat_entry->ctime = file_stat->st_ctime;
4877917SReza.Sabdar@Sun.COM file_stat_entry->owner = file_stat->st_uid;
4887917SReza.Sabdar@Sun.COM file_stat_entry->group = file_stat->st_gid;
4897917SReza.Sabdar@Sun.COM file_stat_entry->fattr = file_stat->st_mode & 0x0fff;
4907917SReza.Sabdar@Sun.COM file_stat_entry->size =
4917917SReza.Sabdar@Sun.COM long_long_to_quad((u_longlong_t)file_stat->st_size);
4927917SReza.Sabdar@Sun.COM file_stat_entry->links = file_stat->st_nlink;
4937917SReza.Sabdar@Sun.COM
4947917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_index++;
4957917SReza.Sabdar@Sun.COM
4967917SReza.Sabdar@Sun.COM return (0);
4977917SReza.Sabdar@Sun.COM }
4987917SReza.Sabdar@Sun.COM
4997917SReza.Sabdar@Sun.COM
5007917SReza.Sabdar@Sun.COM /*
5017917SReza.Sabdar@Sun.COM * ndmpd_api_file_history_dir_v3
5027917SReza.Sabdar@Sun.COM *
5037917SReza.Sabdar@Sun.COM * Add a file history dir entry to the buffer.
5047917SReza.Sabdar@Sun.COM * History data is buffered until the buffer is filled.
5057917SReza.Sabdar@Sun.COM * Full buffers are then sent to the client.
5067917SReza.Sabdar@Sun.COM *
5077917SReza.Sabdar@Sun.COM * Parameters:
5087917SReza.Sabdar@Sun.COM * cookie (input) - session pointer.
5097917SReza.Sabdar@Sun.COM * name (input) - file name.
5107917SReza.Sabdar@Sun.COM * NULL forces buffered data to be sent.
5117917SReza.Sabdar@Sun.COM * node (input) - file inode.
5127917SReza.Sabdar@Sun.COM * parent (input) - file parent inode.
5137917SReza.Sabdar@Sun.COM * Should equal node if the file is the root of
5147917SReza.Sabdar@Sun.COM * the filesystem and has no parent.
5157917SReza.Sabdar@Sun.COM *
5167917SReza.Sabdar@Sun.COM * Returns:
5177917SReza.Sabdar@Sun.COM * 0 - success
5187917SReza.Sabdar@Sun.COM * -1 - error
5197917SReza.Sabdar@Sun.COM */
5207917SReza.Sabdar@Sun.COM int
ndmpd_api_file_history_dir_v3(void * cookie,char * name,ulong_t node,ulong_t parent)5217917SReza.Sabdar@Sun.COM ndmpd_api_file_history_dir_v3(void *cookie, char *name, ulong_t node,
5227917SReza.Sabdar@Sun.COM ulong_t parent)
5237917SReza.Sabdar@Sun.COM {
5247917SReza.Sabdar@Sun.COM ndmpd_session_t *session = (ndmpd_session_t *)cookie;
5257917SReza.Sabdar@Sun.COM ndmp_dir_v3 *dir_entry;
5267917SReza.Sabdar@Sun.COM ndmp_file_name_v3 *dir_name_entry;
5277917SReza.Sabdar@Sun.COM ndmp_fh_add_dir_request_v3 request;
5287917SReza.Sabdar@Sun.COM
5297917SReza.Sabdar@Sun.COM if (name == NULL && session->ns_fh_v3.fh_dir_index == 0)
5307917SReza.Sabdar@Sun.COM return (0);
5317917SReza.Sabdar@Sun.COM
5327917SReza.Sabdar@Sun.COM /*
5337917SReza.Sabdar@Sun.COM * If the buffer does not have space
5347917SReza.Sabdar@Sun.COM * for the current entry, send the buffered data to the client.
5357917SReza.Sabdar@Sun.COM * A NULL name indicates that any buffered data should be sent.
5367917SReza.Sabdar@Sun.COM */
5377917SReza.Sabdar@Sun.COM if (name == NULL ||
5387917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_index == N_DIR_ENTRIES ||
5397917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf_index + strlen(name) + 1 >
5407917SReza.Sabdar@Sun.COM DIR_NAMEBUF_SIZE) {
5417917SReza.Sabdar@Sun.COM
5427917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "sending %ld entries",
5437917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_index);
5447917SReza.Sabdar@Sun.COM
5457917SReza.Sabdar@Sun.COM request.dirs.dirs_val = session->ns_fh_v3.fh_dirs;
5467917SReza.Sabdar@Sun.COM request.dirs.dirs_len = session->ns_fh_v3.fh_dir_index;
5477917SReza.Sabdar@Sun.COM
5487917SReza.Sabdar@Sun.COM if (ndmp_send_request_lock(session->ns_connection,
5497917SReza.Sabdar@Sun.COM NDMP_FH_ADD_DIR, NDMP_NO_ERR, (void *) &request, 0) < 0) {
5507917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
5517917SReza.Sabdar@Sun.COM "Sending ndmp_fh_add_dir request");
5527917SReza.Sabdar@Sun.COM return (-1);
5537917SReza.Sabdar@Sun.COM }
5547917SReza.Sabdar@Sun.COM
5557917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_index = 0;
5567917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf_index = 0;
5577917SReza.Sabdar@Sun.COM }
5587917SReza.Sabdar@Sun.COM
5597917SReza.Sabdar@Sun.COM if (name == NULL)
5607917SReza.Sabdar@Sun.COM return (0);
5617917SReza.Sabdar@Sun.COM
5627917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dirs == 0) {
5637917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dirs =
5647917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (ndmp_dir_v3) * N_DIR_ENTRIES);
5657917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dirs == 0)
5667917SReza.Sabdar@Sun.COM return (-1);
5677917SReza.Sabdar@Sun.COM }
5687917SReza.Sabdar@Sun.COM
5697917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dir_names == 0) {
5707917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_names =
5717917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (ndmp_file_name_v3) * N_DIR_ENTRIES);
5727917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dir_names == 0)
5737917SReza.Sabdar@Sun.COM return (-1);
5747917SReza.Sabdar@Sun.COM }
5757917SReza.Sabdar@Sun.COM
5767917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dir_name_buf == 0) {
5777917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf =
5787917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (char) * DIR_NAMEBUF_SIZE);
5797917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dir_name_buf == 0)
5807917SReza.Sabdar@Sun.COM return (-1);
5817917SReza.Sabdar@Sun.COM }
5827917SReza.Sabdar@Sun.COM
5837917SReza.Sabdar@Sun.COM dir_entry = &session->ns_fh_v3.fh_dirs[session->ns_fh_v3.fh_dir_index];
5847917SReza.Sabdar@Sun.COM dir_name_entry =
5857917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_dir_names[session->ns_fh_v3.fh_dir_index];
5867917SReza.Sabdar@Sun.COM
5877917SReza.Sabdar@Sun.COM dir_name_entry->fs_type = NDMP_FS_UNIX;
5887917SReza.Sabdar@Sun.COM dir_name_entry->ndmp_file_name_v3_u.unix_name =
5897917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_dir_name_buf[session->
5907917SReza.Sabdar@Sun.COM ns_fh_v3.fh_dir_name_buf_index];
5917917SReza.Sabdar@Sun.COM
5927917SReza.Sabdar@Sun.COM (void) strlcpy(&session->ns_fh_v3.fh_dir_name_buf[session->
5937917SReza.Sabdar@Sun.COM ns_fh_v3.fh_dir_name_buf_index], name, PATH_NAMEBUF_SIZE);
5947917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf_index += strlen(name) + 1;
5957917SReza.Sabdar@Sun.COM
5967917SReza.Sabdar@Sun.COM dir_entry->names.names_len = 1;
5977917SReza.Sabdar@Sun.COM dir_entry->names.names_val = dir_name_entry;
5987917SReza.Sabdar@Sun.COM dir_entry->node = long_long_to_quad(node);
5997917SReza.Sabdar@Sun.COM dir_entry->parent = long_long_to_quad(parent);
6007917SReza.Sabdar@Sun.COM
6017917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_index++;
6027917SReza.Sabdar@Sun.COM
6037917SReza.Sabdar@Sun.COM return (0);
6047917SReza.Sabdar@Sun.COM }
6057917SReza.Sabdar@Sun.COM
6067917SReza.Sabdar@Sun.COM
6077917SReza.Sabdar@Sun.COM /*
6087917SReza.Sabdar@Sun.COM * ndmpd_api_file_history_node_v3
6097917SReza.Sabdar@Sun.COM *
6107917SReza.Sabdar@Sun.COM * Add a file history node entry to the buffer.
6117917SReza.Sabdar@Sun.COM * History data is buffered until the buffer is filled.
6127917SReza.Sabdar@Sun.COM * Full buffers are then sent to the client.
6137917SReza.Sabdar@Sun.COM *
6147917SReza.Sabdar@Sun.COM * Parameters:
6157917SReza.Sabdar@Sun.COM * cookie (input) - session pointer.
6167917SReza.Sabdar@Sun.COM * node (input) - file inode.
6177917SReza.Sabdar@Sun.COM * must match a node from a prior ndmpd_api_file_history_dir()
6187917SReza.Sabdar@Sun.COM * call.
6197917SReza.Sabdar@Sun.COM * file_stat (input) - file status pointer.
6207917SReza.Sabdar@Sun.COM * 0 forces buffered data to be sent.
6217917SReza.Sabdar@Sun.COM * fh_info (input) - data stream position of file data used during
6227917SReza.Sabdar@Sun.COM * fast restore.
6237917SReza.Sabdar@Sun.COM *
6247917SReza.Sabdar@Sun.COM * Returns:
6257917SReza.Sabdar@Sun.COM * 0 - success
6267917SReza.Sabdar@Sun.COM * -1 - error.
6277917SReza.Sabdar@Sun.COM */
6287917SReza.Sabdar@Sun.COM int
ndmpd_api_file_history_node_v3(void * cookie,ulong_t node,struct stat64 * file_stat,u_longlong_t fh_info)6297917SReza.Sabdar@Sun.COM ndmpd_api_file_history_node_v3(void *cookie, ulong_t node,
6307917SReza.Sabdar@Sun.COM struct stat64 *file_stat, u_longlong_t fh_info)
6317917SReza.Sabdar@Sun.COM {
6327917SReza.Sabdar@Sun.COM ndmpd_session_t *session = (ndmpd_session_t *)cookie;
6337917SReza.Sabdar@Sun.COM ndmp_node_v3 *node_entry;
6347917SReza.Sabdar@Sun.COM ndmp_file_stat_v3 *file_stat_entry;
6357917SReza.Sabdar@Sun.COM ndmp_fh_add_node_request_v3 request;
6367917SReza.Sabdar@Sun.COM
6377917SReza.Sabdar@Sun.COM if (file_stat == NULL && session->ns_fh_v3.fh_node_index == 0)
6387917SReza.Sabdar@Sun.COM return (0);
6397917SReza.Sabdar@Sun.COM
6407917SReza.Sabdar@Sun.COM /*
6417917SReza.Sabdar@Sun.COM * If the buffer does not have space
6427917SReza.Sabdar@Sun.COM * for the current entry, send the buffered data to the client.
6437917SReza.Sabdar@Sun.COM * A 0 file_stat pointer indicates that any buffered data should
6447917SReza.Sabdar@Sun.COM * be sent.
6457917SReza.Sabdar@Sun.COM */
6467917SReza.Sabdar@Sun.COM if (file_stat == NULL ||
6477917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_index == N_NODE_ENTRIES) {
6487917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "sending %ld entries",
6497917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_index);
6507917SReza.Sabdar@Sun.COM
6517917SReza.Sabdar@Sun.COM /*
6527917SReza.Sabdar@Sun.COM * Need to send Dir entry as well. Since Dir entry is more
6537917SReza.Sabdar@Sun.COM * than a Node entry, we may send a Node entry that hasn't
6547917SReza.Sabdar@Sun.COM * had its Dir entry sent. Therefore, we need to flush Dir
6557917SReza.Sabdar@Sun.COM * entry as well every time the Dir entry is sent.
6567917SReza.Sabdar@Sun.COM */
6577917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_dir_v3(session, 0, 0, 0);
6587917SReza.Sabdar@Sun.COM
6597917SReza.Sabdar@Sun.COM request.nodes.nodes_len = session->ns_fh_v3.fh_node_index;
6607917SReza.Sabdar@Sun.COM request.nodes.nodes_val = session->ns_fh_v3.fh_nodes;
6617917SReza.Sabdar@Sun.COM
6627917SReza.Sabdar@Sun.COM if (ndmp_send_request_lock(session->ns_connection,
6637917SReza.Sabdar@Sun.COM NDMP_FH_ADD_NODE,
6647917SReza.Sabdar@Sun.COM NDMP_NO_ERR, (void *) &request, 0) < 0) {
6657917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
6667917SReza.Sabdar@Sun.COM "Sending ndmp_fh_add_node request");
6677917SReza.Sabdar@Sun.COM return (-1);
6687917SReza.Sabdar@Sun.COM }
6697917SReza.Sabdar@Sun.COM
6707917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_index = 0;
6717917SReza.Sabdar@Sun.COM }
6727917SReza.Sabdar@Sun.COM
6737917SReza.Sabdar@Sun.COM if (file_stat == NULL)
6747917SReza.Sabdar@Sun.COM return (0);
6757917SReza.Sabdar@Sun.COM
6767917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_nodes == 0) {
6777917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_nodes =
6787917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (ndmp_node_v3) * N_NODE_ENTRIES);
6797917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_nodes == 0)
6807917SReza.Sabdar@Sun.COM return (-1);
6817917SReza.Sabdar@Sun.COM }
6827917SReza.Sabdar@Sun.COM
6837917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_node_stats == 0) {
6847917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_stats =
6857917SReza.Sabdar@Sun.COM ndmp_malloc(sizeof (ndmp_file_stat_v3) * N_NODE_ENTRIES);
6867917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_node_stats == 0)
6877917SReza.Sabdar@Sun.COM return (-1);
6887917SReza.Sabdar@Sun.COM }
6897917SReza.Sabdar@Sun.COM
6907917SReza.Sabdar@Sun.COM node_entry =
6917917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_nodes[session->ns_fh_v3.fh_node_index];
6927917SReza.Sabdar@Sun.COM
6937917SReza.Sabdar@Sun.COM file_stat_entry =
6947917SReza.Sabdar@Sun.COM &session->ns_fh_v3.fh_node_stats[session->ns_fh_v3.fh_node_index];
6957917SReza.Sabdar@Sun.COM ndmpd_get_file_entry_type(file_stat->st_mode, &file_stat_entry->ftype);
6967917SReza.Sabdar@Sun.COM
6977917SReza.Sabdar@Sun.COM file_stat_entry->invalid = 0;
6987917SReza.Sabdar@Sun.COM file_stat_entry->fs_type = NDMP_FS_UNIX;
6997917SReza.Sabdar@Sun.COM file_stat_entry->mtime = file_stat->st_mtime;
7007917SReza.Sabdar@Sun.COM file_stat_entry->atime = file_stat->st_atime;
7017917SReza.Sabdar@Sun.COM file_stat_entry->ctime = file_stat->st_ctime;
7027917SReza.Sabdar@Sun.COM file_stat_entry->owner = file_stat->st_uid;
7037917SReza.Sabdar@Sun.COM file_stat_entry->group = file_stat->st_gid;
7047917SReza.Sabdar@Sun.COM file_stat_entry->fattr = file_stat->st_mode & 0x0fff;
7057917SReza.Sabdar@Sun.COM file_stat_entry->size =
7067917SReza.Sabdar@Sun.COM long_long_to_quad((u_longlong_t)file_stat->st_size);
7077917SReza.Sabdar@Sun.COM file_stat_entry->links = file_stat->st_nlink;
7087917SReza.Sabdar@Sun.COM
7097917SReza.Sabdar@Sun.COM node_entry->stats.stats_len = 1;
7107917SReza.Sabdar@Sun.COM node_entry->stats.stats_val = file_stat_entry;
7117917SReza.Sabdar@Sun.COM node_entry->node = long_long_to_quad((u_longlong_t)node);
7127917SReza.Sabdar@Sun.COM node_entry->fh_info = long_long_to_quad(fh_info);
7137917SReza.Sabdar@Sun.COM
7147917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_index++;
7157917SReza.Sabdar@Sun.COM
7167917SReza.Sabdar@Sun.COM return (0);
7177917SReza.Sabdar@Sun.COM }
7187917SReza.Sabdar@Sun.COM
7197917SReza.Sabdar@Sun.COM
7207917SReza.Sabdar@Sun.COM /*
7217917SReza.Sabdar@Sun.COM * ************************************************************************
7227917SReza.Sabdar@Sun.COM * NDMP V4 HANDLERS
7237917SReza.Sabdar@Sun.COM * ************************************************************************
7247917SReza.Sabdar@Sun.COM */
7257917SReza.Sabdar@Sun.COM
7267917SReza.Sabdar@Sun.COM
7277917SReza.Sabdar@Sun.COM /*
7287917SReza.Sabdar@Sun.COM * ndmpd_fhpath_v3_cb
7297917SReza.Sabdar@Sun.COM *
7307917SReza.Sabdar@Sun.COM * Callback function for file history path information
7317917SReza.Sabdar@Sun.COM */
7327917SReza.Sabdar@Sun.COM int
ndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t * cbp,char * path,struct stat64 * stp,u_longlong_t off)7337917SReza.Sabdar@Sun.COM ndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t *cbp, char *path, struct stat64 *stp,
7347917SReza.Sabdar@Sun.COM u_longlong_t off)
7357917SReza.Sabdar@Sun.COM {
7367917SReza.Sabdar@Sun.COM int err;
7377917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
7387917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
7397917SReza.Sabdar@Sun.COM
7407917SReza.Sabdar@Sun.COM if (!cbp) {
7417917SReza.Sabdar@Sun.COM err = -1;
7427917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
7437917SReza.Sabdar@Sun.COM } else if (!cbp->fh_cookie) {
7447917SReza.Sabdar@Sun.COM err = -1;
7457917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cookie is NULL");
7467917SReza.Sabdar@Sun.COM } else if (!path) {
7477917SReza.Sabdar@Sun.COM err = -1;
7487917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "path is NULL");
7497917SReza.Sabdar@Sun.COM } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
7507917SReza.Sabdar@Sun.COM err = -1;
7517917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
7527917SReza.Sabdar@Sun.COM } else
7537917SReza.Sabdar@Sun.COM err = 0;
7547917SReza.Sabdar@Sun.COM
7557917SReza.Sabdar@Sun.COM if (err != 0)
7567917SReza.Sabdar@Sun.COM return (0);
7577917SReza.Sabdar@Sun.COM
7587917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "pname(%s)", path);
7597917SReza.Sabdar@Sun.COM
7607917SReza.Sabdar@Sun.COM err = 0;
7617917SReza.Sabdar@Sun.COM if (NLP_ISSET(nlp, NLPF_FH)) {
7627917SReza.Sabdar@Sun.COM if (!NLP_ISSET(nlp, NLPF_DIRECT)) {
7637917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "DAR NOT SET!");
7647917SReza.Sabdar@Sun.COM off = 0LL;
7657917SReza.Sabdar@Sun.COM }
7667917SReza.Sabdar@Sun.COM
7677917SReza.Sabdar@Sun.COM params = get_params(cbp->fh_cookie);
7687917SReza.Sabdar@Sun.COM if (!params || !params->mp_file_history_path_func) {
7697917SReza.Sabdar@Sun.COM err = -1;
7707917SReza.Sabdar@Sun.COM } else {
771*12186SJanice.Chang@Sun.COM char *p =
772*12186SJanice.Chang@Sun.COM ndmp_get_relative_path(get_backup_path_v3(params),
7737917SReza.Sabdar@Sun.COM path);
7747917SReza.Sabdar@Sun.COM if ((err = ndmpd_api_file_history_file_v3(cbp->
7757917SReza.Sabdar@Sun.COM fh_cookie, p, stp, off)) < 0)
7767917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s\" %d", path, err);
7777917SReza.Sabdar@Sun.COM }
7787917SReza.Sabdar@Sun.COM }
7797917SReza.Sabdar@Sun.COM
7807917SReza.Sabdar@Sun.COM return (err);
7817917SReza.Sabdar@Sun.COM }
7827917SReza.Sabdar@Sun.COM
7837917SReza.Sabdar@Sun.COM
7847917SReza.Sabdar@Sun.COM /*
7857917SReza.Sabdar@Sun.COM * ndmpd_fhdir_v3_cb
7867917SReza.Sabdar@Sun.COM *
7877917SReza.Sabdar@Sun.COM * Callback function for file history dir information
7887917SReza.Sabdar@Sun.COM */
7897917SReza.Sabdar@Sun.COM int
ndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t * cbp,char * dir,struct stat64 * stp)7907917SReza.Sabdar@Sun.COM ndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t *cbp, char *dir, struct stat64 *stp)
7917917SReza.Sabdar@Sun.COM {
7927917SReza.Sabdar@Sun.COM char nm[PATH_MAX+1];
7937917SReza.Sabdar@Sun.COM int nml;
7947917SReza.Sabdar@Sun.COM int err;
7957917SReza.Sabdar@Sun.COM ulong_t ino, pino;
7967917SReza.Sabdar@Sun.COM ulong_t pos;
7977917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
7987917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
7997917SReza.Sabdar@Sun.COM DIR *dirp;
8007917SReza.Sabdar@Sun.COM char dirpath[PATH_MAX];
8017917SReza.Sabdar@Sun.COM
8027917SReza.Sabdar@Sun.COM if (!cbp) {
8037917SReza.Sabdar@Sun.COM err = -1;
8047917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
8057917SReza.Sabdar@Sun.COM } else if (!cbp->fh_cookie) {
8067917SReza.Sabdar@Sun.COM err = -1;
8077917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cookie is NULL");
8087917SReza.Sabdar@Sun.COM } else if (!dir) {
8097917SReza.Sabdar@Sun.COM err = -1;
8107917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "dir is NULL");
8117917SReza.Sabdar@Sun.COM } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
8127917SReza.Sabdar@Sun.COM err = -1;
8137917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
8147917SReza.Sabdar@Sun.COM } else
8157917SReza.Sabdar@Sun.COM err = 0;
8167917SReza.Sabdar@Sun.COM
8177917SReza.Sabdar@Sun.COM if (err != 0)
8187917SReza.Sabdar@Sun.COM return (0);
8197917SReza.Sabdar@Sun.COM
8207917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "d(%s)", dir);
8217917SReza.Sabdar@Sun.COM
8227917SReza.Sabdar@Sun.COM if (!NLP_ISSET(nlp, NLPF_FH))
8237917SReza.Sabdar@Sun.COM return (0);
8247917SReza.Sabdar@Sun.COM
8257917SReza.Sabdar@Sun.COM /*
8267917SReza.Sabdar@Sun.COM * Veritas net_backup accepts only 2 as the inode number of the backup
8277917SReza.Sabdar@Sun.COM * root directory. The other way compares the path against the
8287917SReza.Sabdar@Sun.COM * backup path which is slower.
8297917SReza.Sabdar@Sun.COM */
8307917SReza.Sabdar@Sun.COM if (stp->st_ino == nlp->nlp_bkdirino)
8317917SReza.Sabdar@Sun.COM pino = ROOT_INODE;
8327917SReza.Sabdar@Sun.COM else
8337917SReza.Sabdar@Sun.COM pino = stp->st_ino;
8347917SReza.Sabdar@Sun.COM
8357917SReza.Sabdar@Sun.COM /*
8367917SReza.Sabdar@Sun.COM * There is nothing below this directory to be backed up.
8377917SReza.Sabdar@Sun.COM * If there was, the bit for this directory would have
8387917SReza.Sabdar@Sun.COM * been set. Backup root directory is exception. We
8397917SReza.Sabdar@Sun.COM * always send the dir file history records of it.
8407917SReza.Sabdar@Sun.COM */
8417917SReza.Sabdar@Sun.COM if (pino != ROOT_INODE &&
8427917SReza.Sabdar@Sun.COM !dbm_getone(nlp->nlp_bkmap, (u_longlong_t)stp->st_ino)) {
8437917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nothing below here");
8447917SReza.Sabdar@Sun.COM return (0);
8457917SReza.Sabdar@Sun.COM }
8467917SReza.Sabdar@Sun.COM
8477917SReza.Sabdar@Sun.COM params = nlp->nlp_params;
8487917SReza.Sabdar@Sun.COM if (!params || !params->mp_file_history_dir_func)
8497917SReza.Sabdar@Sun.COM return (-1);
8507917SReza.Sabdar@Sun.COM
8517917SReza.Sabdar@Sun.COM pos = 0;
8527917SReza.Sabdar@Sun.COM err = 0;
8537917SReza.Sabdar@Sun.COM
8547917SReza.Sabdar@Sun.COM dirp = opendir(dir);
8557917SReza.Sabdar@Sun.COM if (dirp == NULL)
8567917SReza.Sabdar@Sun.COM return (0);
8577917SReza.Sabdar@Sun.COM
8587917SReza.Sabdar@Sun.COM do {
8597917SReza.Sabdar@Sun.COM nml = PATH_MAX;
8607917SReza.Sabdar@Sun.COM err = dp_readdir(dirp, &pos, nm, &nml, &ino);
8617917SReza.Sabdar@Sun.COM if (err != 0) {
8627917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
8637917SReza.Sabdar@Sun.COM "%d reading pos %u dir \"%s\"", err, pos, dir);
8647917SReza.Sabdar@Sun.COM break;
8657917SReza.Sabdar@Sun.COM }
8667917SReza.Sabdar@Sun.COM if (nml == 0)
8677917SReza.Sabdar@Sun.COM break;
8687917SReza.Sabdar@Sun.COM nm[nml] = '\0';
8697917SReza.Sabdar@Sun.COM
8707917SReza.Sabdar@Sun.COM if (pino == ROOT_INODE) {
8717917SReza.Sabdar@Sun.COM if (rootfs_dot_or_dotdot(nm))
8727917SReza.Sabdar@Sun.COM ino = ROOT_INODE;
8737917SReza.Sabdar@Sun.COM } else if (ino == nlp->nlp_bkdirino && IS_DOTDOT(nm)) {
8747917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nm(%s): %lu", nm, ino);
8757917SReza.Sabdar@Sun.COM ino = ROOT_INODE;
8767917SReza.Sabdar@Sun.COM }
8777917SReza.Sabdar@Sun.COM
8787917SReza.Sabdar@Sun.COM if (!dbm_getone(nlp->nlp_bkmap, (u_longlong_t)ino))
8797917SReza.Sabdar@Sun.COM continue;
8807917SReza.Sabdar@Sun.COM
8817917SReza.Sabdar@Sun.COM /*
8827917SReza.Sabdar@Sun.COM * If the entry is on exclusion list dont send the info
8837917SReza.Sabdar@Sun.COM */
8847917SReza.Sabdar@Sun.COM if (tlm_is_excluded(dir, nm, ndmp_excl_list)) {
8857917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
8867917SReza.Sabdar@Sun.COM "name \"%s\" skipped", nm == 0 ? "nil" : nm);
8877917SReza.Sabdar@Sun.COM continue;
8887917SReza.Sabdar@Sun.COM }
8897917SReza.Sabdar@Sun.COM
8907917SReza.Sabdar@Sun.COM err = (*params->mp_file_history_dir_func)(cbp->fh_cookie, nm,
8917917SReza.Sabdar@Sun.COM ino, pino);
8927917SReza.Sabdar@Sun.COM if (err < 0) {
8937917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s\": %d", dir, err);
8947917SReza.Sabdar@Sun.COM break;
8957917SReza.Sabdar@Sun.COM }
8967917SReza.Sabdar@Sun.COM
8977917SReza.Sabdar@Sun.COM /*
8987917SReza.Sabdar@Sun.COM * This is a requirement by some DMA's (net_vault) that during
8997917SReza.Sabdar@Sun.COM * the incremental backup, the node info should also be sent
9007917SReza.Sabdar@Sun.COM * along with the dir info for all directories leading to a
9017917SReza.Sabdar@Sun.COM * backed up file.
9027917SReza.Sabdar@Sun.COM */
9037917SReza.Sabdar@Sun.COM if (ndmp_fhinode) {
9047917SReza.Sabdar@Sun.COM struct stat64 ret_attr;
9057917SReza.Sabdar@Sun.COM
9067917SReza.Sabdar@Sun.COM (void) strlcpy(dirpath, dir, PATH_MAX);
9077917SReza.Sabdar@Sun.COM (void) strlcat(dirpath, "/", PATH_MAX);
9087917SReza.Sabdar@Sun.COM (void) strlcat(dirpath, nm, PATH_MAX);
9097917SReza.Sabdar@Sun.COM err = stat64(dirpath, &ret_attr);
9107917SReza.Sabdar@Sun.COM if (err != 0) {
9117917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
9127917SReza.Sabdar@Sun.COM "Error looking up %s", nm);
9137917SReza.Sabdar@Sun.COM break;
9147917SReza.Sabdar@Sun.COM }
9157917SReza.Sabdar@Sun.COM
9167917SReza.Sabdar@Sun.COM if (S_ISDIR(ret_attr.st_mode)) {
9177917SReza.Sabdar@Sun.COM err = (*params->mp_file_history_node_func)(cbp->
9187917SReza.Sabdar@Sun.COM fh_cookie, ino, &ret_attr, 0);
9197917SReza.Sabdar@Sun.COM if (err < 0) {
9207917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s/\": %d",
9217917SReza.Sabdar@Sun.COM dir, err);
9227917SReza.Sabdar@Sun.COM break;
9237917SReza.Sabdar@Sun.COM }
9247917SReza.Sabdar@Sun.COM }
9257917SReza.Sabdar@Sun.COM }
9267917SReza.Sabdar@Sun.COM } while (err == 0);
9277917SReza.Sabdar@Sun.COM
9287917SReza.Sabdar@Sun.COM (void) closedir(dirp);
9297917SReza.Sabdar@Sun.COM return (err);
9307917SReza.Sabdar@Sun.COM }
9317917SReza.Sabdar@Sun.COM
9327917SReza.Sabdar@Sun.COM
9337917SReza.Sabdar@Sun.COM /*
9347917SReza.Sabdar@Sun.COM * ndmpd_fhnode_v3_cb
9357917SReza.Sabdar@Sun.COM *
9367917SReza.Sabdar@Sun.COM * Callback function for file history node information
9377917SReza.Sabdar@Sun.COM */
9387917SReza.Sabdar@Sun.COM int
ndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t * cbp,char * dir,char * file,struct stat64 * stp,u_longlong_t off)9397917SReza.Sabdar@Sun.COM ndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t *cbp, char *dir, char *file,
9407917SReza.Sabdar@Sun.COM struct stat64 *stp, u_longlong_t off)
9417917SReza.Sabdar@Sun.COM {
9427917SReza.Sabdar@Sun.COM int err;
9437917SReza.Sabdar@Sun.COM ulong_t ino;
9447917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
9457917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
9467917SReza.Sabdar@Sun.COM
9477917SReza.Sabdar@Sun.COM if (!cbp) {
9487917SReza.Sabdar@Sun.COM err = -1;
9497917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
9507917SReza.Sabdar@Sun.COM } else if (!cbp->fh_cookie) {
9517917SReza.Sabdar@Sun.COM err = -1;
9527917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cookie is NULL");
9537917SReza.Sabdar@Sun.COM } else if (!dir) {
9547917SReza.Sabdar@Sun.COM err = -1;
9557917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "dir is NULL");
9567917SReza.Sabdar@Sun.COM } else if (!file) {
9577917SReza.Sabdar@Sun.COM err = -1;
9587917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "file is NULL");
9597917SReza.Sabdar@Sun.COM } else if (!stp) {
9607917SReza.Sabdar@Sun.COM err = -1;
9617917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "stp is NULL");
9627917SReza.Sabdar@Sun.COM } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
9637917SReza.Sabdar@Sun.COM err = -1;
9647917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
9657917SReza.Sabdar@Sun.COM } else {
9667917SReza.Sabdar@Sun.COM err = 0;
9677917SReza.Sabdar@Sun.COM }
9687917SReza.Sabdar@Sun.COM
9697917SReza.Sabdar@Sun.COM if (err != 0)
9707917SReza.Sabdar@Sun.COM return (0);
9717917SReza.Sabdar@Sun.COM
9727917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "d(%s), f(%s)", dir, file);
9737917SReza.Sabdar@Sun.COM
9747917SReza.Sabdar@Sun.COM err = 0;
9757917SReza.Sabdar@Sun.COM if (NLP_ISSET(nlp, NLPF_FH)) {
9767917SReza.Sabdar@Sun.COM if (!NLP_ISSET(nlp, NLPF_DIRECT))
9777917SReza.Sabdar@Sun.COM off = 0LL;
9787917SReza.Sabdar@Sun.COM if (stp->st_ino == nlp->nlp_bkdirino) {
9797917SReza.Sabdar@Sun.COM ino = ROOT_INODE;
9807917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
9817917SReza.Sabdar@Sun.COM "bkroot %d -> %d", stp->st_ino, ROOT_INODE);
9827917SReza.Sabdar@Sun.COM } else
9837917SReza.Sabdar@Sun.COM ino = stp->st_ino;
9847917SReza.Sabdar@Sun.COM
9857917SReza.Sabdar@Sun.COM params = nlp->nlp_params;
9867917SReza.Sabdar@Sun.COM if (!params || !params->mp_file_history_node_func)
9877917SReza.Sabdar@Sun.COM err = -1;
9887917SReza.Sabdar@Sun.COM else if ((err = (*params->mp_file_history_node_func)(cbp->
9897917SReza.Sabdar@Sun.COM fh_cookie, ino, stp, off)) < 0)
9907917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s/%s\" %d", dir, file, err);
9917917SReza.Sabdar@Sun.COM }
9927917SReza.Sabdar@Sun.COM
9937917SReza.Sabdar@Sun.COM return (err);
9947917SReza.Sabdar@Sun.COM }
9957917SReza.Sabdar@Sun.COM
9967917SReza.Sabdar@Sun.COM
9977917SReza.Sabdar@Sun.COM /*
9987917SReza.Sabdar@Sun.COM * ndmp_send_recovery_stat_v3
9997917SReza.Sabdar@Sun.COM *
10007917SReza.Sabdar@Sun.COM * Send the recovery status to the DMA
10017917SReza.Sabdar@Sun.COM */
10027917SReza.Sabdar@Sun.COM int
ndmp_send_recovery_stat_v3(ndmpd_module_params_t * params,ndmp_lbr_params_t * nlp,int idx,int stat)10037917SReza.Sabdar@Sun.COM ndmp_send_recovery_stat_v3(ndmpd_module_params_t *params,
10047917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp, int idx, int stat)
10057917SReza.Sabdar@Sun.COM {
10067917SReza.Sabdar@Sun.COM int rv;
10077917SReza.Sabdar@Sun.COM mem_ndmp_name_v3_t *ep;
10087917SReza.Sabdar@Sun.COM
10097917SReza.Sabdar@Sun.COM rv = -1;
10107917SReza.Sabdar@Sun.COM if (!params) {
10117917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "params == NULL");
10127917SReza.Sabdar@Sun.COM } else if (!params->mp_file_recovered_func) {
10137917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "paramsfile_recovered_func == NULL");
10147917SReza.Sabdar@Sun.COM } else if (!nlp) {
10157917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp == NULL");
10167917SReza.Sabdar@Sun.COM } else if (idx < 0) {
10177917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "idx(%d) < 0", idx);
10187917SReza.Sabdar@Sun.COM } else if (!(ep = (mem_ndmp_name_v3_t *)MOD_GETNAME(params, idx))) {
10197917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlist[%d] == NULL", idx);
10207917SReza.Sabdar@Sun.COM } else if (!ep->nm3_opath) {
10217917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlist[%d].nm3_opath == NULL", idx);
10227917SReza.Sabdar@Sun.COM } else {
10237917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
10247917SReza.Sabdar@Sun.COM "ep[%d].nm3_opath \"%s\"", idx, ep->nm3_opath);
10257917SReza.Sabdar@Sun.COM rv = MOD_FILERECOVERD(params, ep->nm3_opath, stat);
10267917SReza.Sabdar@Sun.COM }
10277917SReza.Sabdar@Sun.COM
10287917SReza.Sabdar@Sun.COM return (rv);
10297917SReza.Sabdar@Sun.COM }
10307917SReza.Sabdar@Sun.COM
10317917SReza.Sabdar@Sun.COM
10327917SReza.Sabdar@Sun.COM /*
10337917SReza.Sabdar@Sun.COM * ndmpd_path_restored_v3
10347917SReza.Sabdar@Sun.COM *
10357917SReza.Sabdar@Sun.COM * Send the recovery status and the information for the restored
10367917SReza.Sabdar@Sun.COM * path.
10377917SReza.Sabdar@Sun.COM */
10387917SReza.Sabdar@Sun.COM /*ARGSUSED*/
10397917SReza.Sabdar@Sun.COM int
ndmpd_path_restored_v3(lbr_fhlog_call_backs_t * cbp,char * name,struct stat64 * st,u_longlong_t ll_idx)10407917SReza.Sabdar@Sun.COM ndmpd_path_restored_v3(lbr_fhlog_call_backs_t *cbp, char *name,
10417917SReza.Sabdar@Sun.COM struct stat64 *st, u_longlong_t ll_idx)
10427917SReza.Sabdar@Sun.COM {
10437917SReza.Sabdar@Sun.COM int rv;
10447917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
10457917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
10467917SReza.Sabdar@Sun.COM int idx = (int)ll_idx;
10477917SReza.Sabdar@Sun.COM
10487917SReza.Sabdar@Sun.COM if (!cbp) {
10497917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
10507917SReza.Sabdar@Sun.COM return (-1);
10517917SReza.Sabdar@Sun.COM }
10527917SReza.Sabdar@Sun.COM if (!name) {
10537917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "name is NULL");
10547917SReza.Sabdar@Sun.COM return (-1);
10557917SReza.Sabdar@Sun.COM }
10567917SReza.Sabdar@Sun.COM
10577917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "name: \"%s\", idx: %d", name, idx);
10587917SReza.Sabdar@Sun.COM
10597917SReza.Sabdar@Sun.COM nlp = ndmp_get_nlp(cbp->fh_cookie);
10607917SReza.Sabdar@Sun.COM if (!nlp) {
10617917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
10627917SReza.Sabdar@Sun.COM return (-1);
10637917SReza.Sabdar@Sun.COM }
10647917SReza.Sabdar@Sun.COM if (idx < 0 || idx >= nlp->nlp_nfiles) {
10657917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "Invalid idx: %d", idx);
10667917SReza.Sabdar@Sun.COM return (-1);
10677917SReza.Sabdar@Sun.COM }
10687917SReza.Sabdar@Sun.COM params = nlp->nlp_params;
10697917SReza.Sabdar@Sun.COM if (!params || !params->mp_file_recovered_func)
10707917SReza.Sabdar@Sun.COM return (-1);
10717917SReza.Sabdar@Sun.COM
10727917SReza.Sabdar@Sun.COM if (nlp->nlp_lastidx == -1)
10737917SReza.Sabdar@Sun.COM nlp->nlp_lastidx = idx;
10747917SReza.Sabdar@Sun.COM
10757917SReza.Sabdar@Sun.COM rv = 0;
10767917SReza.Sabdar@Sun.COM (void) bm_setone(nlp->nlp_rsbm, (u_longlong_t)idx);
10777917SReza.Sabdar@Sun.COM /*
10787917SReza.Sabdar@Sun.COM * Note: We should set the nm3_err here.
10797917SReza.Sabdar@Sun.COM */
10807917SReza.Sabdar@Sun.COM if (nlp->nlp_lastidx != idx) {
10817917SReza.Sabdar@Sun.COM rv = ndmp_send_recovery_stat_v3(params, nlp, nlp->nlp_lastidx,
10827917SReza.Sabdar@Sun.COM 0);
10837917SReza.Sabdar@Sun.COM nlp->nlp_lastidx = idx;
10847917SReza.Sabdar@Sun.COM }
10857917SReza.Sabdar@Sun.COM
10867917SReza.Sabdar@Sun.COM return (rv);
10877917SReza.Sabdar@Sun.COM }
10887917SReza.Sabdar@Sun.COM
10897917SReza.Sabdar@Sun.COM
10907917SReza.Sabdar@Sun.COM
10917917SReza.Sabdar@Sun.COM /*
10927917SReza.Sabdar@Sun.COM * ndmpd_file_history_init
10937917SReza.Sabdar@Sun.COM *
10947917SReza.Sabdar@Sun.COM * Initialize file history variables.
10957917SReza.Sabdar@Sun.COM * Note that the entry and name buffers are not allocated here.
10967917SReza.Sabdar@Sun.COM * Since it is not know if the backup module will be sending file history
10977917SReza.Sabdar@Sun.COM * data or what kind of data (path or dir/node), the entry and name
10987917SReza.Sabdar@Sun.COM * buffers are not allocated until the first call to one of the file history
10997917SReza.Sabdar@Sun.COM * entry functions is made. This way resources are only allocated as
11007917SReza.Sabdar@Sun.COM * needed.
11017917SReza.Sabdar@Sun.COM *
11027917SReza.Sabdar@Sun.COM * Parameters:
11037917SReza.Sabdar@Sun.COM * session (input) - session pointer.
11047917SReza.Sabdar@Sun.COM *
11057917SReza.Sabdar@Sun.COM * Returns:
11067917SReza.Sabdar@Sun.COM * void
11077917SReza.Sabdar@Sun.COM */
11087917SReza.Sabdar@Sun.COM void
ndmpd_file_history_init(ndmpd_session_t * session)11097917SReza.Sabdar@Sun.COM ndmpd_file_history_init(ndmpd_session_t *session)
11107917SReza.Sabdar@Sun.COM {
11117917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_entries = 0;
11127917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_entries = 0;
11137917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_entries = 0;
11147917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf = 0;
11157917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf = 0;
11167917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_index = 0;
11177917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_index = 0;
11187917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_index = 0;
11197917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf_index = 0;
11207917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf_index = 0;
11217917SReza.Sabdar@Sun.COM
11227917SReza.Sabdar@Sun.COM /*
11237917SReza.Sabdar@Sun.COM * V3.
11247917SReza.Sabdar@Sun.COM */
11257917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_files = 0;
11267917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dirs = 0;
11277917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_nodes = 0;
11287917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_names = 0;
11297917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_names = 0;
11307917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_stats = 0;
11317917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_stats = 0;
11327917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf = 0;
11337917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf = 0;
11347917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_index = 0;
11357917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_index = 0;
11367917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_index = 0;
11377917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf_index = 0;
11387917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf_index = 0;
11397917SReza.Sabdar@Sun.COM }
11407917SReza.Sabdar@Sun.COM
11417917SReza.Sabdar@Sun.COM
11427917SReza.Sabdar@Sun.COM /*
11437917SReza.Sabdar@Sun.COM * ndmpd_file_history_cleanup_v2
11447917SReza.Sabdar@Sun.COM *
11457917SReza.Sabdar@Sun.COM * Send (or discard) any buffered file history entries.
11467917SReza.Sabdar@Sun.COM *
11477917SReza.Sabdar@Sun.COM * Parameters:
11487917SReza.Sabdar@Sun.COM * session (input) - session pointer.
11497917SReza.Sabdar@Sun.COM * send_flag (input) - if TRUE buffered entries are sent.
11507917SReza.Sabdar@Sun.COM * if FALSE buffered entries are discarded.
11517917SReza.Sabdar@Sun.COM *
11527917SReza.Sabdar@Sun.COM * Returns:
11537917SReza.Sabdar@Sun.COM * void
11547917SReza.Sabdar@Sun.COM */
11557917SReza.Sabdar@Sun.COM static void
ndmpd_file_history_cleanup_v2(ndmpd_session_t * session,boolean_t send_flag)11567917SReza.Sabdar@Sun.COM ndmpd_file_history_cleanup_v2(ndmpd_session_t *session, boolean_t send_flag)
11577917SReza.Sabdar@Sun.COM {
11587917SReza.Sabdar@Sun.COM if (send_flag == TRUE) {
11597917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_path_v2(session, 0, 0, 0);
11607917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_dir_v2(session, 0, 0, 0);
11617917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_node_v2(session, 0, 0, 0);
11627917SReza.Sabdar@Sun.COM }
11637917SReza.Sabdar@Sun.COM
11647917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_path_entries != 0) {
11657917SReza.Sabdar@Sun.COM free(session->ns_fh.fh_path_entries);
11667917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_entries = 0;
11677917SReza.Sabdar@Sun.COM }
11687917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_dir_entries != 0) {
11697917SReza.Sabdar@Sun.COM free(session->ns_fh.fh_dir_entries);
11707917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_entries = 0;
11717917SReza.Sabdar@Sun.COM }
11727917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_node_entries != 0) {
11737917SReza.Sabdar@Sun.COM free(session->ns_fh.fh_node_entries);
11747917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_entries = 0;
11757917SReza.Sabdar@Sun.COM }
11767917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_path_name_buf != 0) {
11777917SReza.Sabdar@Sun.COM free(session->ns_fh.fh_path_name_buf);
11787917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf = 0;
11797917SReza.Sabdar@Sun.COM }
11807917SReza.Sabdar@Sun.COM if (session->ns_fh.fh_dir_name_buf != 0) {
11817917SReza.Sabdar@Sun.COM free(session->ns_fh.fh_dir_name_buf);
11827917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf = 0;
11837917SReza.Sabdar@Sun.COM }
11847917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_index = 0;
11857917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_index = 0;
11867917SReza.Sabdar@Sun.COM session->ns_fh.fh_node_index = 0;
11877917SReza.Sabdar@Sun.COM session->ns_fh.fh_path_name_buf_index = 0;
11887917SReza.Sabdar@Sun.COM session->ns_fh.fh_dir_name_buf_index = 0;
11897917SReza.Sabdar@Sun.COM }
11907917SReza.Sabdar@Sun.COM
11917917SReza.Sabdar@Sun.COM
11927917SReza.Sabdar@Sun.COM /*
11937917SReza.Sabdar@Sun.COM * ndmpd_file_history_cleanup_v3
11947917SReza.Sabdar@Sun.COM *
11957917SReza.Sabdar@Sun.COM * Send (or discard) any buffered file history entries.
11967917SReza.Sabdar@Sun.COM *
11977917SReza.Sabdar@Sun.COM * Parameters:
11987917SReza.Sabdar@Sun.COM * session (input) - session pointer.
11997917SReza.Sabdar@Sun.COM * send_flag (input) - if TRUE buffered entries are sent.
12007917SReza.Sabdar@Sun.COM * if FALSE buffered entries are discarded.
12017917SReza.Sabdar@Sun.COM *
12027917SReza.Sabdar@Sun.COM * Returns:
12037917SReza.Sabdar@Sun.COM * void
12047917SReza.Sabdar@Sun.COM */
12057917SReza.Sabdar@Sun.COM static void
ndmpd_file_history_cleanup_v3(ndmpd_session_t * session,boolean_t send_flag)12067917SReza.Sabdar@Sun.COM ndmpd_file_history_cleanup_v3(ndmpd_session_t *session, boolean_t send_flag)
12077917SReza.Sabdar@Sun.COM {
12087917SReza.Sabdar@Sun.COM if (send_flag == TRUE) {
12097917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_file_v3(session, 0, 0, 0);
12107917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_dir_v3(session, 0, 0, 0);
12117917SReza.Sabdar@Sun.COM (void) ndmpd_api_file_history_node_v3(session, 0, 0, 0);
12127917SReza.Sabdar@Sun.COM }
12137917SReza.Sabdar@Sun.COM
12147917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_files != 0) {
12157917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_files);
12167917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_files = 0;
12177917SReza.Sabdar@Sun.COM }
12187917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dirs != 0) {
12197917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_dirs);
12207917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dirs = 0;
12217917SReza.Sabdar@Sun.COM }
12227917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_nodes != 0) {
12237917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_nodes);
12247917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_nodes = 0;
12257917SReza.Sabdar@Sun.COM }
12267917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_names != 0) {
12277917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_file_names);
12287917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_names = 0;
12297917SReza.Sabdar@Sun.COM }
12307917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dir_names != 0) {
12317917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_dir_names);
12327917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_names = 0;
12337917SReza.Sabdar@Sun.COM }
12347917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_stats != 0) {
12357917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_file_stats);
12367917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_stats = 0;
12377917SReza.Sabdar@Sun.COM }
12387917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_node_stats != 0) {
12397917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_node_stats);
12407917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_stats = 0;
12417917SReza.Sabdar@Sun.COM }
12427917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_file_name_buf != 0) {
12437917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_file_name_buf);
12447917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf = 0;
12457917SReza.Sabdar@Sun.COM }
12467917SReza.Sabdar@Sun.COM if (session->ns_fh_v3.fh_dir_name_buf != 0) {
12477917SReza.Sabdar@Sun.COM free(session->ns_fh_v3.fh_dir_name_buf);
12487917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf = 0;
12497917SReza.Sabdar@Sun.COM }
12507917SReza.Sabdar@Sun.COM
12517917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_index = 0;
12527917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_index = 0;
12537917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_node_index = 0;
12547917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_file_name_buf_index = 0;
12557917SReza.Sabdar@Sun.COM session->ns_fh_v3.fh_dir_name_buf_index = 0;
12567917SReza.Sabdar@Sun.COM }
12577917SReza.Sabdar@Sun.COM
12587917SReza.Sabdar@Sun.COM
12597917SReza.Sabdar@Sun.COM /*
12607917SReza.Sabdar@Sun.COM * ndmpd_file_history_cleanup
12617917SReza.Sabdar@Sun.COM *
12627917SReza.Sabdar@Sun.COM * Send any pending posts and clean up
12637917SReza.Sabdar@Sun.COM */
12647917SReza.Sabdar@Sun.COM void
ndmpd_file_history_cleanup(ndmpd_session_t * session,boolean_t send_flag)12657917SReza.Sabdar@Sun.COM ndmpd_file_history_cleanup(ndmpd_session_t *session, boolean_t send_flag)
12667917SReza.Sabdar@Sun.COM {
12677917SReza.Sabdar@Sun.COM switch (session->ns_protocol_version) {
12687917SReza.Sabdar@Sun.COM case 1:
12697917SReza.Sabdar@Sun.COM case 2:
12707917SReza.Sabdar@Sun.COM ndmpd_file_history_cleanup_v2(session, send_flag);
12717917SReza.Sabdar@Sun.COM break;
12727917SReza.Sabdar@Sun.COM case 3:
12737917SReza.Sabdar@Sun.COM case 4:
12747917SReza.Sabdar@Sun.COM ndmpd_file_history_cleanup_v3(session, send_flag);
12757917SReza.Sabdar@Sun.COM break;
12767917SReza.Sabdar@Sun.COM default:
12777917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "Unknown version %d",
12787917SReza.Sabdar@Sun.COM session->ns_protocol_version);
12797917SReza.Sabdar@Sun.COM }
12807917SReza.Sabdar@Sun.COM }
12817917SReza.Sabdar@Sun.COM
12827917SReza.Sabdar@Sun.COM /*
12837917SReza.Sabdar@Sun.COM * get_params
12847917SReza.Sabdar@Sun.COM *
12857917SReza.Sabdar@Sun.COM * Callbacks from LBR.
12867917SReza.Sabdar@Sun.COM */
12877917SReza.Sabdar@Sun.COM static ndmpd_module_params_t *
get_params(void * cookie)12887917SReza.Sabdar@Sun.COM get_params(void *cookie)
12897917SReza.Sabdar@Sun.COM {
12907917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
12917917SReza.Sabdar@Sun.COM
12927917SReza.Sabdar@Sun.COM if ((nlp = ndmp_get_nlp(cookie)) == NULL)
12937917SReza.Sabdar@Sun.COM return (NULL);
12947917SReza.Sabdar@Sun.COM
12957917SReza.Sabdar@Sun.COM return (nlp->nlp_params);
12967917SReza.Sabdar@Sun.COM }
12977917SReza.Sabdar@Sun.COM
12987917SReza.Sabdar@Sun.COM
12997917SReza.Sabdar@Sun.COM /*
13007917SReza.Sabdar@Sun.COM * fh_requested
13017917SReza.Sabdar@Sun.COM *
13027917SReza.Sabdar@Sun.COM * Check in LB parameters if file history is requested
13037917SReza.Sabdar@Sun.COM */
13047917SReza.Sabdar@Sun.COM static boolean_t
fh_requested(void * cookie)13057917SReza.Sabdar@Sun.COM fh_requested(void *cookie)
13067917SReza.Sabdar@Sun.COM {
13077917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
13087917SReza.Sabdar@Sun.COM
13097917SReza.Sabdar@Sun.COM if ((nlp = ndmp_get_nlp(cookie)) == NULL) {
13107917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
13117917SReza.Sabdar@Sun.COM return (FALSE);
13127917SReza.Sabdar@Sun.COM }
13137917SReza.Sabdar@Sun.COM
13147917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp_fh %c", NDMP_YORN(NLP_ISSET(nlp, NLPF_FH)));
13157917SReza.Sabdar@Sun.COM
13167917SReza.Sabdar@Sun.COM return (NLP_ISSET(nlp, NLPF_FH));
13177917SReza.Sabdar@Sun.COM }
13187917SReza.Sabdar@Sun.COM
13197917SReza.Sabdar@Sun.COM
13207917SReza.Sabdar@Sun.COM /*
13217917SReza.Sabdar@Sun.COM * ndmpd_file_history_path
13227917SReza.Sabdar@Sun.COM *
13237917SReza.Sabdar@Sun.COM * Generates file history path information posts
13247917SReza.Sabdar@Sun.COM *
13257917SReza.Sabdar@Sun.COM * Note:
13267917SReza.Sabdar@Sun.COM * Action must be determined when the 'dir' and/or 'file'
13277917SReza.Sabdar@Sun.COM * arguments of ndmpd_file_history_path(), ndmpd_file_history_dir(), and
13287917SReza.Sabdar@Sun.COM * ndmpd_file_history_node() are NULL.
13297917SReza.Sabdar@Sun.COM */
13307917SReza.Sabdar@Sun.COM /*ARGSUSED*/
13317917SReza.Sabdar@Sun.COM int
ndmpd_file_history_path(lbr_fhlog_call_backs_t * cbp,char * path,struct stat64 * stp,u_longlong_t off)13327917SReza.Sabdar@Sun.COM ndmpd_file_history_path(lbr_fhlog_call_backs_t *cbp, char *path,
13337917SReza.Sabdar@Sun.COM struct stat64 *stp, u_longlong_t off)
13347917SReza.Sabdar@Sun.COM {
13357917SReza.Sabdar@Sun.COM int err;
13367917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
13377917SReza.Sabdar@Sun.COM
13387917SReza.Sabdar@Sun.COM if (!cbp) {
13397917SReza.Sabdar@Sun.COM err = -1;
13407917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
13417917SReza.Sabdar@Sun.COM } else if (!cbp->fh_cookie) {
13427917SReza.Sabdar@Sun.COM err = -1;
13437917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cookie is NULL");
13447917SReza.Sabdar@Sun.COM } else if (!path) {
13457917SReza.Sabdar@Sun.COM err = -1;
13467917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "path is NULL");
13477917SReza.Sabdar@Sun.COM } else if (!stp) {
13487917SReza.Sabdar@Sun.COM err = -1;
13497917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "stp is NULL");
13507917SReza.Sabdar@Sun.COM } else
13517917SReza.Sabdar@Sun.COM err = 0;
13527917SReza.Sabdar@Sun.COM
13537917SReza.Sabdar@Sun.COM if (err != 0)
13547917SReza.Sabdar@Sun.COM return (0);
13557917SReza.Sabdar@Sun.COM
13567917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "path: \"%s\"", path);
13577917SReza.Sabdar@Sun.COM
13587917SReza.Sabdar@Sun.COM err = 0;
13597917SReza.Sabdar@Sun.COM if (fh_requested(cbp->fh_cookie)) {
13607917SReza.Sabdar@Sun.COM params = get_params(cbp->fh_cookie);
13617917SReza.Sabdar@Sun.COM if (params == NULL || params->mp_file_history_path_func == NULL)
13627917SReza.Sabdar@Sun.COM err = -1;
13637917SReza.Sabdar@Sun.COM else if ((err = (*params->mp_file_history_path_func)(cbp->
13647917SReza.Sabdar@Sun.COM fh_cookie, path, stp, 0)) < 0)
13657917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s\": %d", path, err);
13667917SReza.Sabdar@Sun.COM }
13677917SReza.Sabdar@Sun.COM
13687917SReza.Sabdar@Sun.COM return (err);
13697917SReza.Sabdar@Sun.COM }
13707917SReza.Sabdar@Sun.COM
13717917SReza.Sabdar@Sun.COM
13727917SReza.Sabdar@Sun.COM /*
13737917SReza.Sabdar@Sun.COM * ndmpd_file_history_dir
13747917SReza.Sabdar@Sun.COM *
13757917SReza.Sabdar@Sun.COM * Generate file history directory information posts
13767917SReza.Sabdar@Sun.COM */
13777917SReza.Sabdar@Sun.COM int
ndmpd_file_history_dir(lbr_fhlog_call_backs_t * cbp,char * dir,struct stat64 * stp)13787917SReza.Sabdar@Sun.COM ndmpd_file_history_dir(lbr_fhlog_call_backs_t *cbp, char *dir,
13797917SReza.Sabdar@Sun.COM struct stat64 *stp)
13807917SReza.Sabdar@Sun.COM {
13817917SReza.Sabdar@Sun.COM char nm[PATH_MAX+1];
13827917SReza.Sabdar@Sun.COM int nml;
13837917SReza.Sabdar@Sun.COM int err;
13847917SReza.Sabdar@Sun.COM ulong_t ino, pino;
13857917SReza.Sabdar@Sun.COM ulong_t pos;
13867917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
13877917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
13887917SReza.Sabdar@Sun.COM DIR *dirp;
13897917SReza.Sabdar@Sun.COM char dirpath[PATH_MAX];
13907917SReza.Sabdar@Sun.COM
13917917SReza.Sabdar@Sun.COM if (!cbp) {
13927917SReza.Sabdar@Sun.COM err = -1;
13937917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
13947917SReza.Sabdar@Sun.COM } else if (!cbp->fh_cookie) {
13957917SReza.Sabdar@Sun.COM err = -1;
13967917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cookie is NULL");
13977917SReza.Sabdar@Sun.COM } else if (!dir) {
13987917SReza.Sabdar@Sun.COM err = -1;
13997917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "dir is NULL");
14007917SReza.Sabdar@Sun.COM } else if (!stp) {
14017917SReza.Sabdar@Sun.COM err = -1;
14027917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "stp is NULL");
14037917SReza.Sabdar@Sun.COM } if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
14047917SReza.Sabdar@Sun.COM err = -1;
14057917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
14067917SReza.Sabdar@Sun.COM } else
14077917SReza.Sabdar@Sun.COM err = 0;
14087917SReza.Sabdar@Sun.COM
14097917SReza.Sabdar@Sun.COM if (err != 0)
14107917SReza.Sabdar@Sun.COM return (0);
14117917SReza.Sabdar@Sun.COM
14127917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "dir: \"%s\"", dir);
14137917SReza.Sabdar@Sun.COM
14147917SReza.Sabdar@Sun.COM if (!fh_requested(cbp->fh_cookie))
14157917SReza.Sabdar@Sun.COM return (0);
14167917SReza.Sabdar@Sun.COM
14177917SReza.Sabdar@Sun.COM /*
14187917SReza.Sabdar@Sun.COM * Veritas net_backup accepts only 2 as the inode number of the backup
14197917SReza.Sabdar@Sun.COM * root directory. The other way compares the path against the
14207917SReza.Sabdar@Sun.COM * backup path which is slower.
14217917SReza.Sabdar@Sun.COM */
14227917SReza.Sabdar@Sun.COM if (stp->st_ino == nlp->nlp_bkdirino)
14237917SReza.Sabdar@Sun.COM pino = ROOT_INODE;
14247917SReza.Sabdar@Sun.COM else
14257917SReza.Sabdar@Sun.COM pino = stp->st_ino;
14267917SReza.Sabdar@Sun.COM
14277917SReza.Sabdar@Sun.COM /*
14287917SReza.Sabdar@Sun.COM * There is nothing below this directory to be backed up.
14297917SReza.Sabdar@Sun.COM * If there was, the bit for this directory would have
14307917SReza.Sabdar@Sun.COM * been set. Backup root directory is exception. We
14317917SReza.Sabdar@Sun.COM * always send the dir file history records of it.
14327917SReza.Sabdar@Sun.COM */
14337917SReza.Sabdar@Sun.COM if (pino != ROOT_INODE &&
14347917SReza.Sabdar@Sun.COM !dbm_getone(nlp->nlp_bkmap, (u_longlong_t)stp->st_ino)) {
14357917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nothing below here");
14367917SReza.Sabdar@Sun.COM return (0);
14377917SReza.Sabdar@Sun.COM }
14387917SReza.Sabdar@Sun.COM
14397917SReza.Sabdar@Sun.COM params = get_params(cbp->fh_cookie);
14407917SReza.Sabdar@Sun.COM if (params == NULL || params->mp_file_history_dir_func == NULL) {
14417917SReza.Sabdar@Sun.COM return (0);
14427917SReza.Sabdar@Sun.COM }
14437917SReza.Sabdar@Sun.COM
14447917SReza.Sabdar@Sun.COM pos = 0;
14457917SReza.Sabdar@Sun.COM err = 0;
14467917SReza.Sabdar@Sun.COM
14477917SReza.Sabdar@Sun.COM dirp = opendir(dir);
14487917SReza.Sabdar@Sun.COM if (dirp == NULL)
14497917SReza.Sabdar@Sun.COM return (0);
14507917SReza.Sabdar@Sun.COM
14517917SReza.Sabdar@Sun.COM do {
14527917SReza.Sabdar@Sun.COM nml = PATH_MAX;
14537917SReza.Sabdar@Sun.COM err = dp_readdir(dirp, &pos, nm, &nml, &ino);
14547917SReza.Sabdar@Sun.COM if (err != 0) {
14557917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
14567917SReza.Sabdar@Sun.COM "%d reading pos %u dir \"%s\"", err, pos, dir);
14577917SReza.Sabdar@Sun.COM break;
14587917SReza.Sabdar@Sun.COM }
14597917SReza.Sabdar@Sun.COM if (nml == 0)
14607917SReza.Sabdar@Sun.COM break;
14617917SReza.Sabdar@Sun.COM nm[nml] = '\0';
14627917SReza.Sabdar@Sun.COM
14637917SReza.Sabdar@Sun.COM if (pino == ROOT_INODE) {
14647917SReza.Sabdar@Sun.COM if (rootfs_dot_or_dotdot(nm))
14657917SReza.Sabdar@Sun.COM ino = ROOT_INODE;
14667917SReza.Sabdar@Sun.COM } else if (ino == nlp->nlp_bkdirino && IS_DOTDOT(nm)) {
14677917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nm(%s): %lu", nm, ino);
14687917SReza.Sabdar@Sun.COM ino = ROOT_INODE;
14697917SReza.Sabdar@Sun.COM }
14707917SReza.Sabdar@Sun.COM
14717917SReza.Sabdar@Sun.COM if (!dbm_getone(nlp->nlp_bkmap, (u_longlong_t)ino))
14727917SReza.Sabdar@Sun.COM continue;
14737917SReza.Sabdar@Sun.COM
14747917SReza.Sabdar@Sun.COM err = (*params->mp_file_history_dir_func)(cbp->fh_cookie, nm,
14757917SReza.Sabdar@Sun.COM ino, pino);
14767917SReza.Sabdar@Sun.COM if (err < 0) {
14777917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s/%s\": %d", dir, nm, err);
14787917SReza.Sabdar@Sun.COM break;
14797917SReza.Sabdar@Sun.COM }
14807917SReza.Sabdar@Sun.COM
14817917SReza.Sabdar@Sun.COM /*
14827917SReza.Sabdar@Sun.COM * This is a requirement by some DMA's (net_vault) that during
14837917SReza.Sabdar@Sun.COM * the incremental backup, the node info should also be sent
14847917SReza.Sabdar@Sun.COM * along with the dir info for all directories leading to a
14857917SReza.Sabdar@Sun.COM * backed up file.
14867917SReza.Sabdar@Sun.COM */
14877917SReza.Sabdar@Sun.COM if (ndmp_fhinode) {
14887917SReza.Sabdar@Sun.COM struct stat64 ret_attr;
14897917SReza.Sabdar@Sun.COM
14907917SReza.Sabdar@Sun.COM (void) strlcpy(dirpath, dir, PATH_MAX);
14917917SReza.Sabdar@Sun.COM (void) strlcat(dirpath, "/", PATH_MAX);
14927917SReza.Sabdar@Sun.COM (void) strlcat(dirpath, nm, PATH_MAX);
14937917SReza.Sabdar@Sun.COM err = stat64(dirpath, &ret_attr);
14947917SReza.Sabdar@Sun.COM if (err != 0) {
14957917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
14967917SReza.Sabdar@Sun.COM "Error looking up %s", nm);
14977917SReza.Sabdar@Sun.COM break;
14987917SReza.Sabdar@Sun.COM }
14997917SReza.Sabdar@Sun.COM
15007917SReza.Sabdar@Sun.COM if (S_ISDIR(ret_attr.st_mode)) {
15017917SReza.Sabdar@Sun.COM err = (*params->mp_file_history_node_func)(cbp->
15027917SReza.Sabdar@Sun.COM fh_cookie, ino, &ret_attr, 0);
15037917SReza.Sabdar@Sun.COM if (err < 0) {
15047917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s/\": %d",
15057917SReza.Sabdar@Sun.COM dir, err);
15067917SReza.Sabdar@Sun.COM break;
15077917SReza.Sabdar@Sun.COM }
15087917SReza.Sabdar@Sun.COM }
15097917SReza.Sabdar@Sun.COM }
15107917SReza.Sabdar@Sun.COM } while (err == 0);
15117917SReza.Sabdar@Sun.COM
15127917SReza.Sabdar@Sun.COM (void) closedir(dirp);
15137917SReza.Sabdar@Sun.COM return (err);
15147917SReza.Sabdar@Sun.COM }
15157917SReza.Sabdar@Sun.COM
15167917SReza.Sabdar@Sun.COM
15177917SReza.Sabdar@Sun.COM /*
15187917SReza.Sabdar@Sun.COM * ndmpd_file_history_node
15197917SReza.Sabdar@Sun.COM *
15207917SReza.Sabdar@Sun.COM * Generate file history node information posts
15217917SReza.Sabdar@Sun.COM */
15227917SReza.Sabdar@Sun.COM /*ARGSUSED*/
15237917SReza.Sabdar@Sun.COM int
ndmpd_file_history_node(lbr_fhlog_call_backs_t * cbp,char * dir,char * file,struct stat64 * stp,u_longlong_t off)15247917SReza.Sabdar@Sun.COM ndmpd_file_history_node(lbr_fhlog_call_backs_t *cbp, char *dir, char *file,
15257917SReza.Sabdar@Sun.COM struct stat64 *stp, u_longlong_t off)
15267917SReza.Sabdar@Sun.COM {
15277917SReza.Sabdar@Sun.COM int err;
15287917SReza.Sabdar@Sun.COM ulong_t ino;
15297917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
15307917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
15317917SReza.Sabdar@Sun.COM
15327917SReza.Sabdar@Sun.COM if (!cbp) {
15337917SReza.Sabdar@Sun.COM err = -1;
15347917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
15357917SReza.Sabdar@Sun.COM } else if (!cbp->fh_cookie) {
15367917SReza.Sabdar@Sun.COM err = -1;
15377917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cookie is NULL");
15387917SReza.Sabdar@Sun.COM } else if (!dir) {
15397917SReza.Sabdar@Sun.COM err = -1;
15407917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "dir is NULL");
15417917SReza.Sabdar@Sun.COM } else if (!file) {
15427917SReza.Sabdar@Sun.COM err = -1;
15437917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "file is NULL");
15447917SReza.Sabdar@Sun.COM } else if (!stp) {
15457917SReza.Sabdar@Sun.COM err = -1;
15467917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "stp is NULL");
15477917SReza.Sabdar@Sun.COM } else if (!(nlp = ndmp_get_nlp(cbp->fh_cookie))) {
15487917SReza.Sabdar@Sun.COM err = -1;
15497917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
15507917SReza.Sabdar@Sun.COM } else
15517917SReza.Sabdar@Sun.COM err = 0;
15527917SReza.Sabdar@Sun.COM
15537917SReza.Sabdar@Sun.COM if (err != 0)
15547917SReza.Sabdar@Sun.COM return (0);
15557917SReza.Sabdar@Sun.COM
15567917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "d(%s), f(%s)", dir, file);
15577917SReza.Sabdar@Sun.COM
15587917SReza.Sabdar@Sun.COM err = 0;
15597917SReza.Sabdar@Sun.COM if (fh_requested(cbp->fh_cookie) == TRUE) {
15607917SReza.Sabdar@Sun.COM if (stp->st_ino == nlp->nlp_bkdirino) {
15617917SReza.Sabdar@Sun.COM ino = ROOT_INODE;
15627917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG,
15637917SReza.Sabdar@Sun.COM "bkroot %d -> %d", stp->st_ino, ROOT_INODE);
15647917SReza.Sabdar@Sun.COM } else {
15657917SReza.Sabdar@Sun.COM ino = stp->st_ino;
15667917SReza.Sabdar@Sun.COM }
15677917SReza.Sabdar@Sun.COM
15687917SReza.Sabdar@Sun.COM params = get_params(cbp->fh_cookie);
15697917SReza.Sabdar@Sun.COM if (params == NULL || params->mp_file_history_node_func == NULL)
15707917SReza.Sabdar@Sun.COM err = -1;
15717917SReza.Sabdar@Sun.COM else if ((err = (*params->mp_file_history_node_func)(cbp->
15727917SReza.Sabdar@Sun.COM fh_cookie, ino, stp, 0)) < 0)
15737917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "\"%s/\": %d", dir, file, err);
15747917SReza.Sabdar@Sun.COM
15757917SReza.Sabdar@Sun.COM }
15767917SReza.Sabdar@Sun.COM
15777917SReza.Sabdar@Sun.COM return (err);
15787917SReza.Sabdar@Sun.COM }
15797917SReza.Sabdar@Sun.COM
15807917SReza.Sabdar@Sun.COM
15817917SReza.Sabdar@Sun.COM /*
15827917SReza.Sabdar@Sun.COM * ndmpd_path_restored
15837917SReza.Sabdar@Sun.COM *
15847917SReza.Sabdar@Sun.COM * Mark the specified path as a restored path
15857917SReza.Sabdar@Sun.COM */
15867917SReza.Sabdar@Sun.COM /*ARGSUSED*/
15877917SReza.Sabdar@Sun.COM int
ndmpd_path_restored(lbr_fhlog_call_backs_t * cbp,char * name,struct stat64 * stp,u_longlong_t ll_pos)15887917SReza.Sabdar@Sun.COM ndmpd_path_restored(lbr_fhlog_call_backs_t *cbp, char *name, struct stat64 *stp,
15897917SReza.Sabdar@Sun.COM u_longlong_t ll_pos)
15907917SReza.Sabdar@Sun.COM {
15917917SReza.Sabdar@Sun.COM int rv;
15927917SReza.Sabdar@Sun.COM ndmp_name *entp;
15937917SReza.Sabdar@Sun.COM ndmp_lbr_params_t *nlp;
15947917SReza.Sabdar@Sun.COM ndmpd_module_params_t *params;
15957917SReza.Sabdar@Sun.COM int pos = (int)ll_pos;
15967917SReza.Sabdar@Sun.COM
15977917SReza.Sabdar@Sun.COM if (cbp == NULL) {
15987917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "cbp is NULL");
15997917SReza.Sabdar@Sun.COM return (-1);
16007917SReza.Sabdar@Sun.COM }
16017917SReza.Sabdar@Sun.COM if (name == NULL) {
16027917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "name is NULL");
16037917SReza.Sabdar@Sun.COM return (-1);
16047917SReza.Sabdar@Sun.COM }
16057917SReza.Sabdar@Sun.COM
16067917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "name: \"%s\", pos: %d",
16077917SReza.Sabdar@Sun.COM name, pos);
16087917SReza.Sabdar@Sun.COM
16097917SReza.Sabdar@Sun.COM if ((nlp = ndmp_get_nlp(cbp->fh_cookie)) == NULL) {
16107917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "nlp is NULL");
16117917SReza.Sabdar@Sun.COM return (-1);
16127917SReza.Sabdar@Sun.COM }
16137917SReza.Sabdar@Sun.COM if (pos < 0 || pos >= nlp->nlp_nfiles) {
16147917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "Invalid pos: %d", pos);
16157917SReza.Sabdar@Sun.COM return (-1);
16167917SReza.Sabdar@Sun.COM }
16177917SReza.Sabdar@Sun.COM params = get_params(cbp->fh_cookie);
16187917SReza.Sabdar@Sun.COM if (params == NULL || params->mp_file_recovered_func == NULL)
16197917SReza.Sabdar@Sun.COM return (-1);
16207917SReza.Sabdar@Sun.COM
16217917SReza.Sabdar@Sun.COM rv = 0;
16227917SReza.Sabdar@Sun.COM if (!nlp->nlp_restored[pos]) {
16237917SReza.Sabdar@Sun.COM entp = (ndmp_name *)MOD_GETNAME(params, pos);
16247917SReza.Sabdar@Sun.COM if (entp && entp->name)
16257917SReza.Sabdar@Sun.COM name = entp->name;
16267917SReza.Sabdar@Sun.COM
16277917SReza.Sabdar@Sun.COM if ((rv = MOD_FILERECOVERD(params, name, 0)) >= 0)
16287917SReza.Sabdar@Sun.COM nlp->nlp_restored[pos] = TRUE;
16297917SReza.Sabdar@Sun.COM }
16307917SReza.Sabdar@Sun.COM
16317917SReza.Sabdar@Sun.COM return (rv);
16327917SReza.Sabdar@Sun.COM }
16337917SReza.Sabdar@Sun.COM
16347917SReza.Sabdar@Sun.COM
16357917SReza.Sabdar@Sun.COM /*
16367917SReza.Sabdar@Sun.COM * dp_readdir
16377917SReza.Sabdar@Sun.COM *
16387917SReza.Sabdar@Sun.COM * Reads the entry of the directory and provides other information
16397917SReza.Sabdar@Sun.COM * such as i-number, name, length and saves the dir entry position
16407917SReza.Sabdar@Sun.COM * in a cookie for future calls.
16417917SReza.Sabdar@Sun.COM */
16427917SReza.Sabdar@Sun.COM int
dp_readdir(DIR * dirp,unsigned long * cookiep,char * name,int * n_namep,unsigned long * fileidp)16437917SReza.Sabdar@Sun.COM dp_readdir(DIR *dirp, unsigned long *cookiep, char *name, int *n_namep,
16447917SReza.Sabdar@Sun.COM unsigned long *fileidp)
16457917SReza.Sabdar@Sun.COM {
16467917SReza.Sabdar@Sun.COM struct dirent *entp;
16477917SReza.Sabdar@Sun.COM int err = errno;
16487917SReza.Sabdar@Sun.COM
16497917SReza.Sabdar@Sun.COM if ((entp = readdir(dirp)) == 0) {
16507917SReza.Sabdar@Sun.COM if (err == errno) {
16517917SReza.Sabdar@Sun.COM *n_namep = 0;
16527917SReza.Sabdar@Sun.COM return (0);
16537917SReza.Sabdar@Sun.COM }
16547917SReza.Sabdar@Sun.COM return (errno);
16557917SReza.Sabdar@Sun.COM }
16567917SReza.Sabdar@Sun.COM
16577917SReza.Sabdar@Sun.COM *fileidp = entp->d_ino;
16587917SReza.Sabdar@Sun.COM (void) strlcpy(name, entp->d_name, *n_namep);
16597917SReza.Sabdar@Sun.COM *n_namep = entp->d_reclen + 1;
16607917SReza.Sabdar@Sun.COM *cookiep = telldir(dirp);
16617917SReza.Sabdar@Sun.COM return (0);
16627917SReza.Sabdar@Sun.COM }
1663