xref: /onnv-gate/usr/src/cmd/ndmpd/ndmp/ndmpd_common.h (revision 12740:6ab6e1b7e92f)
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