xref: /onnv-gate/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c (revision 13024:9c1800b4023e)
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 #include <dirent.h>
427917SReza.Sabdar@Sun.COM #include <errno.h>
437917SReza.Sabdar@Sun.COM #include <stdio.h>
447917SReza.Sabdar@Sun.COM #include <stdlib.h>
457917SReza.Sabdar@Sun.COM #include <string.h>
467917SReza.Sabdar@Sun.COM #include <sys/stat.h>
477917SReza.Sabdar@Sun.COM #include <sys/mnttab.h>
487917SReza.Sabdar@Sun.COM #include <sys/mntent.h>
497917SReza.Sabdar@Sun.COM #include <sys/mntio.h>
507917SReza.Sabdar@Sun.COM #include <sys/statvfs.h>
517917SReza.Sabdar@Sun.COM #include <sys/utsname.h>
527917SReza.Sabdar@Sun.COM #include <sys/scsi/scsi.h>
537917SReza.Sabdar@Sun.COM #include <unistd.h>
547917SReza.Sabdar@Sun.COM #include <sys/systeminfo.h>
557917SReza.Sabdar@Sun.COM #include "ndmpd_common.h"
567917SReza.Sabdar@Sun.COM #include "ndmpd.h"
577917SReza.Sabdar@Sun.COM 
587917SReza.Sabdar@Sun.COM static void simple_get_attrs(ulong_t *attributes);
597917SReza.Sabdar@Sun.COM 
607917SReza.Sabdar@Sun.COM /*
617917SReza.Sabdar@Sun.COM  * Number of environment variable for the file system
627917SReza.Sabdar@Sun.COM  * info in V3 net_fs_info.
637917SReza.Sabdar@Sun.COM  */
647917SReza.Sabdar@Sun.COM #define	V3_N_FS_ENVS	4
657917SReza.Sabdar@Sun.COM 
667917SReza.Sabdar@Sun.COM /*
677917SReza.Sabdar@Sun.COM  * Is the file system a valid one to be reported to the
687917SReza.Sabdar@Sun.COM  * clients?
697917SReza.Sabdar@Sun.COM  */
707917SReza.Sabdar@Sun.COM #define	IS_VALID_FS(fs) (fs && ( \
717917SReza.Sabdar@Sun.COM 	strcasecmp(fs->mnt_fstype, MNTTYPE_UFS) == 0 || \
727917SReza.Sabdar@Sun.COM 	strcasecmp(fs->mnt_fstype, MNTTYPE_ZFS) == 0 || \
737917SReza.Sabdar@Sun.COM 	strcasecmp(fs->mnt_fstype, MNTTYPE_NFS) == 0 || \
747917SReza.Sabdar@Sun.COM 	strcasecmp(fs->mnt_fstype, MNTTYPE_NFS3) == 0 || \
757917SReza.Sabdar@Sun.COM 	strcasecmp(fs->mnt_fstype, MNTTYPE_NFS4) == 0))
767917SReza.Sabdar@Sun.COM 
777917SReza.Sabdar@Sun.COM #define	MNTTYPE_LEN	10
787917SReza.Sabdar@Sun.COM 
797917SReza.Sabdar@Sun.COM extern struct fs_ops sfs2_ops;
807917SReza.Sabdar@Sun.COM extern struct fs_ops sfs2cpv_ops;
817917SReza.Sabdar@Sun.COM 
827917SReza.Sabdar@Sun.COM 
837917SReza.Sabdar@Sun.COM /*
847917SReza.Sabdar@Sun.COM  * ************************************************************************
857917SReza.Sabdar@Sun.COM  * NDMP V2 HANDLERS
867917SReza.Sabdar@Sun.COM  * ************************************************************************
877917SReza.Sabdar@Sun.COM  */
887917SReza.Sabdar@Sun.COM 
897917SReza.Sabdar@Sun.COM /*
907917SReza.Sabdar@Sun.COM  * ndmpd_config_get_host_info_v2
917917SReza.Sabdar@Sun.COM  *
927917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_host_info request.
937917SReza.Sabdar@Sun.COM  * Host specific information is returned.
947917SReza.Sabdar@Sun.COM  *
957917SReza.Sabdar@Sun.COM  * Parameters:
967917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
977917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
987917SReza.Sabdar@Sun.COM  *
997917SReza.Sabdar@Sun.COM  * Returns:
1007917SReza.Sabdar@Sun.COM  *   void
1017917SReza.Sabdar@Sun.COM  */
1027917SReza.Sabdar@Sun.COM /*ARGSUSED*/
1037917SReza.Sabdar@Sun.COM void
ndmpd_config_get_host_info_v2(ndmp_connection_t * connection,void * body)1047917SReza.Sabdar@Sun.COM ndmpd_config_get_host_info_v2(ndmp_connection_t *connection, void *body)
1057917SReza.Sabdar@Sun.COM {
1067917SReza.Sabdar@Sun.COM 	ndmp_config_get_host_info_reply_v2 reply;
1077917SReza.Sabdar@Sun.COM 	ndmp_auth_type auth_types[2];
1087917SReza.Sabdar@Sun.COM 	char buf[HOSTNAMELEN + 1];
1097917SReza.Sabdar@Sun.COM 	struct utsname uts;
1107917SReza.Sabdar@Sun.COM 	char hostidstr[16];
1117917SReza.Sabdar@Sun.COM 	ulong_t hostid;
1127917SReza.Sabdar@Sun.COM 
1137917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
1147917SReza.Sabdar@Sun.COM 	(void) memset(buf, 0, sizeof (buf));
1157917SReza.Sabdar@Sun.COM 	(void) gethostname(buf, sizeof (buf));
1167917SReza.Sabdar@Sun.COM 
1177917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
1187917SReza.Sabdar@Sun.COM 	reply.hostname = buf;
1197917SReza.Sabdar@Sun.COM 	(void) uname(&uts);
1207917SReza.Sabdar@Sun.COM 	reply.os_type = uts.sysname;
1217917SReza.Sabdar@Sun.COM 	reply.os_vers = uts.release;
1227917SReza.Sabdar@Sun.COM 
1237917SReza.Sabdar@Sun.COM 	if (sysinfo(SI_HW_SERIAL, hostidstr, sizeof (hostidstr)) < 0) {
1247917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "sysinfo error: %m.");
1257917SReza.Sabdar@Sun.COM 		reply.error = NDMP_UNDEFINED_ERR;
1267917SReza.Sabdar@Sun.COM 	}
1277917SReza.Sabdar@Sun.COM 
1287917SReza.Sabdar@Sun.COM 	/*
1297917SReza.Sabdar@Sun.COM 	 * Convert the hostid to hex. The returned string must match
1307917SReza.Sabdar@Sun.COM 	 * the string returned by hostid(1).
1317917SReza.Sabdar@Sun.COM 	 */
1327917SReza.Sabdar@Sun.COM 	hostid = strtoul(hostidstr, 0, 0);
1337917SReza.Sabdar@Sun.COM 	(void) snprintf(hostidstr, sizeof (hostidstr), "%lx", hostid);
1347917SReza.Sabdar@Sun.COM 	reply.hostid = hostidstr;
1357917SReza.Sabdar@Sun.COM 
1367917SReza.Sabdar@Sun.COM 	auth_types[0] = NDMP_AUTH_TEXT;
1377917SReza.Sabdar@Sun.COM 	reply.auth_type.auth_type_len = 1;
1387917SReza.Sabdar@Sun.COM 	reply.auth_type.auth_type_val = auth_types;
1397917SReza.Sabdar@Sun.COM 
1407917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
1417917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_host_info reply");
1427917SReza.Sabdar@Sun.COM }
1437917SReza.Sabdar@Sun.COM 
1447917SReza.Sabdar@Sun.COM 
1457917SReza.Sabdar@Sun.COM /*
1467917SReza.Sabdar@Sun.COM  * ndmpd_config_get_butype_attr_v2
1477917SReza.Sabdar@Sun.COM  *
1487917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_butype_attr request.
1497917SReza.Sabdar@Sun.COM  * Information about the specified backup type is returned.
1507917SReza.Sabdar@Sun.COM  *
1517917SReza.Sabdar@Sun.COM  * Parameters:
1527917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
1537917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
1547917SReza.Sabdar@Sun.COM  *
1557917SReza.Sabdar@Sun.COM  * Returns:
1567917SReza.Sabdar@Sun.COM  *   void
1577917SReza.Sabdar@Sun.COM  */
1587917SReza.Sabdar@Sun.COM void
ndmpd_config_get_butype_attr_v2(ndmp_connection_t * connection,void * body)1597917SReza.Sabdar@Sun.COM ndmpd_config_get_butype_attr_v2(ndmp_connection_t *connection, void *body)
1607917SReza.Sabdar@Sun.COM {
1617917SReza.Sabdar@Sun.COM 	ndmp_config_get_butype_attr_request *request;
1627917SReza.Sabdar@Sun.COM 	ndmp_config_get_butype_attr_reply reply;
1637917SReza.Sabdar@Sun.COM 
1647917SReza.Sabdar@Sun.COM 	request = (ndmp_config_get_butype_attr_request *)body;
1657917SReza.Sabdar@Sun.COM 
1667917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
1677917SReza.Sabdar@Sun.COM 
1687917SReza.Sabdar@Sun.COM 	if (strcmp(request->name, "dump") == 0) {
1697917SReza.Sabdar@Sun.COM 		(void) simple_get_attrs(&reply.attrs);
1707917SReza.Sabdar@Sun.COM 	} else if (strcmp(request->name, "tar") == 0) {
1717917SReza.Sabdar@Sun.COM 		reply.attrs = NDMP_NO_BACKUP_FILELIST;
1727917SReza.Sabdar@Sun.COM 	} else {
1737917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR, "Invalid backup type: %s.", request->name);
1747917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR,
1757917SReza.Sabdar@Sun.COM 		    "Supported backup types are 'dump' and 'tar' only.");
1767917SReza.Sabdar@Sun.COM 		reply.error = NDMP_ILLEGAL_ARGS_ERR;
1777917SReza.Sabdar@Sun.COM 	}
1787917SReza.Sabdar@Sun.COM 
1797917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
1807917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_butype_attr reply");
1817917SReza.Sabdar@Sun.COM }
1827917SReza.Sabdar@Sun.COM 
1837917SReza.Sabdar@Sun.COM 
1847917SReza.Sabdar@Sun.COM /*
1857917SReza.Sabdar@Sun.COM  * ndmpd_config_get_mover_type_v2
1867917SReza.Sabdar@Sun.COM  *
1877917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_mover_type request.
1887917SReza.Sabdar@Sun.COM  * Information about the supported mover types is returned.
1897917SReza.Sabdar@Sun.COM  *
1907917SReza.Sabdar@Sun.COM  * Parameters:
1917917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
1927917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
1937917SReza.Sabdar@Sun.COM  *
1947917SReza.Sabdar@Sun.COM  * Returns:
1957917SReza.Sabdar@Sun.COM  *   void
1967917SReza.Sabdar@Sun.COM  */
1977917SReza.Sabdar@Sun.COM /*ARGSUSED*/
1987917SReza.Sabdar@Sun.COM void
ndmpd_config_get_mover_type_v2(ndmp_connection_t * connection,void * body)1997917SReza.Sabdar@Sun.COM ndmpd_config_get_mover_type_v2(ndmp_connection_t *connection, void *body)
2007917SReza.Sabdar@Sun.COM {
2017917SReza.Sabdar@Sun.COM 	ndmp_config_get_mover_type_reply reply;
2027917SReza.Sabdar@Sun.COM 	ndmp_addr_type types[2];
2037917SReza.Sabdar@Sun.COM 
2047917SReza.Sabdar@Sun.COM 	types[0] = NDMP_ADDR_LOCAL;
2057917SReza.Sabdar@Sun.COM 	types[1] = NDMP_ADDR_TCP;
2067917SReza.Sabdar@Sun.COM 
2077917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
2087917SReza.Sabdar@Sun.COM 	reply.methods.methods_len = 2;
2097917SReza.Sabdar@Sun.COM 	reply.methods.methods_val = types;
2107917SReza.Sabdar@Sun.COM 
2117917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
2127917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_mover_type reply");
2137917SReza.Sabdar@Sun.COM }
2147917SReza.Sabdar@Sun.COM 
2157917SReza.Sabdar@Sun.COM 
2167917SReza.Sabdar@Sun.COM 
2177917SReza.Sabdar@Sun.COM /*
2187917SReza.Sabdar@Sun.COM  * ndmpd_config_get_auth_attr_v2
2197917SReza.Sabdar@Sun.COM  *
2207917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_auth_attr request.
2217917SReza.Sabdar@Sun.COM  * Authorization type specific information is returned.
2227917SReza.Sabdar@Sun.COM  *
2237917SReza.Sabdar@Sun.COM  * Parameters:
2247917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
2257917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
2267917SReza.Sabdar@Sun.COM  *
2277917SReza.Sabdar@Sun.COM  * Returns:
2287917SReza.Sabdar@Sun.COM  *   void
2297917SReza.Sabdar@Sun.COM  */
2307917SReza.Sabdar@Sun.COM void
ndmpd_config_get_auth_attr_v2(ndmp_connection_t * connection,void * body)2317917SReza.Sabdar@Sun.COM ndmpd_config_get_auth_attr_v2(ndmp_connection_t *connection, void *body)
2327917SReza.Sabdar@Sun.COM {
2337917SReza.Sabdar@Sun.COM 	ndmp_config_get_auth_attr_request *request;
2347917SReza.Sabdar@Sun.COM 	ndmp_config_get_auth_attr_reply reply;
2357917SReza.Sabdar@Sun.COM 	ndmpd_session_t *session = ndmp_get_client_data(connection);
2367917SReza.Sabdar@Sun.COM 
2377917SReza.Sabdar@Sun.COM 	request = (ndmp_config_get_auth_attr_request *)body;
2387917SReza.Sabdar@Sun.COM 
2397917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
2407917SReza.Sabdar@Sun.COM 	reply.server_attr.auth_type = request->auth_type;
2417917SReza.Sabdar@Sun.COM 
2427917SReza.Sabdar@Sun.COM 	switch (request->auth_type) {
2437917SReza.Sabdar@Sun.COM 	case NDMP_AUTH_TEXT:
2447917SReza.Sabdar@Sun.COM 		break;
2457917SReza.Sabdar@Sun.COM 	case NDMP_AUTH_MD5:
2467917SReza.Sabdar@Sun.COM 		/* Create a 64 byte random session challenge */
2477917SReza.Sabdar@Sun.COM 		randomize(session->ns_challenge, MD5_CHALLENGE_SIZE);
2487917SReza.Sabdar@Sun.COM 		(void) memcpy(reply.server_attr.ndmp_auth_attr_u.challenge,
2497917SReza.Sabdar@Sun.COM 		    session->ns_challenge, MD5_CHALLENGE_SIZE);
2507917SReza.Sabdar@Sun.COM 		break;
2517917SReza.Sabdar@Sun.COM 	case NDMP_AUTH_NONE:
2527917SReza.Sabdar@Sun.COM 		/* FALL THROUGH */
2537917SReza.Sabdar@Sun.COM 	default:
2547917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR, "Invalid authentication type: %d.",
2557917SReza.Sabdar@Sun.COM 		    request->auth_type);
2567917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR,
2577917SReza.Sabdar@Sun.COM 		    "Supported authentication types are md5 and cleartext.");
2587917SReza.Sabdar@Sun.COM 		reply.error = NDMP_ILLEGAL_ARGS_ERR;
2597917SReza.Sabdar@Sun.COM 		break;
2607917SReza.Sabdar@Sun.COM 	}
2617917SReza.Sabdar@Sun.COM 
2627917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
2637917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_auth_attr reply");
2647917SReza.Sabdar@Sun.COM }
2657917SReza.Sabdar@Sun.COM 
2667917SReza.Sabdar@Sun.COM 
2677917SReza.Sabdar@Sun.COM /*
2687917SReza.Sabdar@Sun.COM  * ************************************************************************
2697917SReza.Sabdar@Sun.COM  * NDMP V3 HANDLERS
2707917SReza.Sabdar@Sun.COM  * ************************************************************************
2717917SReza.Sabdar@Sun.COM  */
2727917SReza.Sabdar@Sun.COM 
2737917SReza.Sabdar@Sun.COM /*
2747917SReza.Sabdar@Sun.COM  * ndmpd_config_get_host_info_v3
2757917SReza.Sabdar@Sun.COM  *
2767917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_host_info request.
2777917SReza.Sabdar@Sun.COM  * Host specific information is returned.
2787917SReza.Sabdar@Sun.COM  *
2797917SReza.Sabdar@Sun.COM  * Parameters:
2807917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
2817917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
2827917SReza.Sabdar@Sun.COM  *
2837917SReza.Sabdar@Sun.COM  * Returns:
2847917SReza.Sabdar@Sun.COM  *   void
2857917SReza.Sabdar@Sun.COM  */
2867917SReza.Sabdar@Sun.COM /*ARGSUSED*/
2877917SReza.Sabdar@Sun.COM void
ndmpd_config_get_host_info_v3(ndmp_connection_t * connection,void * body)2887917SReza.Sabdar@Sun.COM ndmpd_config_get_host_info_v3(ndmp_connection_t *connection, void *body)
2897917SReza.Sabdar@Sun.COM {
2907917SReza.Sabdar@Sun.COM 	ndmp_config_get_host_info_reply_v3 reply;
2917917SReza.Sabdar@Sun.COM 	char buf[HOSTNAMELEN+1];
2927917SReza.Sabdar@Sun.COM 	struct utsname uts;
2937917SReza.Sabdar@Sun.COM 	char hostidstr[16];
2947917SReza.Sabdar@Sun.COM 	ulong_t hostid;
2957917SReza.Sabdar@Sun.COM 
2967917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
2977917SReza.Sabdar@Sun.COM 	(void) memset(buf, 0, sizeof (buf));
2987917SReza.Sabdar@Sun.COM 	(void) gethostname(buf, sizeof (buf));
2997917SReza.Sabdar@Sun.COM 
3007917SReza.Sabdar@Sun.COM 
3017917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
3027917SReza.Sabdar@Sun.COM 	reply.hostname = buf;
3037917SReza.Sabdar@Sun.COM 	(void) uname(&uts);
3047917SReza.Sabdar@Sun.COM 	reply.os_type = uts.sysname;
3057917SReza.Sabdar@Sun.COM 	reply.os_vers = uts.release;
3067917SReza.Sabdar@Sun.COM 
3077917SReza.Sabdar@Sun.COM 	if (sysinfo(SI_HW_SERIAL, hostidstr, sizeof (hostidstr)) < 0) {
3087917SReza.Sabdar@Sun.COM 
3097917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "sysinfo error: %m.");
3107917SReza.Sabdar@Sun.COM 		reply.error = NDMP_UNDEFINED_ERR;
3117917SReza.Sabdar@Sun.COM 	}
3127917SReza.Sabdar@Sun.COM 
3137917SReza.Sabdar@Sun.COM 	/*
3147917SReza.Sabdar@Sun.COM 	 * Convert the hostid to hex. The returned string must match
3157917SReza.Sabdar@Sun.COM 	 * the string returned by hostid(1).
3167917SReza.Sabdar@Sun.COM 	 */
3177917SReza.Sabdar@Sun.COM 	hostid = strtoul(hostidstr, 0, 0);
3187917SReza.Sabdar@Sun.COM 	(void) snprintf(hostidstr, sizeof (hostidstr), "%lx", hostid);
3197917SReza.Sabdar@Sun.COM 	reply.hostid = hostidstr;
3207917SReza.Sabdar@Sun.COM 
3217917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
3227917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_host_info reply");
3237917SReza.Sabdar@Sun.COM }
3247917SReza.Sabdar@Sun.COM 
3257917SReza.Sabdar@Sun.COM 
3267917SReza.Sabdar@Sun.COM /*
3277917SReza.Sabdar@Sun.COM  * ndmpd_config_get_connection_type_v3
3287917SReza.Sabdar@Sun.COM  *
3297917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_connection_type_request.
3307917SReza.Sabdar@Sun.COM  * A list of supported data connection types is returned.
3317917SReza.Sabdar@Sun.COM  *
3327917SReza.Sabdar@Sun.COM  * Parameters:
3337917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
3347917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
3357917SReza.Sabdar@Sun.COM  *
3367917SReza.Sabdar@Sun.COM  * Returns:
3377917SReza.Sabdar@Sun.COM  *   void
3387917SReza.Sabdar@Sun.COM  */
3397917SReza.Sabdar@Sun.COM /*ARGSUSED*/
3407917SReza.Sabdar@Sun.COM void
ndmpd_config_get_connection_type_v3(ndmp_connection_t * connection,void * body)3417917SReza.Sabdar@Sun.COM ndmpd_config_get_connection_type_v3(ndmp_connection_t *connection,
3427917SReza.Sabdar@Sun.COM     void *body)
3437917SReza.Sabdar@Sun.COM {
3447917SReza.Sabdar@Sun.COM 	ndmp_config_get_connection_type_reply_v3 reply;
3457917SReza.Sabdar@Sun.COM 	ndmp_addr_type addr_types[2];
3467917SReza.Sabdar@Sun.COM 
3477917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
3487917SReza.Sabdar@Sun.COM 
3497917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
3507917SReza.Sabdar@Sun.COM 
3517917SReza.Sabdar@Sun.COM 	addr_types[0] = NDMP_ADDR_LOCAL;
3527917SReza.Sabdar@Sun.COM 	addr_types[1] = NDMP_ADDR_TCP;
3537917SReza.Sabdar@Sun.COM 	reply.addr_types.addr_types_len = 2;
3547917SReza.Sabdar@Sun.COM 	reply.addr_types.addr_types_val = addr_types;
3557917SReza.Sabdar@Sun.COM 
3567917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
3577917SReza.Sabdar@Sun.COM 	    "sending config_get_connection_type_v3 reply");
3587917SReza.Sabdar@Sun.COM }
3597917SReza.Sabdar@Sun.COM 
3607917SReza.Sabdar@Sun.COM 
3617917SReza.Sabdar@Sun.COM 
3627917SReza.Sabdar@Sun.COM /*
3637917SReza.Sabdar@Sun.COM  * ndmpd_config_get_auth_attr_v3
3647917SReza.Sabdar@Sun.COM  *
3657917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_auth_attr request.
3667917SReza.Sabdar@Sun.COM  * Authorization type specific information is returned.
3677917SReza.Sabdar@Sun.COM  *
3687917SReza.Sabdar@Sun.COM  * Parameters:
3697917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
3707917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
3717917SReza.Sabdar@Sun.COM  *
3727917SReza.Sabdar@Sun.COM  * Returns:
3737917SReza.Sabdar@Sun.COM  *   void
3747917SReza.Sabdar@Sun.COM  */
3757917SReza.Sabdar@Sun.COM void
ndmpd_config_get_auth_attr_v3(ndmp_connection_t * connection,void * body)3767917SReza.Sabdar@Sun.COM ndmpd_config_get_auth_attr_v3(ndmp_connection_t *connection, void *body)
3777917SReza.Sabdar@Sun.COM {
3787917SReza.Sabdar@Sun.COM 	ndmp_config_get_auth_attr_request *request;
3797917SReza.Sabdar@Sun.COM 	ndmp_config_get_auth_attr_reply reply;
3807917SReza.Sabdar@Sun.COM 	ndmpd_session_t *session = ndmp_get_client_data(connection);
3817917SReza.Sabdar@Sun.COM 
3827917SReza.Sabdar@Sun.COM 	request = (ndmp_config_get_auth_attr_request *)body;
3837917SReza.Sabdar@Sun.COM 
3847917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
3857917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
3867917SReza.Sabdar@Sun.COM 	reply.server_attr.auth_type = request->auth_type;
3877917SReza.Sabdar@Sun.COM 
3887917SReza.Sabdar@Sun.COM 	switch (request->auth_type) {
3897917SReza.Sabdar@Sun.COM 	case NDMP_AUTH_TEXT:
3907917SReza.Sabdar@Sun.COM 		break;
3917917SReza.Sabdar@Sun.COM 	case NDMP_AUTH_MD5:
3927917SReza.Sabdar@Sun.COM 		/* Create a 64 bytes random session challenge */
3937917SReza.Sabdar@Sun.COM 		randomize(session->ns_challenge, MD5_CHALLENGE_SIZE);
3947917SReza.Sabdar@Sun.COM 		(void) memcpy(reply.server_attr.ndmp_auth_attr_u.challenge,
3957917SReza.Sabdar@Sun.COM 		    session->ns_challenge, MD5_CHALLENGE_SIZE);
3967917SReza.Sabdar@Sun.COM 		break;
3977917SReza.Sabdar@Sun.COM 	case NDMP_AUTH_NONE:
3987917SReza.Sabdar@Sun.COM 		/* FALL THROUGH */
3997917SReza.Sabdar@Sun.COM 	default:
4007917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR, "Invalid authentication type: %d.",
4017917SReza.Sabdar@Sun.COM 		    request->auth_type);
4027917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR,
4037917SReza.Sabdar@Sun.COM 		    "Supported authentication types are md5 and cleartext.");
4047917SReza.Sabdar@Sun.COM 		reply.error = NDMP_ILLEGAL_ARGS_ERR;
4057917SReza.Sabdar@Sun.COM 		break;
4067917SReza.Sabdar@Sun.COM 	}
4077917SReza.Sabdar@Sun.COM 
4087917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *) &reply,
4097917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_auth_attr_v3 reply");
4107917SReza.Sabdar@Sun.COM }
4117917SReza.Sabdar@Sun.COM 
4127917SReza.Sabdar@Sun.COM 
4137917SReza.Sabdar@Sun.COM /*
4147917SReza.Sabdar@Sun.COM  * ndmpd_config_get_butype_info_v3
4157917SReza.Sabdar@Sun.COM  *
4167917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_butype_info_request.
4177917SReza.Sabdar@Sun.COM  * Information about all supported backup types are returned.
4187917SReza.Sabdar@Sun.COM  *
4197917SReza.Sabdar@Sun.COM  * Parameters:
4207917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
4217917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
4227917SReza.Sabdar@Sun.COM  *
4237917SReza.Sabdar@Sun.COM  * Returns:
4247917SReza.Sabdar@Sun.COM  *   void
4257917SReza.Sabdar@Sun.COM  */
4267917SReza.Sabdar@Sun.COM /*ARGSUSED*/
4277917SReza.Sabdar@Sun.COM void
ndmpd_config_get_butype_info_v3(ndmp_connection_t * connection,void * body)4287917SReza.Sabdar@Sun.COM ndmpd_config_get_butype_info_v3(ndmp_connection_t *connection, void *body)
4297917SReza.Sabdar@Sun.COM {
4307917SReza.Sabdar@Sun.COM 	ndmp_config_get_butype_info_reply_v3 reply;
43112186SJanice.Chang@Sun.COM 	ndmp_butype_info info[3];
4327917SReza.Sabdar@Sun.COM 	ndmp_pval envs[8];
4337917SReza.Sabdar@Sun.COM 	ulong_t attrs;
4347917SReza.Sabdar@Sun.COM 	ndmp_pval *envp = envs;
4357917SReza.Sabdar@Sun.COM 
43612186SJanice.Chang@Sun.COM 	ndmp_pval zfs_envs[9];
43712186SJanice.Chang@Sun.COM 	ulong_t zfs_attrs;
43812186SJanice.Chang@Sun.COM 	ndmp_pval *zfs_envp = zfs_envs;
43912186SJanice.Chang@Sun.COM 
4407917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
4417917SReza.Sabdar@Sun.COM 
4427917SReza.Sabdar@Sun.COM 	/*
44312186SJanice.Chang@Sun.COM 	 * Supported environment variables and their default values
44412186SJanice.Chang@Sun.COM 	 * for dump and tar.
44512186SJanice.Chang@Sun.COM 	 *
4467917SReza.Sabdar@Sun.COM 	 * The environment variables for dump and tar format are the
4477917SReza.Sabdar@Sun.COM 	 * same, because we use the same backup engine for both.
4487917SReza.Sabdar@Sun.COM 	 */
4497917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "PREFIX", "");
4507917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "TYPE", "");
4517917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "DIRECT", "n");
4527917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "HIST", "n");
4537917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "FILESYSTEM", "");
4547917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "LEVEL", "0");
4557917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "UPDATE", "TRUE");
4567917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "BASE_DATE", "");
4577917SReza.Sabdar@Sun.COM 
4587917SReza.Sabdar@Sun.COM 	attrs = NDMP_BUTYPE_BACKUP_FILE_HISTORY |
4597917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_RECOVER_FILELIST |
4607917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_DIRECT |
4617917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_INCREMENTAL |
4627917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_UTF8 |
4637917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_RECOVER_UTF8;
4647917SReza.Sabdar@Sun.COM 
4657917SReza.Sabdar@Sun.COM 	/* If DAR supported */
4667917SReza.Sabdar@Sun.COM 	if (ndmp_dar_support)
4677917SReza.Sabdar@Sun.COM 		attrs |= NDMP_BUTYPE_RECOVER_DIRECT;
4687917SReza.Sabdar@Sun.COM 
4697917SReza.Sabdar@Sun.COM 	/* tar backup type */
4707917SReza.Sabdar@Sun.COM 	info[0].butype_name = "tar";
4717917SReza.Sabdar@Sun.COM 	info[0].default_env.default_env_len = ARRAY_LEN(envs, ndmp_pval);
4727917SReza.Sabdar@Sun.COM 	info[0].default_env.default_env_val = envs;
4737917SReza.Sabdar@Sun.COM 	info[0].attrs = attrs;
4747917SReza.Sabdar@Sun.COM 
4757917SReza.Sabdar@Sun.COM 	/* dump backup type */
4767917SReza.Sabdar@Sun.COM 	info[1].butype_name = "dump";
4777917SReza.Sabdar@Sun.COM 	info[1].default_env.default_env_len = ARRAY_LEN(envs, ndmp_pval);
4787917SReza.Sabdar@Sun.COM 	info[1].default_env.default_env_val = envs;
4797917SReza.Sabdar@Sun.COM 	info[1].attrs = attrs;
4807917SReza.Sabdar@Sun.COM 
48112186SJanice.Chang@Sun.COM 	/*
48212186SJanice.Chang@Sun.COM 	 * Supported environment variables and their default values
48312186SJanice.Chang@Sun.COM 	 * for type "zfs."
48412186SJanice.Chang@Sun.COM 	 */
48512186SJanice.Chang@Sun.COM 
48612186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "PREFIX", "");
48712186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "FILESYSTEM", "");
48812186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "TYPE", "zfs");
48912186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "HIST", "n");
49012186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "LEVEL", "0");
49112186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "ZFS_MODE", "recursive");
49212186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "ZFS_FORCE", "FALSE");
49312186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "UPDATE", "TRUE");
49412186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "DMP_NAME", "level");
49512186SJanice.Chang@Sun.COM 
49612186SJanice.Chang@Sun.COM 	zfs_attrs = NDMP_BUTYPE_BACKUP_UTF8 |
49712186SJanice.Chang@Sun.COM 	    NDMP_BUTYPE_RECOVER_UTF8 |
49812669SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_DIRECT |
49912186SJanice.Chang@Sun.COM 	    NDMP_BUTYPE_BACKUP_INCREMENTAL;
50012186SJanice.Chang@Sun.COM 
50112186SJanice.Chang@Sun.COM 	/* zfs backup type */
50212186SJanice.Chang@Sun.COM 	info[2].butype_name = "zfs";
50312186SJanice.Chang@Sun.COM 	info[2].default_env.default_env_len = ARRAY_LEN(zfs_envs, ndmp_pval);
50412186SJanice.Chang@Sun.COM 	info[2].default_env.default_env_val = zfs_envs;
50512186SJanice.Chang@Sun.COM 	info[2].attrs = zfs_attrs;
50612186SJanice.Chang@Sun.COM 
5077917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
5087917SReza.Sabdar@Sun.COM 	reply.butype_info.butype_info_len = ARRAY_LEN(info, ndmp_butype_info);
5097917SReza.Sabdar@Sun.COM 	reply.butype_info.butype_info_val = info;
5107917SReza.Sabdar@Sun.COM 
5117917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
5127917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_butype_info reply");
5137917SReza.Sabdar@Sun.COM }
5147917SReza.Sabdar@Sun.COM 
5157917SReza.Sabdar@Sun.COM /*
5167917SReza.Sabdar@Sun.COM  * ndmpd_config_get_fs_info_v3
5177917SReza.Sabdar@Sun.COM  *
5187917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_fs_info_request.
5197917SReza.Sabdar@Sun.COM  * Information about all mounted file systems is returned.
5207917SReza.Sabdar@Sun.COM  *
5217917SReza.Sabdar@Sun.COM  * Parameters:
5227917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
5237917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
5247917SReza.Sabdar@Sun.COM  *
5257917SReza.Sabdar@Sun.COM  * Returns:
5267917SReza.Sabdar@Sun.COM  *   void
5277917SReza.Sabdar@Sun.COM  */
5287917SReza.Sabdar@Sun.COM /*ARGSUSED*/
5297917SReza.Sabdar@Sun.COM void
ndmpd_config_get_fs_info_v3(ndmp_connection_t * connection,void * body)5307917SReza.Sabdar@Sun.COM ndmpd_config_get_fs_info_v3(ndmp_connection_t *connection, void *body)
5317917SReza.Sabdar@Sun.COM {
5327917SReza.Sabdar@Sun.COM 	ndmp_config_get_fs_info_reply_v3 reply;
5337917SReza.Sabdar@Sun.COM 	ndmp_fs_info_v3 *fsip, *fsip_save; /* FS info pointer */
5347917SReza.Sabdar@Sun.COM 	int i, nmnt, fd;
5357917SReza.Sabdar@Sun.COM 	int log_dev_len;
5367917SReza.Sabdar@Sun.COM 	FILE *fp = NULL;
5377917SReza.Sabdar@Sun.COM 	struct mnttab mt, *fs;
5387917SReza.Sabdar@Sun.COM 	struct statvfs64 stat_buf;
5397917SReza.Sabdar@Sun.COM 	ndmp_pval *envp, *save;
5407917SReza.Sabdar@Sun.COM 
5417917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
5427917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
5437917SReza.Sabdar@Sun.COM 
5447917SReza.Sabdar@Sun.COM 	if ((fd = open(MNTTAB, O_RDONLY)) == -1) {
5457917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR, "File mnttab open error: %m.");
5467917SReza.Sabdar@Sun.COM 		reply.error = NDMP_UNDEFINED_ERR;
5477917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
5487917SReza.Sabdar@Sun.COM 		    "sending ndmp_config_get_fs_info reply");
5497917SReza.Sabdar@Sun.COM 		return;
5507917SReza.Sabdar@Sun.COM 	}
5517917SReza.Sabdar@Sun.COM 
5527917SReza.Sabdar@Sun.COM 	/* nothing was found, send an empty reply */
5537917SReza.Sabdar@Sun.COM 	if (ioctl(fd, MNTIOC_NMNTS, &nmnt) != 0 || nmnt <= 0) {
5547917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR, "No file system found.");
5557917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
5567917SReza.Sabdar@Sun.COM 		    "sending ndmp_config_get_fs_info reply");
55712669SReza.Sabdar@Sun.COM 		(void) close(fd);
5587917SReza.Sabdar@Sun.COM 		return;
5597917SReza.Sabdar@Sun.COM 	}
56012669SReza.Sabdar@Sun.COM 	(void) close(fd);
5617917SReza.Sabdar@Sun.COM 
5627917SReza.Sabdar@Sun.COM 	fp = fopen(MNTTAB, "r");
5637917SReza.Sabdar@Sun.COM 	if (!fp) {
5647917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_ERR, "File mnttab open error: %m.");
5657917SReza.Sabdar@Sun.COM 		reply.error = NDMP_UNDEFINED_ERR;
5667917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
5677917SReza.Sabdar@Sun.COM 		    "sending ndmp_config_get_fs_info reply");
5687917SReza.Sabdar@Sun.COM 		return;
5697917SReza.Sabdar@Sun.COM 	}
5707917SReza.Sabdar@Sun.COM 
5717917SReza.Sabdar@Sun.COM 	fsip_save = fsip = ndmp_malloc(sizeof (ndmp_fs_info_v3) * nmnt);
5727917SReza.Sabdar@Sun.COM 	if (!fsip) {
5737917SReza.Sabdar@Sun.COM 		(void) fclose(fp);
5747917SReza.Sabdar@Sun.COM 		reply.error = NDMP_NO_MEM_ERR;
5757917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
5767917SReza.Sabdar@Sun.COM 		    "error sending ndmp_config_get_fs_info reply");
5777917SReza.Sabdar@Sun.COM 		return;
5787917SReza.Sabdar@Sun.COM 	}
5797917SReza.Sabdar@Sun.COM 
5807917SReza.Sabdar@Sun.COM 	/*
5817917SReza.Sabdar@Sun.COM 	 * Re-read the directory and set up file system information.
5827917SReza.Sabdar@Sun.COM 	 */
5837917SReza.Sabdar@Sun.COM 	i = 0;
5847917SReza.Sabdar@Sun.COM 	rewind(fp);
5857917SReza.Sabdar@Sun.COM 	while (i < nmnt && (getmntent(fp, &mt) == 0))
5867917SReza.Sabdar@Sun.COM 
5877917SReza.Sabdar@Sun.COM 	{
5887917SReza.Sabdar@Sun.COM 		fs = &mt;
5897917SReza.Sabdar@Sun.COM 		log_dev_len = strlen(mt.mnt_mountp)+2;
5907917SReza.Sabdar@Sun.COM 		if (!IS_VALID_FS(fs))
5917917SReza.Sabdar@Sun.COM 			continue;
5927917SReza.Sabdar@Sun.COM 
5937917SReza.Sabdar@Sun.COM 		fsip->fs_logical_device = ndmp_malloc(log_dev_len);
5947917SReza.Sabdar@Sun.COM 		fsip->fs_type = ndmp_malloc(MNTTYPE_LEN);
5957917SReza.Sabdar@Sun.COM 		if (!fsip->fs_logical_device || !fsip->fs_type) {
5967917SReza.Sabdar@Sun.COM 			reply.error = NDMP_NO_MEM_ERR;
5977917SReza.Sabdar@Sun.COM 			free(fsip->fs_logical_device);
5987917SReza.Sabdar@Sun.COM 			free(fsip->fs_type);
5997917SReza.Sabdar@Sun.COM 			break;
6007917SReza.Sabdar@Sun.COM 		}
6017917SReza.Sabdar@Sun.COM 		(void) snprintf(fsip->fs_type, MNTTYPE_LEN, "%s",
6027917SReza.Sabdar@Sun.COM 		    fs->mnt_fstype);
6037917SReza.Sabdar@Sun.COM 		(void) snprintf(fsip->fs_logical_device, log_dev_len, "%s",
6047917SReza.Sabdar@Sun.COM 		    fs->mnt_mountp);
6057917SReza.Sabdar@Sun.COM 		fsip->invalid = 0;
6067917SReza.Sabdar@Sun.COM 
6077917SReza.Sabdar@Sun.COM 		if (statvfs64(fs->mnt_mountp, &stat_buf) < 0) {
6087917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG,
6097917SReza.Sabdar@Sun.COM 			    "statvfs(%s) error.", fs->mnt_mountp);
6107917SReza.Sabdar@Sun.COM 			fsip->fs_status =
6117917SReza.Sabdar@Sun.COM 			    "statvfs error: unable to determine filesystem"
6127917SReza.Sabdar@Sun.COM 			    " attributes";
6137917SReza.Sabdar@Sun.COM 		} else {
6147917SReza.Sabdar@Sun.COM 			fsip->invalid = 0;
6157917SReza.Sabdar@Sun.COM 			fsip->total_size =
6167917SReza.Sabdar@Sun.COM 			    long_long_to_quad((u_longlong_t)stat_buf.f_frsize *
6177917SReza.Sabdar@Sun.COM 			    (u_longlong_t)stat_buf.f_blocks);
6187917SReza.Sabdar@Sun.COM 			fsip->used_size =
6197917SReza.Sabdar@Sun.COM 			    long_long_to_quad((u_longlong_t)stat_buf.f_frsize *
6207917SReza.Sabdar@Sun.COM 			    (u_longlong_t)(stat_buf.f_blocks-stat_buf.f_bfree));
6217917SReza.Sabdar@Sun.COM 
6227917SReza.Sabdar@Sun.COM 			fsip->avail_size =
6237917SReza.Sabdar@Sun.COM 			    long_long_to_quad((u_longlong_t)stat_buf.f_frsize *
6247917SReza.Sabdar@Sun.COM 			    (u_longlong_t)stat_buf.f_bfree);
6257917SReza.Sabdar@Sun.COM 			fsip->total_inodes =
6267917SReza.Sabdar@Sun.COM 			    long_long_to_quad((u_longlong_t)stat_buf.f_files);
6277917SReza.Sabdar@Sun.COM 			fsip->used_inodes =
6287917SReza.Sabdar@Sun.COM 			    long_long_to_quad((u_longlong_t)(stat_buf.f_files -
6297917SReza.Sabdar@Sun.COM 			    stat_buf.f_ffree));
6307917SReza.Sabdar@Sun.COM 			fsip->fs_status = "";
6317917SReza.Sabdar@Sun.COM 		}
6327917SReza.Sabdar@Sun.COM 		save = envp = ndmp_malloc(sizeof (ndmp_pval) * V3_N_FS_ENVS);
6337917SReza.Sabdar@Sun.COM 		if (!envp) {
6347917SReza.Sabdar@Sun.COM 			reply.error = NDMP_NO_MEM_ERR;
6357917SReza.Sabdar@Sun.COM 			break;
6367917SReza.Sabdar@Sun.COM 		}
6377917SReza.Sabdar@Sun.COM 		(void) memset((void*)save, 0,
6387917SReza.Sabdar@Sun.COM 		    V3_N_FS_ENVS * sizeof (ndmp_pval));
6397917SReza.Sabdar@Sun.COM 
6407917SReza.Sabdar@Sun.COM 		fsip->fs_env.fs_env_val = envp;
6417917SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "LOCAL", "y");
6427917SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "TYPE", fsip->fs_type);
6437917SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "AVAILABLE_BACKUP", "tar,dump");
6447917SReza.Sabdar@Sun.COM 
6457917SReza.Sabdar@Sun.COM 		if (FS_READONLY(fs) == 0) {
6467917SReza.Sabdar@Sun.COM 			NDMP_SETENV(envp, "AVAILABLE_RECOVERY", "tar,dump");
6477917SReza.Sabdar@Sun.COM 		}
6487917SReza.Sabdar@Sun.COM 
6497917SReza.Sabdar@Sun.COM 		fsip->fs_env.fs_env_len = envp - save;
6507917SReza.Sabdar@Sun.COM 		i++;
6517917SReza.Sabdar@Sun.COM 		fsip++;
6527917SReza.Sabdar@Sun.COM 	}
6537917SReza.Sabdar@Sun.COM 	(void) fclose(fp);
6547917SReza.Sabdar@Sun.COM 	if (reply.error == NDMP_NO_ERR) {
6557917SReza.Sabdar@Sun.COM 		reply.fs_info.fs_info_len = i;
6567917SReza.Sabdar@Sun.COM 		reply.fs_info.fs_info_val = fsip_save;
6577917SReza.Sabdar@Sun.COM 	} else {
6587917SReza.Sabdar@Sun.COM 		reply.fs_info.fs_info_len = 0;
6597917SReza.Sabdar@Sun.COM 		reply.fs_info.fs_info_val = NULL;
6607917SReza.Sabdar@Sun.COM 	}
6617917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
6627917SReza.Sabdar@Sun.COM 	    "error sending ndmp_config_get_fs_info reply");
6637917SReza.Sabdar@Sun.COM 
6647917SReza.Sabdar@Sun.COM 	fsip = fsip_save;
6657917SReza.Sabdar@Sun.COM 	while (--i >= 0) {
6667917SReza.Sabdar@Sun.COM 		free(fsip->fs_logical_device);
6677917SReza.Sabdar@Sun.COM 		free(fsip->fs_env.fs_env_val);
6687917SReza.Sabdar@Sun.COM 		free(fsip->fs_type);
6697917SReza.Sabdar@Sun.COM 		fsip++;
6707917SReza.Sabdar@Sun.COM 	}
6717917SReza.Sabdar@Sun.COM 
6727917SReza.Sabdar@Sun.COM 	free(fsip_save);
6737917SReza.Sabdar@Sun.COM }
6747917SReza.Sabdar@Sun.COM 
6757917SReza.Sabdar@Sun.COM 
6767917SReza.Sabdar@Sun.COM /*
6777917SReza.Sabdar@Sun.COM  * ndmpd_config_get_tape_info_v3
6787917SReza.Sabdar@Sun.COM  *
6797917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_tape_info_request.
6807917SReza.Sabdar@Sun.COM  * Information about all connected tape drives is returned.
6817917SReza.Sabdar@Sun.COM  *
6827917SReza.Sabdar@Sun.COM  * Parameters:
6837917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
6847917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
6857917SReza.Sabdar@Sun.COM  *
6867917SReza.Sabdar@Sun.COM  * Returns:
6877917SReza.Sabdar@Sun.COM  *   void
6887917SReza.Sabdar@Sun.COM  */
6897917SReza.Sabdar@Sun.COM /*ARGSUSED*/
6907917SReza.Sabdar@Sun.COM void
ndmpd_config_get_tape_info_v3(ndmp_connection_t * connection,void * body)6917917SReza.Sabdar@Sun.COM ndmpd_config_get_tape_info_v3(ndmp_connection_t *connection, void *body)
6927917SReza.Sabdar@Sun.COM {
6937917SReza.Sabdar@Sun.COM 	ndmp_config_get_tape_info_reply_v3 reply;
6947917SReza.Sabdar@Sun.COM 	ndmp_device_info_v3 *tip, *tip_save = NULL; /* tape info pointer */
6957917SReza.Sabdar@Sun.COM 	ndmp_device_capability_v3 *dcp;
6967917SReza.Sabdar@Sun.COM 	ndmp_device_capability_v3 *dcp_save = NULL; /* dev capability pointer */
6977917SReza.Sabdar@Sun.COM 	int i, n, max;
6987917SReza.Sabdar@Sun.COM 	sasd_drive_t *sd;
6997917SReza.Sabdar@Sun.COM 	scsi_link_t *sl;
7008193SReza.Sabdar@Sun.COM 	ndmp_pval *envp, *envp_save = NULL;
7018193SReza.Sabdar@Sun.COM 	ndmp_pval *envp_head;
7027917SReza.Sabdar@Sun.COM 
7037917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
7047917SReza.Sabdar@Sun.COM 	max = sasd_dev_count();
7057917SReza.Sabdar@Sun.COM 
7067917SReza.Sabdar@Sun.COM 	tip_save = tip = ndmp_malloc(sizeof (ndmp_device_info_v3) * max);
7077917SReza.Sabdar@Sun.COM 	dcp_save = dcp = ndmp_malloc(sizeof (ndmp_device_capability_v3) * max);
7088193SReza.Sabdar@Sun.COM 	envp_save = envp = ndmp_malloc(sizeof (ndmp_pval) * max * 3);
7098193SReza.Sabdar@Sun.COM 	if (!tip_save || !dcp_save || !envp_save) {
7107917SReza.Sabdar@Sun.COM 		free(tip_save);
7117917SReza.Sabdar@Sun.COM 		free(dcp_save);
7128193SReza.Sabdar@Sun.COM 		free(envp_save);
7137917SReza.Sabdar@Sun.COM 		reply.error = NDMP_NO_MEM_ERR;
7147917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
7157917SReza.Sabdar@Sun.COM 		    "error sending ndmp_config_get_tape_info reply");
7167917SReza.Sabdar@Sun.COM 		return;
7177917SReza.Sabdar@Sun.COM 	}
7187917SReza.Sabdar@Sun.COM 
7197917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
7207917SReza.Sabdar@Sun.COM 
7217917SReza.Sabdar@Sun.COM 	for (i = n = 0; i < max; i++) {
7227917SReza.Sabdar@Sun.COM 		if (!(sl = sasd_dev_slink(i)) || !(sd = sasd_drive(i)))
7237917SReza.Sabdar@Sun.COM 			continue;
7247917SReza.Sabdar@Sun.COM 		if (sl->sl_type != DTYPE_SEQUENTIAL)
7257917SReza.Sabdar@Sun.COM 			continue;
726*13024SRandall.Ralphs@Sun.COM 		/*
727*13024SRandall.Ralphs@Sun.COM 		 * Don't report dead links.
728*13024SRandall.Ralphs@Sun.COM 		 */
729*13024SRandall.Ralphs@Sun.COM 		if ((access(sd->sd_name, F_OK) == -1) && (errno == ENOENT))
730*13024SRandall.Ralphs@Sun.COM 			continue;
7317917SReza.Sabdar@Sun.COM 
7327917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG,
7337917SReza.Sabdar@Sun.COM 		    "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name);
7347917SReza.Sabdar@Sun.COM 
7358193SReza.Sabdar@Sun.COM 		envp_head = envp;
7368193SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "EXECUTE_CDB", "b");
7378193SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial);
7388193SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "WORLD_WIDE_NAME", sd->sd_wwn);
7398193SReza.Sabdar@Sun.COM 
7407917SReza.Sabdar@Sun.COM 		tip->model = sd->sd_id; /* like "DLT7000	 " */
7417917SReza.Sabdar@Sun.COM 		tip->caplist.caplist_len = 1;
7427917SReza.Sabdar@Sun.COM 		tip->caplist.caplist_val = dcp;
7437917SReza.Sabdar@Sun.COM 		dcp->device = sd->sd_name; /* like "isp1t060" */
7447917SReza.Sabdar@Sun.COM 		dcp->attr = 0;
7458193SReza.Sabdar@Sun.COM 		dcp->capability.capability_len = 3;
7468193SReza.Sabdar@Sun.COM 		dcp->capability.capability_val = envp_head;
7477917SReza.Sabdar@Sun.COM 		tip++;
7487917SReza.Sabdar@Sun.COM 		dcp++;
7497917SReza.Sabdar@Sun.COM 		n++;
7507917SReza.Sabdar@Sun.COM 	}
7517917SReza.Sabdar@Sun.COM 
7527917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "n %d", n);
7537917SReza.Sabdar@Sun.COM 
7547917SReza.Sabdar@Sun.COM 	/*
7557917SReza.Sabdar@Sun.COM 	 * We should not receive the get_tape_info when three-way backup is
7567917SReza.Sabdar@Sun.COM 	 * running and we are acting as just data, but some clients try
7577917SReza.Sabdar@Sun.COM 	 * to get the Tape information anyway.
7587917SReza.Sabdar@Sun.COM 	 */
7597917SReza.Sabdar@Sun.COM 	if (n == 0 || max <= 0) {
7607917SReza.Sabdar@Sun.COM 		reply.error = NDMP_NO_DEVICE_ERR;
7617917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
7627917SReza.Sabdar@Sun.COM 		    "error sending ndmp_config_get_tape_info reply");
7638193SReza.Sabdar@Sun.COM 		free(tip_save); free(dcp_save); free(envp_save);
7647917SReza.Sabdar@Sun.COM 		return;
7657917SReza.Sabdar@Sun.COM 	}
7667917SReza.Sabdar@Sun.COM 
7677917SReza.Sabdar@Sun.COM 
7687917SReza.Sabdar@Sun.COM 	reply.tape_info.tape_info_len = n;
7697917SReza.Sabdar@Sun.COM 	reply.tape_info.tape_info_val = tip_save;
7707917SReza.Sabdar@Sun.COM 
7717917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
7727917SReza.Sabdar@Sun.COM 	    "error sending ndmp_config_get_tape_info reply");
7737917SReza.Sabdar@Sun.COM 
7747917SReza.Sabdar@Sun.COM 	free(tip_save);
7757917SReza.Sabdar@Sun.COM 	free(dcp_save);
7768193SReza.Sabdar@Sun.COM 	free(envp_save);
7777917SReza.Sabdar@Sun.COM }
7787917SReza.Sabdar@Sun.COM 
7797917SReza.Sabdar@Sun.COM 
7807917SReza.Sabdar@Sun.COM /*
7817917SReza.Sabdar@Sun.COM  * ndmpd_config_get_scsi_info_v3
7827917SReza.Sabdar@Sun.COM  *
7837917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_tape_scsi_request.
7847917SReza.Sabdar@Sun.COM  * Information about all connected scsi tape stacker and jukeboxes
7857917SReza.Sabdar@Sun.COM  * is returned.
7867917SReza.Sabdar@Sun.COM  *
7877917SReza.Sabdar@Sun.COM  * Parameters:
7887917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
7897917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
7907917SReza.Sabdar@Sun.COM  *
7917917SReza.Sabdar@Sun.COM  * Returns:
7927917SReza.Sabdar@Sun.COM  *   void
7937917SReza.Sabdar@Sun.COM  */
7947917SReza.Sabdar@Sun.COM /*ARGSUSED*/
7957917SReza.Sabdar@Sun.COM void
ndmpd_config_get_scsi_info_v3(ndmp_connection_t * connection,void * body)7967917SReza.Sabdar@Sun.COM ndmpd_config_get_scsi_info_v3(ndmp_connection_t *connection, void *body)
7977917SReza.Sabdar@Sun.COM {
7987917SReza.Sabdar@Sun.COM 	ndmp_config_get_scsi_info_reply_v3 reply;
7997917SReza.Sabdar@Sun.COM 	ndmp_device_info_v3 *sip, *sip_save;
8007917SReza.Sabdar@Sun.COM 	ndmp_device_capability_v3 *dcp, *dcp_save;
8017917SReza.Sabdar@Sun.COM 	int i, n, max;
8027917SReza.Sabdar@Sun.COM 	sasd_drive_t *sd;
8037917SReza.Sabdar@Sun.COM 	scsi_link_t *sl;
8048193SReza.Sabdar@Sun.COM 	ndmp_pval *envp, *envp_save = NULL;
8058193SReza.Sabdar@Sun.COM 	ndmp_pval *envp_head;
8067917SReza.Sabdar@Sun.COM 
8077917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
8087917SReza.Sabdar@Sun.COM 	max = sasd_dev_count();
8097917SReza.Sabdar@Sun.COM 	sip_save = sip = ndmp_malloc(sizeof (ndmp_device_info_v3) * max);
8107917SReza.Sabdar@Sun.COM 	dcp_save = dcp = ndmp_malloc(sizeof (ndmp_device_capability_v3) * max);
8118193SReza.Sabdar@Sun.COM 	envp_save = envp = ndmp_malloc(sizeof (ndmp_pval) * max * 2);
8128193SReza.Sabdar@Sun.COM 	if (!sip_save || !dcp_save || !envp_save) {
8137917SReza.Sabdar@Sun.COM 		free(sip_save);
8147917SReza.Sabdar@Sun.COM 		free(dcp_save);
8158193SReza.Sabdar@Sun.COM 		free(envp_save);
8167917SReza.Sabdar@Sun.COM 		reply.error = NDMP_NO_MEM_ERR;
8177917SReza.Sabdar@Sun.COM 		ndmp_send_reply(connection, (void *)&reply,
8188193SReza.Sabdar@Sun.COM 		    "error sending ndmp_config_get_scsi_info reply");
8197917SReza.Sabdar@Sun.COM 		return;
8207917SReza.Sabdar@Sun.COM 	}
8217917SReza.Sabdar@Sun.COM 
8227917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
8237917SReza.Sabdar@Sun.COM 	for (i = n = 0; i < max; i++) {
8247917SReza.Sabdar@Sun.COM 		if (!(sl = sasd_dev_slink(i)) || !(sd = sasd_drive(i)))
8257917SReza.Sabdar@Sun.COM 			continue;
8267917SReza.Sabdar@Sun.COM 		if (sl->sl_type != DTYPE_CHANGER)
8277917SReza.Sabdar@Sun.COM 			continue;
828*13024SRandall.Ralphs@Sun.COM 		/*
829*13024SRandall.Ralphs@Sun.COM 		 * Don't report dead links.
830*13024SRandall.Ralphs@Sun.COM 		 */
831*13024SRandall.Ralphs@Sun.COM 		if ((access(sd->sd_name, F_OK) == -1) && (errno == ENOENT))
832*13024SRandall.Ralphs@Sun.COM 			continue;
8337917SReza.Sabdar@Sun.COM 
8347917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG,
8357917SReza.Sabdar@Sun.COM 		    "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name);
8367917SReza.Sabdar@Sun.COM 
8378193SReza.Sabdar@Sun.COM 		envp_head = envp;
8388193SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial);
8398193SReza.Sabdar@Sun.COM 		NDMP_SETENV(envp, "WORLD_WIDE_NAME", sd->sd_wwn);
8408193SReza.Sabdar@Sun.COM 
8417917SReza.Sabdar@Sun.COM 		sip->model = sd->sd_id; /* like "Powerstor L200  " */
8427917SReza.Sabdar@Sun.COM 		sip->caplist.caplist_len = 1;
8437917SReza.Sabdar@Sun.COM 		sip->caplist.caplist_val = dcp;
8447917SReza.Sabdar@Sun.COM 		dcp->device = sd->sd_name; /* like "isp1m000" */
8457917SReza.Sabdar@Sun.COM 
8467917SReza.Sabdar@Sun.COM 		dcp->attr = 0;
8478193SReza.Sabdar@Sun.COM 		dcp->capability.capability_len = 2;
8488193SReza.Sabdar@Sun.COM 		dcp->capability.capability_val = envp_head;
8497917SReza.Sabdar@Sun.COM 		sip++;
8507917SReza.Sabdar@Sun.COM 		dcp++;
8517917SReza.Sabdar@Sun.COM 		n++;
8527917SReza.Sabdar@Sun.COM 	}
8537917SReza.Sabdar@Sun.COM 
8547917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "n %d", n);
8557917SReza.Sabdar@Sun.COM 
8567917SReza.Sabdar@Sun.COM 	reply.scsi_info.scsi_info_len = n;
8577917SReza.Sabdar@Sun.COM 	reply.scsi_info.scsi_info_val = sip_save;
8587917SReza.Sabdar@Sun.COM 
8597917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
8607917SReza.Sabdar@Sun.COM 	    "error sending ndmp_config_get_scsi_info reply");
8617917SReza.Sabdar@Sun.COM 
8627917SReza.Sabdar@Sun.COM 	free(sip_save);
8637917SReza.Sabdar@Sun.COM 	free(dcp_save);
8648193SReza.Sabdar@Sun.COM 	free(envp_save);
8657917SReza.Sabdar@Sun.COM }
8667917SReza.Sabdar@Sun.COM 
8677917SReza.Sabdar@Sun.COM 
8687917SReza.Sabdar@Sun.COM /*
8697917SReza.Sabdar@Sun.COM  * ndmpd_config_get_server_info_v3
8707917SReza.Sabdar@Sun.COM  *
8717917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_server_info request.
8727917SReza.Sabdar@Sun.COM  * Host specific information is returned.
8737917SReza.Sabdar@Sun.COM  *
8747917SReza.Sabdar@Sun.COM  * Parameters:
8757917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
8767917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
8777917SReza.Sabdar@Sun.COM  *
8787917SReza.Sabdar@Sun.COM  * Returns:
8797917SReza.Sabdar@Sun.COM  *   void
8807917SReza.Sabdar@Sun.COM  */
8817917SReza.Sabdar@Sun.COM /*ARGSUSED*/
8827917SReza.Sabdar@Sun.COM void
ndmpd_config_get_server_info_v3(ndmp_connection_t * connection,void * body)8837917SReza.Sabdar@Sun.COM ndmpd_config_get_server_info_v3(ndmp_connection_t *connection, void *body)
8847917SReza.Sabdar@Sun.COM {
8857917SReza.Sabdar@Sun.COM 	ndmp_config_get_server_info_reply_v3 reply;
8867917SReza.Sabdar@Sun.COM 	ndmp_auth_type auth_types[2];
8877917SReza.Sabdar@Sun.COM 	char rev_number[10];
8887917SReza.Sabdar@Sun.COM 	ndmpd_session_t *session = ndmp_get_client_data(connection);
8897917SReza.Sabdar@Sun.COM 
8907917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
8917917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
8927917SReza.Sabdar@Sun.COM 
8937917SReza.Sabdar@Sun.COM 	if (connection->conn_authorized ||
8947917SReza.Sabdar@Sun.COM 	    session->ns_protocol_version != NDMPV4) {
8957917SReza.Sabdar@Sun.COM 		reply.vendor_name = VENDOR_NAME;
8967917SReza.Sabdar@Sun.COM 		reply.product_name = PRODUCT_NAME;
8977917SReza.Sabdar@Sun.COM 		(void) snprintf(rev_number, sizeof (rev_number), "%d",
8987917SReza.Sabdar@Sun.COM 		    ndmp_ver);
8997917SReza.Sabdar@Sun.COM 		reply.revision_number = rev_number;
9007917SReza.Sabdar@Sun.COM 	} else {
9017917SReza.Sabdar@Sun.COM 		reply.vendor_name = "\0";
9027917SReza.Sabdar@Sun.COM 		reply.product_name = "\0";
9037917SReza.Sabdar@Sun.COM 		reply.revision_number = "\0";
9047917SReza.Sabdar@Sun.COM 	}
9057917SReza.Sabdar@Sun.COM 
9067917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG,
9077917SReza.Sabdar@Sun.COM 	    "vendor \"%s\", product \"%s\" rev \"%s\"",
9087917SReza.Sabdar@Sun.COM 	    reply.vendor_name, reply.product_name, reply.revision_number);
9097917SReza.Sabdar@Sun.COM 
9107917SReza.Sabdar@Sun.COM 	auth_types[0] = NDMP_AUTH_TEXT;
9117917SReza.Sabdar@Sun.COM 	auth_types[1] = NDMP_AUTH_MD5;
9127917SReza.Sabdar@Sun.COM 	reply.auth_type.auth_type_len = ARRAY_LEN(auth_types, ndmp_auth_type);
9137917SReza.Sabdar@Sun.COM 	reply.auth_type.auth_type_val = auth_types;
9147917SReza.Sabdar@Sun.COM 
9157917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
9167917SReza.Sabdar@Sun.COM 	    "error sending ndmp_config_get_server_info reply");
9177917SReza.Sabdar@Sun.COM }
9187917SReza.Sabdar@Sun.COM 
9197917SReza.Sabdar@Sun.COM 
9207917SReza.Sabdar@Sun.COM 
9217917SReza.Sabdar@Sun.COM /*
9227917SReza.Sabdar@Sun.COM  * ************************************************************************
9237917SReza.Sabdar@Sun.COM  * NDMP V4 HANDLERS
9247917SReza.Sabdar@Sun.COM  * ************************************************************************
9257917SReza.Sabdar@Sun.COM  */
9267917SReza.Sabdar@Sun.COM 
9277917SReza.Sabdar@Sun.COM /*
9287917SReza.Sabdar@Sun.COM  * ndmpd_config_get_butype_info_v4
9297917SReza.Sabdar@Sun.COM  *
9307917SReza.Sabdar@Sun.COM  * This handler handles the ndmp_config_get_butype_info_request.
9317917SReza.Sabdar@Sun.COM  * Information about all supported backup types are returned.
9327917SReza.Sabdar@Sun.COM  *
9337917SReza.Sabdar@Sun.COM  * Parameters:
9347917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
9357917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
9367917SReza.Sabdar@Sun.COM  *
9377917SReza.Sabdar@Sun.COM  * Returns:
9387917SReza.Sabdar@Sun.COM  *   void
9397917SReza.Sabdar@Sun.COM  */
9407917SReza.Sabdar@Sun.COM /*ARGSUSED*/
9417917SReza.Sabdar@Sun.COM void
ndmpd_config_get_butype_info_v4(ndmp_connection_t * connection,void * body)9427917SReza.Sabdar@Sun.COM ndmpd_config_get_butype_info_v4(ndmp_connection_t *connection, void *body)
9437917SReza.Sabdar@Sun.COM {
9447917SReza.Sabdar@Sun.COM 	ndmp_config_get_butype_info_reply_v4 reply;
94512186SJanice.Chang@Sun.COM 	ndmp_butype_info info[3];
94612186SJanice.Chang@Sun.COM 
9477917SReza.Sabdar@Sun.COM 	ndmp_pval envs[12];
9487917SReza.Sabdar@Sun.COM 	ulong_t attrs;
9497917SReza.Sabdar@Sun.COM 	ndmp_pval *envp = envs;
9507917SReza.Sabdar@Sun.COM 
95112186SJanice.Chang@Sun.COM 	ndmp_pval zfs_envs[11];
95212186SJanice.Chang@Sun.COM 	ulong_t zfs_attrs;
95312186SJanice.Chang@Sun.COM 	ndmp_pval *zfs_envp = zfs_envs;
95412186SJanice.Chang@Sun.COM 
95512186SJanice.Chang@Sun.COM 
9567917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
9577917SReza.Sabdar@Sun.COM 
9587917SReza.Sabdar@Sun.COM 	/*
95912186SJanice.Chang@Sun.COM 	 * Supported environment variables and their default values
96012186SJanice.Chang@Sun.COM 	 * for dump and tar.
96112186SJanice.Chang@Sun.COM 	 *
9627917SReza.Sabdar@Sun.COM 	 * The environment variables for dump and tar format are the
9637917SReza.Sabdar@Sun.COM 	 * same, because we use the same backup engine for both.
9647917SReza.Sabdar@Sun.COM 	 */
9657917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "FILESYSTEM", "");
9667917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "DIRECT", "n");
9677917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "RECURSIVE", "n");
9687917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "TYPE", "");
9697917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "USER", "");
9707917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "HIST", "n");
9717917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "PATHNAME_SEPARATOR", "/");
9727917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "LEVEL", "0");
9737917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "EXTRACT", "y");
9747917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "UPDATE", "y");
9757917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "CMD", "");
9767917SReza.Sabdar@Sun.COM 	NDMP_SETENV(envp, "BASE_DATE", "");
9777917SReza.Sabdar@Sun.COM 
9787917SReza.Sabdar@Sun.COM 	attrs = NDMP_BUTYPE_RECOVER_FILELIST |
9797917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_DIRECT |
9807917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_INCREMENTAL |
9817917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_UTF8 |
9827917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_RECOVER_UTF8 |
9837917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_FH_FILE |
9847917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_FH_DIR |
9857917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_RECOVER_FH_FILE |
9867917SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_RECOVER_FH_DIR;
9877917SReza.Sabdar@Sun.COM 
9887917SReza.Sabdar@Sun.COM 	/* If DAR supported */
9897917SReza.Sabdar@Sun.COM 	if (ndmp_dar_support)
9907917SReza.Sabdar@Sun.COM 		attrs |= NDMP_BUTYPE_RECOVER_DIRECT;
9917917SReza.Sabdar@Sun.COM 
9927917SReza.Sabdar@Sun.COM 	/* tar backup type */
9937917SReza.Sabdar@Sun.COM 	info[0].butype_name = "tar";
9947917SReza.Sabdar@Sun.COM 	info[0].default_env.default_env_len = ARRAY_LEN(envs, ndmp_pval);
9957917SReza.Sabdar@Sun.COM 	info[0].default_env.default_env_val = envs;
9967917SReza.Sabdar@Sun.COM 	info[0].attrs = attrs;
9977917SReza.Sabdar@Sun.COM 
9987917SReza.Sabdar@Sun.COM 	/* dump backup type */
9997917SReza.Sabdar@Sun.COM 	info[1].butype_name = "dump";
10007917SReza.Sabdar@Sun.COM 	info[1].default_env.default_env_len = ARRAY_LEN(envs, ndmp_pval);
10017917SReza.Sabdar@Sun.COM 	info[1].default_env.default_env_val = envs;
10027917SReza.Sabdar@Sun.COM 	info[1].attrs = attrs;
10037917SReza.Sabdar@Sun.COM 
100412186SJanice.Chang@Sun.COM 	/*
100512186SJanice.Chang@Sun.COM 	 * Supported environment variables and their default values
100612186SJanice.Chang@Sun.COM 	 * for type "zfs."
100712186SJanice.Chang@Sun.COM 	 */
100812186SJanice.Chang@Sun.COM 
100912186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "USER", "");
101012186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "CMD", "");
101112186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "FILESYSTEM", "");
101212186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "PATHNAME_SEPARATOR", "/");
101312186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "TYPE", "zfs");
101412186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "HIST", "n");
101512186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "LEVEL", "0");
101612186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "ZFS_MODE", "recursive");
101712186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "ZFS_FORCE", "n");
101812186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "UPDATE", "y");
101912186SJanice.Chang@Sun.COM 	NDMP_SETENV(zfs_envp, "DMP_NAME", "level");
102012186SJanice.Chang@Sun.COM 
102112186SJanice.Chang@Sun.COM 	zfs_attrs = NDMP_BUTYPE_BACKUP_UTF8 |
102212186SJanice.Chang@Sun.COM 	    NDMP_BUTYPE_RECOVER_UTF8 |
102312669SReza.Sabdar@Sun.COM 	    NDMP_BUTYPE_BACKUP_DIRECT |
102412186SJanice.Chang@Sun.COM 	    NDMP_BUTYPE_BACKUP_INCREMENTAL;
102512186SJanice.Chang@Sun.COM 
102612186SJanice.Chang@Sun.COM 	/* zfs backup type */
102712186SJanice.Chang@Sun.COM 	info[2].butype_name = "zfs";
102812186SJanice.Chang@Sun.COM 	info[2].default_env.default_env_len = ARRAY_LEN(zfs_envs, ndmp_pval);
102912186SJanice.Chang@Sun.COM 	info[2].default_env.default_env_val = zfs_envs;
103012186SJanice.Chang@Sun.COM 	info[2].attrs = zfs_attrs;
103112186SJanice.Chang@Sun.COM 
10327917SReza.Sabdar@Sun.COM 	reply.error = NDMP_NO_ERR;
10337917SReza.Sabdar@Sun.COM 	reply.butype_info.butype_info_len = ARRAY_LEN(info, ndmp_butype_info);
10347917SReza.Sabdar@Sun.COM 	reply.butype_info.butype_info_val = info;
10357917SReza.Sabdar@Sun.COM 
10367917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
10377917SReza.Sabdar@Sun.COM 	    "sending ndmp_config_get_butype_info reply");
10387917SReza.Sabdar@Sun.COM }
10397917SReza.Sabdar@Sun.COM 
10407917SReza.Sabdar@Sun.COM 
10417917SReza.Sabdar@Sun.COM /*
10427917SReza.Sabdar@Sun.COM  * ndmpd_config_get_ext_list_v4
10437917SReza.Sabdar@Sun.COM  *
10447917SReza.Sabdar@Sun.COM  * This handler handles the ndmpd_config_get_ext_list_v4 request.
10457917SReza.Sabdar@Sun.COM  *
10467917SReza.Sabdar@Sun.COM  * Parameters:
10477917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
10487917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
10497917SReza.Sabdar@Sun.COM  *
10507917SReza.Sabdar@Sun.COM  * Returns:
10517917SReza.Sabdar@Sun.COM  *   void
10527917SReza.Sabdar@Sun.COM  */
10537917SReza.Sabdar@Sun.COM /*ARGSUSED*/
10547917SReza.Sabdar@Sun.COM void
ndmpd_config_get_ext_list_v4(ndmp_connection_t * connection,void * body)10557917SReza.Sabdar@Sun.COM ndmpd_config_get_ext_list_v4(ndmp_connection_t *connection, void *body)
10567917SReza.Sabdar@Sun.COM {
10577917SReza.Sabdar@Sun.COM 	ndmp_config_get_ext_list_reply_v4 reply;
10587917SReza.Sabdar@Sun.COM 	ndmpd_session_t *session = ndmp_get_client_data(connection);
10597917SReza.Sabdar@Sun.COM 
10607917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
10617917SReza.Sabdar@Sun.COM 
10627917SReza.Sabdar@Sun.COM 	if (session->ns_set_ext_list == FALSE)
10637917SReza.Sabdar@Sun.COM 		reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
10647917SReza.Sabdar@Sun.COM 	else
10657917SReza.Sabdar@Sun.COM 		reply.error = NDMP_NO_ERR;
10667917SReza.Sabdar@Sun.COM 
10677917SReza.Sabdar@Sun.COM 	reply.class_list.class_list_val = NULL;
10687917SReza.Sabdar@Sun.COM 	reply.class_list.class_list_len = 0;
10697917SReza.Sabdar@Sun.COM 
10707917SReza.Sabdar@Sun.COM 
10717917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
10727917SReza.Sabdar@Sun.COM 	    "error sending ndmp_config_get_ext_list reply");
10737917SReza.Sabdar@Sun.COM }
10747917SReza.Sabdar@Sun.COM 
10757917SReza.Sabdar@Sun.COM /*
10767917SReza.Sabdar@Sun.COM  * ndmpd_config_set_ext_list_v4
10777917SReza.Sabdar@Sun.COM  *
10787917SReza.Sabdar@Sun.COM  * This handler handles the ndmpd_config_get_ext_list_v4 request.
10797917SReza.Sabdar@Sun.COM  *
10807917SReza.Sabdar@Sun.COM  * Parameters:
10817917SReza.Sabdar@Sun.COM  *   connection (input) - connection handle.
10827917SReza.Sabdar@Sun.COM  *   body       (input) - request message body.
10837917SReza.Sabdar@Sun.COM  *
10847917SReza.Sabdar@Sun.COM  * Returns:
10857917SReza.Sabdar@Sun.COM  *   void
10867917SReza.Sabdar@Sun.COM  */
10877917SReza.Sabdar@Sun.COM /*ARGSUSED*/
10887917SReza.Sabdar@Sun.COM void
ndmpd_config_set_ext_list_v4(ndmp_connection_t * connection,void * body)10897917SReza.Sabdar@Sun.COM ndmpd_config_set_ext_list_v4(ndmp_connection_t *connection, void *body)
10907917SReza.Sabdar@Sun.COM {
10917917SReza.Sabdar@Sun.COM 	ndmp_config_set_ext_list_reply_v4 reply;
10927917SReza.Sabdar@Sun.COM 	ndmpd_session_t *session = ndmp_get_client_data(connection);
10937917SReza.Sabdar@Sun.COM 
10947917SReza.Sabdar@Sun.COM 	(void) memset((void*)&reply, 0, sizeof (reply));
10957917SReza.Sabdar@Sun.COM 	if (session->ns_set_ext_list == TRUE) {
10967917SReza.Sabdar@Sun.COM 		reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
10977917SReza.Sabdar@Sun.COM 	} else {
10987917SReza.Sabdar@Sun.COM 		session->ns_set_ext_list = TRUE;
10997917SReza.Sabdar@Sun.COM 		/*
11007917SReza.Sabdar@Sun.COM 		 * NOTE: for now we are not supporting any extension list,
11017917SReza.Sabdar@Sun.COM 		 * hence this error, when we start to support extensions,
11027917SReza.Sabdar@Sun.COM 		 * this should be validated
11037917SReza.Sabdar@Sun.COM 		 */
11047917SReza.Sabdar@Sun.COM 
11057917SReza.Sabdar@Sun.COM 		reply.error = NDMP_VERSION_NOT_SUPPORTED_ERR;
11067917SReza.Sabdar@Sun.COM 	}
11077917SReza.Sabdar@Sun.COM 
11087917SReza.Sabdar@Sun.COM 	ndmp_send_reply(connection, (void *)&reply,
11097917SReza.Sabdar@Sun.COM 	    "error sending ndmp_config_set_ext_list reply");
11107917SReza.Sabdar@Sun.COM }
11117917SReza.Sabdar@Sun.COM 
11127917SReza.Sabdar@Sun.COM 
11137917SReza.Sabdar@Sun.COM 
11147917SReza.Sabdar@Sun.COM /*
11157917SReza.Sabdar@Sun.COM  * ************************************************************************
11167917SReza.Sabdar@Sun.COM  * LOCALS
11177917SReza.Sabdar@Sun.COM  * ************************************************************************
11187917SReza.Sabdar@Sun.COM  */
11197917SReza.Sabdar@Sun.COM 
11207917SReza.Sabdar@Sun.COM /*
11217917SReza.Sabdar@Sun.COM  * simple_get_attrs
11227917SReza.Sabdar@Sun.COM  *
11237917SReza.Sabdar@Sun.COM  * Set the default attrs for dump mode
11247917SReza.Sabdar@Sun.COM  *
11257917SReza.Sabdar@Sun.COM  * Parameters:
11267917SReza.Sabdar@Sun.COM  *   attributes (output) - the attributes for dump mode
11277917SReza.Sabdar@Sun.COM  *
11287917SReza.Sabdar@Sun.COM  * Returns:
11297917SReza.Sabdar@Sun.COM  *   void
11307917SReza.Sabdar@Sun.COM  */
11317917SReza.Sabdar@Sun.COM static void
simple_get_attrs(ulong_t * attributes)11327917SReza.Sabdar@Sun.COM simple_get_attrs(ulong_t *attributes)
11337917SReza.Sabdar@Sun.COM {
11347917SReza.Sabdar@Sun.COM 	*attributes = NDMP_NO_RECOVER_FHINFO;
11357917SReza.Sabdar@Sun.COM }
1136