17917SReza.Sabdar@Sun.COM /* 212186SJanice.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) 2007, The Storage Networking Industry Association. */ 397917SReza.Sabdar@Sun.COM /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */ 407917SReza.Sabdar@Sun.COM 417917SReza.Sabdar@Sun.COM #ifndef _NDMP_COMMON_H 427917SReza.Sabdar@Sun.COM #define _NDMP_COMMON_H 437917SReza.Sabdar@Sun.COM 447917SReza.Sabdar@Sun.COM #include <thread.h> 457917SReza.Sabdar@Sun.COM #include <synch.h> 467917SReza.Sabdar@Sun.COM #include "ndmpd_log.h" 477917SReza.Sabdar@Sun.COM #include "ndmp.h" 487917SReza.Sabdar@Sun.COM #include <unistd.h> 497917SReza.Sabdar@Sun.COM #include <sys/types.h> 507917SReza.Sabdar@Sun.COM #include <rpc/rpc.h> 517917SReza.Sabdar@Sun.COM #include <sys/stat.h> 527917SReza.Sabdar@Sun.COM #include <stdio.h> 537917SReza.Sabdar@Sun.COM #include <bsm/adt.h> 547917SReza.Sabdar@Sun.COM #include <bsm/adt_event.h> 557917SReza.Sabdar@Sun.COM 567917SReza.Sabdar@Sun.COM 577917SReza.Sabdar@Sun.COM #define XDR_AND_SIZE(func) (bool_t(*)(XDR*, ...))xdr_##func, sizeof (func) 587917SReza.Sabdar@Sun.COM #define AUTH_REQUIRED TRUE 597917SReza.Sabdar@Sun.COM #define AUTH_NOT_REQUIRED FALSE 607917SReza.Sabdar@Sun.COM #define NDMP_EOM_MAGIC "PRCMEOM" 617917SReza.Sabdar@Sun.COM #define KILOBYTE 1024 627917SReza.Sabdar@Sun.COM 637917SReza.Sabdar@Sun.COM #define INT_MAXCMD 12 647917SReza.Sabdar@Sun.COM 657917SReza.Sabdar@Sun.COM extern mutex_t log_lock; 6612186SJanice.Chang@Sun.COM extern mutex_t ndmpd_zfs_fd_lock; 677917SReza.Sabdar@Sun.COM 687917SReza.Sabdar@Sun.COM /* Connection data structure. */ 697917SReza.Sabdar@Sun.COM typedef struct msg_info { 707917SReza.Sabdar@Sun.COM ndmp_header mi_hdr; 717917SReza.Sabdar@Sun.COM struct ndmp_msg_handler *mi_handler; 727917SReza.Sabdar@Sun.COM void *mi_body; 737917SReza.Sabdar@Sun.COM } msg_info_t; 747917SReza.Sabdar@Sun.COM 757917SReza.Sabdar@Sun.COM typedef struct ndmp_connection { 767917SReza.Sabdar@Sun.COM int conn_sock; 777917SReza.Sabdar@Sun.COM XDR conn_xdrs; 787917SReza.Sabdar@Sun.COM ulong_t conn_my_sequence; 797917SReza.Sabdar@Sun.COM boolean_t conn_authorized; 807917SReza.Sabdar@Sun.COM boolean_t conn_eof; 817917SReza.Sabdar@Sun.COM msg_info_t conn_msginfo; /* received request or reply message */ 827917SReza.Sabdar@Sun.COM ushort_t conn_version; 837917SReza.Sabdar@Sun.COM void *conn_client_data; 847917SReza.Sabdar@Sun.COM mutex_t conn_lock; 857917SReza.Sabdar@Sun.COM adt_session_data_t *conn_ah; 867917SReza.Sabdar@Sun.COM } ndmp_connection_t; 877917SReza.Sabdar@Sun.COM 887917SReza.Sabdar@Sun.COM typedef void (*ndmp_con_handler_func_t) (struct ndmp_connection *); 897917SReza.Sabdar@Sun.COM 907917SReza.Sabdar@Sun.COM typedef void ndmp_msg_handler_func_t(struct ndmp_connection *, void *); 917917SReza.Sabdar@Sun.COM 927917SReza.Sabdar@Sun.COM 937917SReza.Sabdar@Sun.COM typedef struct ndmp_msg_handler { 947917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t *mh_func; 957917SReza.Sabdar@Sun.COM bool_t(*mh_xdr_request) (XDR *xdrs, ...); 967917SReza.Sabdar@Sun.COM int mh_sizeof_request; 977917SReza.Sabdar@Sun.COM bool_t(*mh_xdr_reply) (XDR *xdrs, ...); 987917SReza.Sabdar@Sun.COM int mh_sizeof_reply; 997917SReza.Sabdar@Sun.COM } ndmp_msg_handler_t; 1007917SReza.Sabdar@Sun.COM 1017917SReza.Sabdar@Sun.COM typedef struct ndmp_handler { 1027917SReza.Sabdar@Sun.COM int hd_cnt; 1037917SReza.Sabdar@Sun.COM struct hd_messages { 1047917SReza.Sabdar@Sun.COM ndmp_message hm_message; 1057917SReza.Sabdar@Sun.COM boolean_t hm_auth_required; 1067917SReza.Sabdar@Sun.COM ndmp_msg_handler_t hm_msg_v[3]; 1077917SReza.Sabdar@Sun.COM } hd_msgs[INT_MAXCMD]; 1087917SReza.Sabdar@Sun.COM } ndmp_handler_t; 1097917SReza.Sabdar@Sun.COM 1107917SReza.Sabdar@Sun.COM /* 1117917SReza.Sabdar@Sun.COM * Function prototypes. 1127917SReza.Sabdar@Sun.COM */ 1137917SReza.Sabdar@Sun.COM extern ndmp_connection_t *ndmp_create_connection(void); 1147917SReza.Sabdar@Sun.COM 1157917SReza.Sabdar@Sun.COM extern void ndmp_destroy_connection(ndmp_connection_t *); 1167917SReza.Sabdar@Sun.COM 1177917SReza.Sabdar@Sun.COM extern void ndmp_close(ndmp_connection_t *); 1187917SReza.Sabdar@Sun.COM 1197917SReza.Sabdar@Sun.COM extern int ndmp_connect(ndmp_connection_t *, 1207917SReza.Sabdar@Sun.COM char *, 1217917SReza.Sabdar@Sun.COM ulong_t); 1227917SReza.Sabdar@Sun.COM 1237917SReza.Sabdar@Sun.COM extern int ndmp_run(ulong_t, 1247917SReza.Sabdar@Sun.COM ndmp_con_handler_func_t); 1257917SReza.Sabdar@Sun.COM 1267917SReza.Sabdar@Sun.COM extern int ndmp_process_requests(ndmp_connection_t *); 1277917SReza.Sabdar@Sun.COM 1287917SReza.Sabdar@Sun.COM extern int ndmp_send_response(ndmp_connection_t *, 1297917SReza.Sabdar@Sun.COM ndmp_error, 1307917SReza.Sabdar@Sun.COM void *); 1317917SReza.Sabdar@Sun.COM 1327917SReza.Sabdar@Sun.COM extern int ndmp_send_request(ndmp_connection_t *, 1337917SReza.Sabdar@Sun.COM ndmp_message, 1347917SReza.Sabdar@Sun.COM ndmp_error, 1357917SReza.Sabdar@Sun.COM void *, 1367917SReza.Sabdar@Sun.COM void **); 1377917SReza.Sabdar@Sun.COM 1387917SReza.Sabdar@Sun.COM extern int ndmp_send_request_lock(ndmp_connection_t *, 1397917SReza.Sabdar@Sun.COM ndmp_message, 1407917SReza.Sabdar@Sun.COM ndmp_error, 1417917SReza.Sabdar@Sun.COM void *, 1427917SReza.Sabdar@Sun.COM void **); 1437917SReza.Sabdar@Sun.COM 1447917SReza.Sabdar@Sun.COM extern void ndmp_free_message(ndmp_connection_t *); 1457917SReza.Sabdar@Sun.COM 1467917SReza.Sabdar@Sun.COM extern int ndmp_get_fd(ndmp_connection_t *); 1477917SReza.Sabdar@Sun.COM 1487917SReza.Sabdar@Sun.COM extern void ndmp_set_client_data(ndmp_connection_t *, 1497917SReza.Sabdar@Sun.COM void *); 1507917SReza.Sabdar@Sun.COM 1517917SReza.Sabdar@Sun.COM extern void *ndmp_get_client_data(ndmp_connection_t *); 1527917SReza.Sabdar@Sun.COM 1537917SReza.Sabdar@Sun.COM extern void ndmp_set_version(ndmp_connection_t *, 1547917SReza.Sabdar@Sun.COM ushort_t); 1557917SReza.Sabdar@Sun.COM 1567917SReza.Sabdar@Sun.COM extern ushort_t ndmp_get_version(ndmp_connection_t *); 1577917SReza.Sabdar@Sun.COM 1587917SReza.Sabdar@Sun.COM extern void ndmp_set_authorized(ndmp_connection_t *, 1597917SReza.Sabdar@Sun.COM boolean_t); 1607917SReza.Sabdar@Sun.COM 1617917SReza.Sabdar@Sun.COM 1627917SReza.Sabdar@Sun.COM /* 1637917SReza.Sabdar@Sun.COM * NDMP daemon callback functions. 1647917SReza.Sabdar@Sun.COM * Called by backup/recover modules. 1657917SReza.Sabdar@Sun.COM */ 1667917SReza.Sabdar@Sun.COM typedef char *ndmpd_get_env_func_t(void *, char *); 1677917SReza.Sabdar@Sun.COM typedef int ndmpd_add_env_func_t(void *, char *, char *); 1687917SReza.Sabdar@Sun.COM typedef void *ndmpd_get_name_func_t(void *, ulong_t); 1697917SReza.Sabdar@Sun.COM typedef int ndmpd_dispatch_func_t(void *, boolean_t); 1707917SReza.Sabdar@Sun.COM typedef void ndmpd_done_func_t(void *, int); 1717917SReza.Sabdar@Sun.COM typedef int ndmpd_log_func_t(void *, char *, ...); 1727917SReza.Sabdar@Sun.COM 1737917SReza.Sabdar@Sun.COM typedef int ndmpd_log_func_v3_t(void *, ndmp_log_type, ulong_t, 1747917SReza.Sabdar@Sun.COM char *, ...); 1757917SReza.Sabdar@Sun.COM 1767917SReza.Sabdar@Sun.COM 1777917SReza.Sabdar@Sun.COM #define NDMPD_SELECT_MODE_READ 1 1787917SReza.Sabdar@Sun.COM #define NDMPD_SELECT_MODE_WRITE 2 1797917SReza.Sabdar@Sun.COM #define NDMPD_SELECT_MODE_EXCEPTION 4 1807917SReza.Sabdar@Sun.COM 1817917SReza.Sabdar@Sun.COM typedef void ndmpd_file_handler_func_t(void *, int, ulong_t); 1827917SReza.Sabdar@Sun.COM 1837917SReza.Sabdar@Sun.COM typedef int ndmpd_add_file_handler_func_t(void *, void *, int, ulong_t, 1847917SReza.Sabdar@Sun.COM ndmpd_file_handler_func_t *); 1857917SReza.Sabdar@Sun.COM 1867917SReza.Sabdar@Sun.COM typedef int ndmpd_remove_file_handler_func_t(void *, int); 1877917SReza.Sabdar@Sun.COM 1887917SReza.Sabdar@Sun.COM typedef int ndmpd_write_func_t(void *, char *, ulong_t); 1897917SReza.Sabdar@Sun.COM 1907917SReza.Sabdar@Sun.COM typedef int ndmpd_file_history_path_func_t(void *, char *, struct stat64 *, 1917917SReza.Sabdar@Sun.COM u_longlong_t); 1927917SReza.Sabdar@Sun.COM 1937917SReza.Sabdar@Sun.COM typedef int ndmpd_file_history_dir_func_t(void *, char *, ulong_t, 1947917SReza.Sabdar@Sun.COM ulong_t); 1957917SReza.Sabdar@Sun.COM 1967917SReza.Sabdar@Sun.COM typedef int ndmpd_file_history_node_func_t(void *, ulong_t, struct stat64 *, 1977917SReza.Sabdar@Sun.COM u_longlong_t); 1987917SReza.Sabdar@Sun.COM 1997917SReza.Sabdar@Sun.COM typedef int ndmpd_seek_func_t(void *, u_longlong_t, u_longlong_t); 2007917SReza.Sabdar@Sun.COM 2017917SReza.Sabdar@Sun.COM typedef int ndmpd_read_func_t(void *, char *, ulong_t); 2027917SReza.Sabdar@Sun.COM 2037917SReza.Sabdar@Sun.COM typedef int ndmpd_file_recovered_func_t(void *, char *, int); 2047917SReza.Sabdar@Sun.COM 2057917SReza.Sabdar@Sun.COM typedef struct ndmpd_module_stats { 2067917SReza.Sabdar@Sun.COM u_longlong_t ms_bytes_processed; 2077917SReza.Sabdar@Sun.COM u_longlong_t ms_est_bytes_remaining; 2087917SReza.Sabdar@Sun.COM ulong_t ms_est_time_remaining; 2097917SReza.Sabdar@Sun.COM } ndmpd_module_stats; 2107917SReza.Sabdar@Sun.COM 2117917SReza.Sabdar@Sun.COM /* 2127917SReza.Sabdar@Sun.COM * Parameter structure passed to module start function. 2137917SReza.Sabdar@Sun.COM */ 2147917SReza.Sabdar@Sun.COM typedef struct ndmpd_module_params { 2157917SReza.Sabdar@Sun.COM void *mp_daemon_cookie; 2167917SReza.Sabdar@Sun.COM void **mp_module_cookie; 2177917SReza.Sabdar@Sun.COM ushort_t mp_protocol_version; 2187917SReza.Sabdar@Sun.COM ndmp_data_operation mp_operation; 2197917SReza.Sabdar@Sun.COM ndmpd_module_stats *mp_stats; 2207917SReza.Sabdar@Sun.COM ndmpd_get_env_func_t *mp_get_env_func; 2217917SReza.Sabdar@Sun.COM ndmpd_add_env_func_t *mp_add_env_func; 2227917SReza.Sabdar@Sun.COM ndmpd_add_env_func_t *mp_set_env_func; 2237917SReza.Sabdar@Sun.COM ndmpd_get_name_func_t *mp_get_name_func; 2247917SReza.Sabdar@Sun.COM ndmpd_dispatch_func_t *mp_dispatch_func; 2257917SReza.Sabdar@Sun.COM ndmpd_done_func_t *mp_done_func; 2267917SReza.Sabdar@Sun.COM ndmpd_log_func_t *mp_log_func; 2277917SReza.Sabdar@Sun.COM ndmpd_add_file_handler_func_t *mp_add_file_handler_func; 2287917SReza.Sabdar@Sun.COM ndmpd_remove_file_handler_func_t *mp_remove_file_handler_func; 2297917SReza.Sabdar@Sun.COM ndmpd_write_func_t *mp_write_func; 2307917SReza.Sabdar@Sun.COM ndmpd_file_history_path_func_t *mp_file_history_path_func; 2317917SReza.Sabdar@Sun.COM ndmpd_file_history_dir_func_t *mp_file_history_dir_func; 2327917SReza.Sabdar@Sun.COM ndmpd_file_history_node_func_t *mp_file_history_node_func; 2337917SReza.Sabdar@Sun.COM ndmpd_read_func_t *mp_read_func; 2347917SReza.Sabdar@Sun.COM ndmpd_seek_func_t *mp_seek_func; 2357917SReza.Sabdar@Sun.COM ndmpd_file_recovered_func_t *mp_file_recovered_func; 2367917SReza.Sabdar@Sun.COM /* 2377917SReza.Sabdar@Sun.COM * NDMP V3 params. 2387917SReza.Sabdar@Sun.COM */ 2397917SReza.Sabdar@Sun.COM ndmpd_log_func_v3_t *mp_log_func_v3; 2407917SReza.Sabdar@Sun.COM } ndmpd_module_params_t; 2417917SReza.Sabdar@Sun.COM 242*12740SJanice.Chang@Sun.COM #define MOD_ADDENV(m, n, v) \ 243*12740SJanice.Chang@Sun.COM (*(m)->mp_add_env_func)((m)->mp_daemon_cookie, n, v) 2447917SReza.Sabdar@Sun.COM 2457917SReza.Sabdar@Sun.COM #define MOD_SETENV(m, n, v) \ 2467917SReza.Sabdar@Sun.COM (*(m)->mp_set_env_func)((m)->mp_daemon_cookie, n, v) 2477917SReza.Sabdar@Sun.COM 2487917SReza.Sabdar@Sun.COM #define MOD_GETENV(m, e) \ 2497917SReza.Sabdar@Sun.COM (*(m)->mp_get_env_func)((m)->mp_daemon_cookie, e) 2507917SReza.Sabdar@Sun.COM 2517917SReza.Sabdar@Sun.COM #define MOD_GETNAME(m, i) \ 2527917SReza.Sabdar@Sun.COM (*(m)->mp_get_name_func)((m)->mp_daemon_cookie, i) 2537917SReza.Sabdar@Sun.COM 2547917SReza.Sabdar@Sun.COM #define MOD_LOG(m, ...) \ 2557917SReza.Sabdar@Sun.COM (*(m)->mp_log_func)((m)->mp_daemon_cookie, __VA_ARGS__) 2567917SReza.Sabdar@Sun.COM 2577917SReza.Sabdar@Sun.COM #define MOD_READ(m, b, s) \ 2587917SReza.Sabdar@Sun.COM (*(m)->mp_read_func)((m)->mp_daemon_cookie, b, s) 2597917SReza.Sabdar@Sun.COM 2607917SReza.Sabdar@Sun.COM #define MOD_WRITE(m, b, s) \ 2617917SReza.Sabdar@Sun.COM (*(m)->mp_write_func)((m)->mp_daemon_cookie, b, s) 2627917SReza.Sabdar@Sun.COM 2637917SReza.Sabdar@Sun.COM #define MOD_DONE(m, e) \ 2647917SReza.Sabdar@Sun.COM (*(m)->mp_done_func)((m)->mp_daemon_cookie, e) 2657917SReza.Sabdar@Sun.COM 2667917SReza.Sabdar@Sun.COM #define MOD_FILERECOVERD(m, n, e) \ 2677917SReza.Sabdar@Sun.COM (*(m)->mp_file_recovered_func)((m)->mp_daemon_cookie, n, e) 2687917SReza.Sabdar@Sun.COM 2697917SReza.Sabdar@Sun.COM extern int ndmp_log_msg_id; 2707917SReza.Sabdar@Sun.COM 2717917SReza.Sabdar@Sun.COM #define MOD_LOGV3(m, t, ...) \ 2727917SReza.Sabdar@Sun.COM (*(m)->mp_log_func_v3)((m)->mp_daemon_cookie, (t), \ 2737917SReza.Sabdar@Sun.COM ++ndmp_log_msg_id, __VA_ARGS__) 2747917SReza.Sabdar@Sun.COM 2757917SReza.Sabdar@Sun.COM #define MOD_LOGCONTV3(m, t, ...) \ 2767917SReza.Sabdar@Sun.COM (*(m)->mp_log_func_v3)((m)->mp_daemon_cookie, \ 2777917SReza.Sabdar@Sun.COM (t), ndmp_log_msg_id, __VA_ARGS__) 2787917SReza.Sabdar@Sun.COM 2797917SReza.Sabdar@Sun.COM /* 2807917SReza.Sabdar@Sun.COM * Module function prototypes. 2817917SReza.Sabdar@Sun.COM */ 28212186SJanice.Chang@Sun.COM typedef int module_start_func_t(void *); 2837917SReza.Sabdar@Sun.COM typedef int module_abort_func_t(void *); 2847917SReza.Sabdar@Sun.COM #endif /* _NDMP_COMMON_H */ 285