17917SReza.Sabdar@Sun.COM /* 2*12186SJanice.Chang@Sun.COM * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 37917SReza.Sabdar@Sun.COM */ 47917SReza.Sabdar@Sun.COM 57917SReza.Sabdar@Sun.COM /* 67917SReza.Sabdar@Sun.COM * BSD 3 Clause License 77917SReza.Sabdar@Sun.COM * 87917SReza.Sabdar@Sun.COM * Copyright (c) 2007, The Storage Networking Industry Association. 97917SReza.Sabdar@Sun.COM * 107917SReza.Sabdar@Sun.COM * Redistribution and use in source and binary forms, with or without 117917SReza.Sabdar@Sun.COM * modification, are permitted provided that the following conditions 127917SReza.Sabdar@Sun.COM * are met: 137917SReza.Sabdar@Sun.COM * - Redistributions of source code must retain the above copyright 147917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer. 157917SReza.Sabdar@Sun.COM * 167917SReza.Sabdar@Sun.COM * - Redistributions in binary form must reproduce the above copyright 177917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer in 187917SReza.Sabdar@Sun.COM * the documentation and/or other materials provided with the 197917SReza.Sabdar@Sun.COM * distribution. 207917SReza.Sabdar@Sun.COM * 217917SReza.Sabdar@Sun.COM * - Neither the name of The Storage Networking Industry Association (SNIA) 227917SReza.Sabdar@Sun.COM * nor the names of its contributors may be used to endorse or promote 237917SReza.Sabdar@Sun.COM * products derived from this software without specific prior written 247917SReza.Sabdar@Sun.COM * permission. 257917SReza.Sabdar@Sun.COM * 267917SReza.Sabdar@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 277917SReza.Sabdar@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 287917SReza.Sabdar@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 297917SReza.Sabdar@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 307917SReza.Sabdar@Sun.COM * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 317917SReza.Sabdar@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 327917SReza.Sabdar@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 337917SReza.Sabdar@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 347917SReza.Sabdar@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 357917SReza.Sabdar@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 367917SReza.Sabdar@Sun.COM * POSSIBILITY OF SUCH DAMAGE. 377917SReza.Sabdar@Sun.COM */ 387917SReza.Sabdar@Sun.COM /* Copyright (c) 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 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 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 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 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 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 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 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 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; 431*12186SJanice.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 436*12186SJanice.Chang@Sun.COM ndmp_pval zfs_envs[9]; 437*12186SJanice.Chang@Sun.COM ulong_t zfs_attrs; 438*12186SJanice.Chang@Sun.COM ndmp_pval *zfs_envp = zfs_envs; 439*12186SJanice.Chang@Sun.COM 4407917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 4417917SReza.Sabdar@Sun.COM 4427917SReza.Sabdar@Sun.COM /* 443*12186SJanice.Chang@Sun.COM * Supported environment variables and their default values 444*12186SJanice.Chang@Sun.COM * for dump and tar. 445*12186SJanice.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 481*12186SJanice.Chang@Sun.COM /* 482*12186SJanice.Chang@Sun.COM * Supported environment variables and their default values 483*12186SJanice.Chang@Sun.COM * for type "zfs." 484*12186SJanice.Chang@Sun.COM */ 485*12186SJanice.Chang@Sun.COM 486*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "PREFIX", ""); 487*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "FILESYSTEM", ""); 488*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "TYPE", "zfs"); 489*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "HIST", "n"); 490*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "LEVEL", "0"); 491*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "ZFS_MODE", "recursive"); 492*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "ZFS_FORCE", "FALSE"); 493*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "UPDATE", "TRUE"); 494*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "DMP_NAME", "level"); 495*12186SJanice.Chang@Sun.COM 496*12186SJanice.Chang@Sun.COM zfs_attrs = NDMP_BUTYPE_BACKUP_UTF8 | 497*12186SJanice.Chang@Sun.COM NDMP_BUTYPE_RECOVER_UTF8 | 498*12186SJanice.Chang@Sun.COM NDMP_BUTYPE_BACKUP_INCREMENTAL; 499*12186SJanice.Chang@Sun.COM 500*12186SJanice.Chang@Sun.COM /* zfs backup type */ 501*12186SJanice.Chang@Sun.COM info[2].butype_name = "zfs"; 502*12186SJanice.Chang@Sun.COM info[2].default_env.default_env_len = ARRAY_LEN(zfs_envs, ndmp_pval); 503*12186SJanice.Chang@Sun.COM info[2].default_env.default_env_val = zfs_envs; 504*12186SJanice.Chang@Sun.COM info[2].attrs = zfs_attrs; 505*12186SJanice.Chang@Sun.COM 5067917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 5077917SReza.Sabdar@Sun.COM reply.butype_info.butype_info_len = ARRAY_LEN(info, ndmp_butype_info); 5087917SReza.Sabdar@Sun.COM reply.butype_info.butype_info_val = info; 5097917SReza.Sabdar@Sun.COM 5107917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 5117917SReza.Sabdar@Sun.COM "sending ndmp_config_get_butype_info reply"); 5127917SReza.Sabdar@Sun.COM } 5137917SReza.Sabdar@Sun.COM 5147917SReza.Sabdar@Sun.COM /* 5157917SReza.Sabdar@Sun.COM * ndmpd_config_get_fs_info_v3 5167917SReza.Sabdar@Sun.COM * 5177917SReza.Sabdar@Sun.COM * This handler handles the ndmp_config_get_fs_info_request. 5187917SReza.Sabdar@Sun.COM * Information about all mounted file systems is returned. 5197917SReza.Sabdar@Sun.COM * 5207917SReza.Sabdar@Sun.COM * Parameters: 5217917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 5227917SReza.Sabdar@Sun.COM * body (input) - request message body. 5237917SReza.Sabdar@Sun.COM * 5247917SReza.Sabdar@Sun.COM * Returns: 5257917SReza.Sabdar@Sun.COM * void 5267917SReza.Sabdar@Sun.COM */ 5277917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 5287917SReza.Sabdar@Sun.COM void 5297917SReza.Sabdar@Sun.COM ndmpd_config_get_fs_info_v3(ndmp_connection_t *connection, void *body) 5307917SReza.Sabdar@Sun.COM { 5317917SReza.Sabdar@Sun.COM ndmp_config_get_fs_info_reply_v3 reply; 5327917SReza.Sabdar@Sun.COM ndmp_fs_info_v3 *fsip, *fsip_save; /* FS info pointer */ 5337917SReza.Sabdar@Sun.COM int i, nmnt, fd; 5347917SReza.Sabdar@Sun.COM int log_dev_len; 5357917SReza.Sabdar@Sun.COM FILE *fp = NULL; 5367917SReza.Sabdar@Sun.COM struct mnttab mt, *fs; 5377917SReza.Sabdar@Sun.COM struct statvfs64 stat_buf; 5387917SReza.Sabdar@Sun.COM ndmp_pval *envp, *save; 5397917SReza.Sabdar@Sun.COM 5407917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 5417917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 5427917SReza.Sabdar@Sun.COM 5437917SReza.Sabdar@Sun.COM if ((fd = open(MNTTAB, O_RDONLY)) == -1) { 5447917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_ERR, "File mnttab open error: %m."); 5457917SReza.Sabdar@Sun.COM reply.error = NDMP_UNDEFINED_ERR; 5467917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 5477917SReza.Sabdar@Sun.COM "sending ndmp_config_get_fs_info reply"); 5487917SReza.Sabdar@Sun.COM return; 5497917SReza.Sabdar@Sun.COM } 5507917SReza.Sabdar@Sun.COM 5517917SReza.Sabdar@Sun.COM /* nothing was found, send an empty reply */ 5527917SReza.Sabdar@Sun.COM if (ioctl(fd, MNTIOC_NMNTS, &nmnt) != 0 || nmnt <= 0) { 5537917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_ERR, "No file system found."); 5547917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 5557917SReza.Sabdar@Sun.COM "sending ndmp_config_get_fs_info reply"); 5567917SReza.Sabdar@Sun.COM return; 5577917SReza.Sabdar@Sun.COM } 5587917SReza.Sabdar@Sun.COM 5597917SReza.Sabdar@Sun.COM fp = fopen(MNTTAB, "r"); 5607917SReza.Sabdar@Sun.COM if (!fp) { 5617917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_ERR, "File mnttab open error: %m."); 5627917SReza.Sabdar@Sun.COM reply.error = NDMP_UNDEFINED_ERR; 5637917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 5647917SReza.Sabdar@Sun.COM "sending ndmp_config_get_fs_info reply"); 5657917SReza.Sabdar@Sun.COM return; 5667917SReza.Sabdar@Sun.COM } 5677917SReza.Sabdar@Sun.COM 5687917SReza.Sabdar@Sun.COM fsip_save = fsip = ndmp_malloc(sizeof (ndmp_fs_info_v3) * nmnt); 5697917SReza.Sabdar@Sun.COM if (!fsip) { 5707917SReza.Sabdar@Sun.COM (void) fclose(fp); 5717917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_MEM_ERR; 5727917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 5737917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_fs_info reply"); 5747917SReza.Sabdar@Sun.COM return; 5757917SReza.Sabdar@Sun.COM } 5767917SReza.Sabdar@Sun.COM 5777917SReza.Sabdar@Sun.COM /* 5787917SReza.Sabdar@Sun.COM * Re-read the directory and set up file system information. 5797917SReza.Sabdar@Sun.COM */ 5807917SReza.Sabdar@Sun.COM i = 0; 5817917SReza.Sabdar@Sun.COM rewind(fp); 5827917SReza.Sabdar@Sun.COM while (i < nmnt && (getmntent(fp, &mt) == 0)) 5837917SReza.Sabdar@Sun.COM 5847917SReza.Sabdar@Sun.COM { 5857917SReza.Sabdar@Sun.COM fs = &mt; 5867917SReza.Sabdar@Sun.COM log_dev_len = strlen(mt.mnt_mountp)+2; 5877917SReza.Sabdar@Sun.COM if (!IS_VALID_FS(fs)) 5887917SReza.Sabdar@Sun.COM continue; 5897917SReza.Sabdar@Sun.COM 5907917SReza.Sabdar@Sun.COM fsip->fs_logical_device = ndmp_malloc(log_dev_len); 5917917SReza.Sabdar@Sun.COM fsip->fs_type = ndmp_malloc(MNTTYPE_LEN); 5927917SReza.Sabdar@Sun.COM if (!fsip->fs_logical_device || !fsip->fs_type) { 5937917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_MEM_ERR; 5947917SReza.Sabdar@Sun.COM free(fsip->fs_logical_device); 5957917SReza.Sabdar@Sun.COM free(fsip->fs_type); 5967917SReza.Sabdar@Sun.COM break; 5977917SReza.Sabdar@Sun.COM } 5987917SReza.Sabdar@Sun.COM (void) snprintf(fsip->fs_type, MNTTYPE_LEN, "%s", 5997917SReza.Sabdar@Sun.COM fs->mnt_fstype); 6007917SReza.Sabdar@Sun.COM (void) snprintf(fsip->fs_logical_device, log_dev_len, "%s", 6017917SReza.Sabdar@Sun.COM fs->mnt_mountp); 6027917SReza.Sabdar@Sun.COM fsip->invalid = 0; 6037917SReza.Sabdar@Sun.COM 6047917SReza.Sabdar@Sun.COM if (statvfs64(fs->mnt_mountp, &stat_buf) < 0) { 6057917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, 6067917SReza.Sabdar@Sun.COM "statvfs(%s) error.", fs->mnt_mountp); 6077917SReza.Sabdar@Sun.COM fsip->fs_status = 6087917SReza.Sabdar@Sun.COM "statvfs error: unable to determine filesystem" 6097917SReza.Sabdar@Sun.COM " attributes"; 6107917SReza.Sabdar@Sun.COM } else { 6117917SReza.Sabdar@Sun.COM fsip->invalid = 0; 6127917SReza.Sabdar@Sun.COM fsip->total_size = 6137917SReza.Sabdar@Sun.COM long_long_to_quad((u_longlong_t)stat_buf.f_frsize * 6147917SReza.Sabdar@Sun.COM (u_longlong_t)stat_buf.f_blocks); 6157917SReza.Sabdar@Sun.COM fsip->used_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-stat_buf.f_bfree)); 6187917SReza.Sabdar@Sun.COM 6197917SReza.Sabdar@Sun.COM fsip->avail_size = 6207917SReza.Sabdar@Sun.COM long_long_to_quad((u_longlong_t)stat_buf.f_frsize * 6217917SReza.Sabdar@Sun.COM (u_longlong_t)stat_buf.f_bfree); 6227917SReza.Sabdar@Sun.COM fsip->total_inodes = 6237917SReza.Sabdar@Sun.COM long_long_to_quad((u_longlong_t)stat_buf.f_files); 6247917SReza.Sabdar@Sun.COM fsip->used_inodes = 6257917SReza.Sabdar@Sun.COM long_long_to_quad((u_longlong_t)(stat_buf.f_files - 6267917SReza.Sabdar@Sun.COM stat_buf.f_ffree)); 6277917SReza.Sabdar@Sun.COM fsip->fs_status = ""; 6287917SReza.Sabdar@Sun.COM } 6297917SReza.Sabdar@Sun.COM save = envp = ndmp_malloc(sizeof (ndmp_pval) * V3_N_FS_ENVS); 6307917SReza.Sabdar@Sun.COM if (!envp) { 6317917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_MEM_ERR; 6327917SReza.Sabdar@Sun.COM break; 6337917SReza.Sabdar@Sun.COM } 6347917SReza.Sabdar@Sun.COM (void) memset((void*)save, 0, 6357917SReza.Sabdar@Sun.COM V3_N_FS_ENVS * sizeof (ndmp_pval)); 6367917SReza.Sabdar@Sun.COM 6377917SReza.Sabdar@Sun.COM fsip->fs_env.fs_env_val = envp; 6387917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "LOCAL", "y"); 6397917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "TYPE", fsip->fs_type); 6407917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "AVAILABLE_BACKUP", "tar,dump"); 6417917SReza.Sabdar@Sun.COM 6427917SReza.Sabdar@Sun.COM if (FS_READONLY(fs) == 0) { 6437917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "AVAILABLE_RECOVERY", "tar,dump"); 6447917SReza.Sabdar@Sun.COM } 6457917SReza.Sabdar@Sun.COM 6467917SReza.Sabdar@Sun.COM fsip->fs_env.fs_env_len = envp - save; 6477917SReza.Sabdar@Sun.COM i++; 6487917SReza.Sabdar@Sun.COM fsip++; 6497917SReza.Sabdar@Sun.COM } 6507917SReza.Sabdar@Sun.COM (void) fclose(fp); 6517917SReza.Sabdar@Sun.COM if (reply.error == NDMP_NO_ERR) { 6527917SReza.Sabdar@Sun.COM reply.fs_info.fs_info_len = i; 6537917SReza.Sabdar@Sun.COM reply.fs_info.fs_info_val = fsip_save; 6547917SReza.Sabdar@Sun.COM } else { 6557917SReza.Sabdar@Sun.COM reply.fs_info.fs_info_len = 0; 6567917SReza.Sabdar@Sun.COM reply.fs_info.fs_info_val = NULL; 6577917SReza.Sabdar@Sun.COM } 6587917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 6597917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_fs_info reply"); 6607917SReza.Sabdar@Sun.COM 6617917SReza.Sabdar@Sun.COM fsip = fsip_save; 6627917SReza.Sabdar@Sun.COM while (--i >= 0) { 6637917SReza.Sabdar@Sun.COM free(fsip->fs_logical_device); 6647917SReza.Sabdar@Sun.COM free(fsip->fs_env.fs_env_val); 6657917SReza.Sabdar@Sun.COM free(fsip->fs_type); 6667917SReza.Sabdar@Sun.COM fsip++; 6677917SReza.Sabdar@Sun.COM } 6687917SReza.Sabdar@Sun.COM 6697917SReza.Sabdar@Sun.COM free(fsip_save); 6707917SReza.Sabdar@Sun.COM } 6717917SReza.Sabdar@Sun.COM 6727917SReza.Sabdar@Sun.COM 6737917SReza.Sabdar@Sun.COM /* 6747917SReza.Sabdar@Sun.COM * ndmpd_config_get_tape_info_v3 6757917SReza.Sabdar@Sun.COM * 6767917SReza.Sabdar@Sun.COM * This handler handles the ndmp_config_get_tape_info_request. 6777917SReza.Sabdar@Sun.COM * Information about all connected tape drives is returned. 6787917SReza.Sabdar@Sun.COM * 6797917SReza.Sabdar@Sun.COM * Parameters: 6807917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 6817917SReza.Sabdar@Sun.COM * body (input) - request message body. 6827917SReza.Sabdar@Sun.COM * 6837917SReza.Sabdar@Sun.COM * Returns: 6847917SReza.Sabdar@Sun.COM * void 6857917SReza.Sabdar@Sun.COM */ 6867917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 6877917SReza.Sabdar@Sun.COM void 6887917SReza.Sabdar@Sun.COM ndmpd_config_get_tape_info_v3(ndmp_connection_t *connection, void *body) 6897917SReza.Sabdar@Sun.COM { 6907917SReza.Sabdar@Sun.COM ndmp_config_get_tape_info_reply_v3 reply; 6917917SReza.Sabdar@Sun.COM ndmp_device_info_v3 *tip, *tip_save = NULL; /* tape info pointer */ 6927917SReza.Sabdar@Sun.COM ndmp_device_capability_v3 *dcp; 6937917SReza.Sabdar@Sun.COM ndmp_device_capability_v3 *dcp_save = NULL; /* dev capability pointer */ 6947917SReza.Sabdar@Sun.COM int i, n, max; 6957917SReza.Sabdar@Sun.COM sasd_drive_t *sd; 6967917SReza.Sabdar@Sun.COM scsi_link_t *sl; 6978193SReza.Sabdar@Sun.COM ndmp_pval *envp, *envp_save = NULL; 6988193SReza.Sabdar@Sun.COM ndmp_pval *envp_head; 6997917SReza.Sabdar@Sun.COM 7007917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 7017917SReza.Sabdar@Sun.COM max = sasd_dev_count(); 7027917SReza.Sabdar@Sun.COM 7037917SReza.Sabdar@Sun.COM tip_save = tip = ndmp_malloc(sizeof (ndmp_device_info_v3) * max); 7047917SReza.Sabdar@Sun.COM dcp_save = dcp = ndmp_malloc(sizeof (ndmp_device_capability_v3) * max); 7058193SReza.Sabdar@Sun.COM envp_save = envp = ndmp_malloc(sizeof (ndmp_pval) * max * 3); 7068193SReza.Sabdar@Sun.COM if (!tip_save || !dcp_save || !envp_save) { 7077917SReza.Sabdar@Sun.COM free(tip_save); 7087917SReza.Sabdar@Sun.COM free(dcp_save); 7098193SReza.Sabdar@Sun.COM free(envp_save); 7107917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_MEM_ERR; 7117917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 7127917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_tape_info reply"); 7137917SReza.Sabdar@Sun.COM return; 7147917SReza.Sabdar@Sun.COM } 7157917SReza.Sabdar@Sun.COM 7167917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 7177917SReza.Sabdar@Sun.COM 7187917SReza.Sabdar@Sun.COM for (i = n = 0; i < max; i++) { 7197917SReza.Sabdar@Sun.COM if (!(sl = sasd_dev_slink(i)) || !(sd = sasd_drive(i))) 7207917SReza.Sabdar@Sun.COM continue; 7217917SReza.Sabdar@Sun.COM if (sl->sl_type != DTYPE_SEQUENTIAL) 7227917SReza.Sabdar@Sun.COM continue; 7237917SReza.Sabdar@Sun.COM 7247917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, 7257917SReza.Sabdar@Sun.COM "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name); 7267917SReza.Sabdar@Sun.COM 7278193SReza.Sabdar@Sun.COM envp_head = envp; 7288193SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "EXECUTE_CDB", "b"); 7298193SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial); 7308193SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "WORLD_WIDE_NAME", sd->sd_wwn); 7318193SReza.Sabdar@Sun.COM 7327917SReza.Sabdar@Sun.COM tip->model = sd->sd_id; /* like "DLT7000 " */ 7337917SReza.Sabdar@Sun.COM tip->caplist.caplist_len = 1; 7347917SReza.Sabdar@Sun.COM tip->caplist.caplist_val = dcp; 7357917SReza.Sabdar@Sun.COM dcp->device = sd->sd_name; /* like "isp1t060" */ 7367917SReza.Sabdar@Sun.COM dcp->attr = 0; 7378193SReza.Sabdar@Sun.COM dcp->capability.capability_len = 3; 7388193SReza.Sabdar@Sun.COM dcp->capability.capability_val = envp_head; 7397917SReza.Sabdar@Sun.COM tip++; 7407917SReza.Sabdar@Sun.COM dcp++; 7417917SReza.Sabdar@Sun.COM n++; 7427917SReza.Sabdar@Sun.COM } 7437917SReza.Sabdar@Sun.COM 7447917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "n %d", n); 7457917SReza.Sabdar@Sun.COM 7467917SReza.Sabdar@Sun.COM /* 7477917SReza.Sabdar@Sun.COM * We should not receive the get_tape_info when three-way backup is 7487917SReza.Sabdar@Sun.COM * running and we are acting as just data, but some clients try 7497917SReza.Sabdar@Sun.COM * to get the Tape information anyway. 7507917SReza.Sabdar@Sun.COM */ 7517917SReza.Sabdar@Sun.COM if (n == 0 || max <= 0) { 7527917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_DEVICE_ERR; 7537917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 7547917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_tape_info reply"); 7558193SReza.Sabdar@Sun.COM free(tip_save); free(dcp_save); free(envp_save); 7567917SReza.Sabdar@Sun.COM return; 7577917SReza.Sabdar@Sun.COM } 7587917SReza.Sabdar@Sun.COM 7597917SReza.Sabdar@Sun.COM 7607917SReza.Sabdar@Sun.COM reply.tape_info.tape_info_len = n; 7617917SReza.Sabdar@Sun.COM reply.tape_info.tape_info_val = tip_save; 7627917SReza.Sabdar@Sun.COM 7637917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 7647917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_tape_info reply"); 7657917SReza.Sabdar@Sun.COM 7667917SReza.Sabdar@Sun.COM free(tip_save); 7677917SReza.Sabdar@Sun.COM free(dcp_save); 7688193SReza.Sabdar@Sun.COM free(envp_save); 7697917SReza.Sabdar@Sun.COM } 7707917SReza.Sabdar@Sun.COM 7717917SReza.Sabdar@Sun.COM 7727917SReza.Sabdar@Sun.COM /* 7737917SReza.Sabdar@Sun.COM * ndmpd_config_get_scsi_info_v3 7747917SReza.Sabdar@Sun.COM * 7757917SReza.Sabdar@Sun.COM * This handler handles the ndmp_config_get_tape_scsi_request. 7767917SReza.Sabdar@Sun.COM * Information about all connected scsi tape stacker and jukeboxes 7777917SReza.Sabdar@Sun.COM * is returned. 7787917SReza.Sabdar@Sun.COM * 7797917SReza.Sabdar@Sun.COM * Parameters: 7807917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 7817917SReza.Sabdar@Sun.COM * body (input) - request message body. 7827917SReza.Sabdar@Sun.COM * 7837917SReza.Sabdar@Sun.COM * Returns: 7847917SReza.Sabdar@Sun.COM * void 7857917SReza.Sabdar@Sun.COM */ 7867917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 7877917SReza.Sabdar@Sun.COM void 7887917SReza.Sabdar@Sun.COM ndmpd_config_get_scsi_info_v3(ndmp_connection_t *connection, void *body) 7897917SReza.Sabdar@Sun.COM { 7907917SReza.Sabdar@Sun.COM ndmp_config_get_scsi_info_reply_v3 reply; 7917917SReza.Sabdar@Sun.COM ndmp_device_info_v3 *sip, *sip_save; 7927917SReza.Sabdar@Sun.COM ndmp_device_capability_v3 *dcp, *dcp_save; 7937917SReza.Sabdar@Sun.COM int i, n, max; 7947917SReza.Sabdar@Sun.COM sasd_drive_t *sd; 7957917SReza.Sabdar@Sun.COM scsi_link_t *sl; 7968193SReza.Sabdar@Sun.COM ndmp_pval *envp, *envp_save = NULL; 7978193SReza.Sabdar@Sun.COM ndmp_pval *envp_head; 7987917SReza.Sabdar@Sun.COM 7997917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 8007917SReza.Sabdar@Sun.COM max = sasd_dev_count(); 8017917SReza.Sabdar@Sun.COM sip_save = sip = ndmp_malloc(sizeof (ndmp_device_info_v3) * max); 8027917SReza.Sabdar@Sun.COM dcp_save = dcp = ndmp_malloc(sizeof (ndmp_device_capability_v3) * max); 8038193SReza.Sabdar@Sun.COM envp_save = envp = ndmp_malloc(sizeof (ndmp_pval) * max * 2); 8048193SReza.Sabdar@Sun.COM if (!sip_save || !dcp_save || !envp_save) { 8057917SReza.Sabdar@Sun.COM free(sip_save); 8067917SReza.Sabdar@Sun.COM free(dcp_save); 8078193SReza.Sabdar@Sun.COM free(envp_save); 8087917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_MEM_ERR; 8097917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 8108193SReza.Sabdar@Sun.COM "error sending ndmp_config_get_scsi_info reply"); 8117917SReza.Sabdar@Sun.COM return; 8127917SReza.Sabdar@Sun.COM } 8137917SReza.Sabdar@Sun.COM 8147917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 8157917SReza.Sabdar@Sun.COM for (i = n = 0; i < max; i++) { 8167917SReza.Sabdar@Sun.COM if (!(sl = sasd_dev_slink(i)) || !(sd = sasd_drive(i))) 8177917SReza.Sabdar@Sun.COM continue; 8187917SReza.Sabdar@Sun.COM if (sl->sl_type != DTYPE_CHANGER) 8197917SReza.Sabdar@Sun.COM continue; 8207917SReza.Sabdar@Sun.COM 8217917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, 8227917SReza.Sabdar@Sun.COM "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name); 8237917SReza.Sabdar@Sun.COM 8248193SReza.Sabdar@Sun.COM envp_head = envp; 8258193SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial); 8268193SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "WORLD_WIDE_NAME", sd->sd_wwn); 8278193SReza.Sabdar@Sun.COM 8287917SReza.Sabdar@Sun.COM sip->model = sd->sd_id; /* like "Powerstor L200 " */ 8297917SReza.Sabdar@Sun.COM sip->caplist.caplist_len = 1; 8307917SReza.Sabdar@Sun.COM sip->caplist.caplist_val = dcp; 8317917SReza.Sabdar@Sun.COM dcp->device = sd->sd_name; /* like "isp1m000" */ 8327917SReza.Sabdar@Sun.COM 8337917SReza.Sabdar@Sun.COM dcp->attr = 0; 8348193SReza.Sabdar@Sun.COM dcp->capability.capability_len = 2; 8358193SReza.Sabdar@Sun.COM dcp->capability.capability_val = envp_head; 8367917SReza.Sabdar@Sun.COM sip++; 8377917SReza.Sabdar@Sun.COM dcp++; 8387917SReza.Sabdar@Sun.COM n++; 8397917SReza.Sabdar@Sun.COM } 8407917SReza.Sabdar@Sun.COM 8417917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, "n %d", n); 8427917SReza.Sabdar@Sun.COM 8437917SReza.Sabdar@Sun.COM reply.scsi_info.scsi_info_len = n; 8447917SReza.Sabdar@Sun.COM reply.scsi_info.scsi_info_val = sip_save; 8457917SReza.Sabdar@Sun.COM 8467917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 8477917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_scsi_info reply"); 8487917SReza.Sabdar@Sun.COM 8497917SReza.Sabdar@Sun.COM free(sip_save); 8507917SReza.Sabdar@Sun.COM free(dcp_save); 8518193SReza.Sabdar@Sun.COM free(envp_save); 8527917SReza.Sabdar@Sun.COM } 8537917SReza.Sabdar@Sun.COM 8547917SReza.Sabdar@Sun.COM 8557917SReza.Sabdar@Sun.COM /* 8567917SReza.Sabdar@Sun.COM * ndmpd_config_get_server_info_v3 8577917SReza.Sabdar@Sun.COM * 8587917SReza.Sabdar@Sun.COM * This handler handles the ndmp_config_get_server_info request. 8597917SReza.Sabdar@Sun.COM * Host specific information is returned. 8607917SReza.Sabdar@Sun.COM * 8617917SReza.Sabdar@Sun.COM * Parameters: 8627917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 8637917SReza.Sabdar@Sun.COM * body (input) - request message body. 8647917SReza.Sabdar@Sun.COM * 8657917SReza.Sabdar@Sun.COM * Returns: 8667917SReza.Sabdar@Sun.COM * void 8677917SReza.Sabdar@Sun.COM */ 8687917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 8697917SReza.Sabdar@Sun.COM void 8707917SReza.Sabdar@Sun.COM ndmpd_config_get_server_info_v3(ndmp_connection_t *connection, void *body) 8717917SReza.Sabdar@Sun.COM { 8727917SReza.Sabdar@Sun.COM ndmp_config_get_server_info_reply_v3 reply; 8737917SReza.Sabdar@Sun.COM ndmp_auth_type auth_types[2]; 8747917SReza.Sabdar@Sun.COM char rev_number[10]; 8757917SReza.Sabdar@Sun.COM ndmpd_session_t *session = ndmp_get_client_data(connection); 8767917SReza.Sabdar@Sun.COM 8777917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 8787917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 8797917SReza.Sabdar@Sun.COM 8807917SReza.Sabdar@Sun.COM if (connection->conn_authorized || 8817917SReza.Sabdar@Sun.COM session->ns_protocol_version != NDMPV4) { 8827917SReza.Sabdar@Sun.COM reply.vendor_name = VENDOR_NAME; 8837917SReza.Sabdar@Sun.COM reply.product_name = PRODUCT_NAME; 8847917SReza.Sabdar@Sun.COM (void) snprintf(rev_number, sizeof (rev_number), "%d", 8857917SReza.Sabdar@Sun.COM ndmp_ver); 8867917SReza.Sabdar@Sun.COM reply.revision_number = rev_number; 8877917SReza.Sabdar@Sun.COM } else { 8887917SReza.Sabdar@Sun.COM reply.vendor_name = "\0"; 8897917SReza.Sabdar@Sun.COM reply.product_name = "\0"; 8907917SReza.Sabdar@Sun.COM reply.revision_number = "\0"; 8917917SReza.Sabdar@Sun.COM } 8927917SReza.Sabdar@Sun.COM 8937917SReza.Sabdar@Sun.COM NDMP_LOG(LOG_DEBUG, 8947917SReza.Sabdar@Sun.COM "vendor \"%s\", product \"%s\" rev \"%s\"", 8957917SReza.Sabdar@Sun.COM reply.vendor_name, reply.product_name, reply.revision_number); 8967917SReza.Sabdar@Sun.COM 8977917SReza.Sabdar@Sun.COM auth_types[0] = NDMP_AUTH_TEXT; 8987917SReza.Sabdar@Sun.COM auth_types[1] = NDMP_AUTH_MD5; 8997917SReza.Sabdar@Sun.COM reply.auth_type.auth_type_len = ARRAY_LEN(auth_types, ndmp_auth_type); 9007917SReza.Sabdar@Sun.COM reply.auth_type.auth_type_val = auth_types; 9017917SReza.Sabdar@Sun.COM 9027917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 9037917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_server_info reply"); 9047917SReza.Sabdar@Sun.COM } 9057917SReza.Sabdar@Sun.COM 9067917SReza.Sabdar@Sun.COM 9077917SReza.Sabdar@Sun.COM 9087917SReza.Sabdar@Sun.COM /* 9097917SReza.Sabdar@Sun.COM * ************************************************************************ 9107917SReza.Sabdar@Sun.COM * NDMP V4 HANDLERS 9117917SReza.Sabdar@Sun.COM * ************************************************************************ 9127917SReza.Sabdar@Sun.COM */ 9137917SReza.Sabdar@Sun.COM 9147917SReza.Sabdar@Sun.COM /* 9157917SReza.Sabdar@Sun.COM * ndmpd_config_get_butype_info_v4 9167917SReza.Sabdar@Sun.COM * 9177917SReza.Sabdar@Sun.COM * This handler handles the ndmp_config_get_butype_info_request. 9187917SReza.Sabdar@Sun.COM * Information about all supported backup types are returned. 9197917SReza.Sabdar@Sun.COM * 9207917SReza.Sabdar@Sun.COM * Parameters: 9217917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 9227917SReza.Sabdar@Sun.COM * body (input) - request message body. 9237917SReza.Sabdar@Sun.COM * 9247917SReza.Sabdar@Sun.COM * Returns: 9257917SReza.Sabdar@Sun.COM * void 9267917SReza.Sabdar@Sun.COM */ 9277917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 9287917SReza.Sabdar@Sun.COM void 9297917SReza.Sabdar@Sun.COM ndmpd_config_get_butype_info_v4(ndmp_connection_t *connection, void *body) 9307917SReza.Sabdar@Sun.COM { 9317917SReza.Sabdar@Sun.COM ndmp_config_get_butype_info_reply_v4 reply; 932*12186SJanice.Chang@Sun.COM ndmp_butype_info info[3]; 933*12186SJanice.Chang@Sun.COM 9347917SReza.Sabdar@Sun.COM ndmp_pval envs[12]; 9357917SReza.Sabdar@Sun.COM ulong_t attrs; 9367917SReza.Sabdar@Sun.COM ndmp_pval *envp = envs; 9377917SReza.Sabdar@Sun.COM 938*12186SJanice.Chang@Sun.COM ndmp_pval zfs_envs[11]; 939*12186SJanice.Chang@Sun.COM ulong_t zfs_attrs; 940*12186SJanice.Chang@Sun.COM ndmp_pval *zfs_envp = zfs_envs; 941*12186SJanice.Chang@Sun.COM 942*12186SJanice.Chang@Sun.COM 9437917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 9447917SReza.Sabdar@Sun.COM 9457917SReza.Sabdar@Sun.COM /* 946*12186SJanice.Chang@Sun.COM * Supported environment variables and their default values 947*12186SJanice.Chang@Sun.COM * for dump and tar. 948*12186SJanice.Chang@Sun.COM * 9497917SReza.Sabdar@Sun.COM * The environment variables for dump and tar format are the 9507917SReza.Sabdar@Sun.COM * same, because we use the same backup engine for both. 9517917SReza.Sabdar@Sun.COM */ 9527917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "FILESYSTEM", ""); 9537917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "DIRECT", "n"); 9547917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "RECURSIVE", "n"); 9557917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "TYPE", ""); 9567917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "USER", ""); 9577917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "HIST", "n"); 9587917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "PATHNAME_SEPARATOR", "/"); 9597917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "LEVEL", "0"); 9607917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "EXTRACT", "y"); 9617917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "UPDATE", "y"); 9627917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "CMD", ""); 9637917SReza.Sabdar@Sun.COM NDMP_SETENV(envp, "BASE_DATE", ""); 9647917SReza.Sabdar@Sun.COM 9657917SReza.Sabdar@Sun.COM attrs = NDMP_BUTYPE_RECOVER_FILELIST | 9667917SReza.Sabdar@Sun.COM NDMP_BUTYPE_BACKUP_DIRECT | 9677917SReza.Sabdar@Sun.COM NDMP_BUTYPE_BACKUP_INCREMENTAL | 9687917SReza.Sabdar@Sun.COM NDMP_BUTYPE_BACKUP_UTF8 | 9697917SReza.Sabdar@Sun.COM NDMP_BUTYPE_RECOVER_UTF8 | 9707917SReza.Sabdar@Sun.COM NDMP_BUTYPE_BACKUP_FH_FILE | 9717917SReza.Sabdar@Sun.COM NDMP_BUTYPE_BACKUP_FH_DIR | 9727917SReza.Sabdar@Sun.COM NDMP_BUTYPE_RECOVER_FH_FILE | 9737917SReza.Sabdar@Sun.COM NDMP_BUTYPE_RECOVER_FH_DIR; 9747917SReza.Sabdar@Sun.COM 9757917SReza.Sabdar@Sun.COM /* If DAR supported */ 9767917SReza.Sabdar@Sun.COM if (ndmp_dar_support) 9777917SReza.Sabdar@Sun.COM attrs |= NDMP_BUTYPE_RECOVER_DIRECT; 9787917SReza.Sabdar@Sun.COM 9797917SReza.Sabdar@Sun.COM /* tar backup type */ 9807917SReza.Sabdar@Sun.COM info[0].butype_name = "tar"; 9817917SReza.Sabdar@Sun.COM info[0].default_env.default_env_len = ARRAY_LEN(envs, ndmp_pval); 9827917SReza.Sabdar@Sun.COM info[0].default_env.default_env_val = envs; 9837917SReza.Sabdar@Sun.COM info[0].attrs = attrs; 9847917SReza.Sabdar@Sun.COM 9857917SReza.Sabdar@Sun.COM /* dump backup type */ 9867917SReza.Sabdar@Sun.COM info[1].butype_name = "dump"; 9877917SReza.Sabdar@Sun.COM info[1].default_env.default_env_len = ARRAY_LEN(envs, ndmp_pval); 9887917SReza.Sabdar@Sun.COM info[1].default_env.default_env_val = envs; 9897917SReza.Sabdar@Sun.COM info[1].attrs = attrs; 9907917SReza.Sabdar@Sun.COM 991*12186SJanice.Chang@Sun.COM /* 992*12186SJanice.Chang@Sun.COM * Supported environment variables and their default values 993*12186SJanice.Chang@Sun.COM * for type "zfs." 994*12186SJanice.Chang@Sun.COM */ 995*12186SJanice.Chang@Sun.COM 996*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "USER", ""); 997*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "CMD", ""); 998*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "FILESYSTEM", ""); 999*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "PATHNAME_SEPARATOR", "/"); 1000*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "TYPE", "zfs"); 1001*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "HIST", "n"); 1002*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "LEVEL", "0"); 1003*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "ZFS_MODE", "recursive"); 1004*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "ZFS_FORCE", "n"); 1005*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "UPDATE", "y"); 1006*12186SJanice.Chang@Sun.COM NDMP_SETENV(zfs_envp, "DMP_NAME", "level"); 1007*12186SJanice.Chang@Sun.COM 1008*12186SJanice.Chang@Sun.COM zfs_attrs = NDMP_BUTYPE_BACKUP_UTF8 | 1009*12186SJanice.Chang@Sun.COM NDMP_BUTYPE_RECOVER_UTF8 | 1010*12186SJanice.Chang@Sun.COM NDMP_BUTYPE_BACKUP_INCREMENTAL; 1011*12186SJanice.Chang@Sun.COM 1012*12186SJanice.Chang@Sun.COM /* zfs backup type */ 1013*12186SJanice.Chang@Sun.COM info[2].butype_name = "zfs"; 1014*12186SJanice.Chang@Sun.COM info[2].default_env.default_env_len = ARRAY_LEN(zfs_envs, ndmp_pval); 1015*12186SJanice.Chang@Sun.COM info[2].default_env.default_env_val = zfs_envs; 1016*12186SJanice.Chang@Sun.COM info[2].attrs = zfs_attrs; 1017*12186SJanice.Chang@Sun.COM 10187917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 10197917SReza.Sabdar@Sun.COM reply.butype_info.butype_info_len = ARRAY_LEN(info, ndmp_butype_info); 10207917SReza.Sabdar@Sun.COM reply.butype_info.butype_info_val = info; 10217917SReza.Sabdar@Sun.COM 10227917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 10237917SReza.Sabdar@Sun.COM "sending ndmp_config_get_butype_info reply"); 10247917SReza.Sabdar@Sun.COM } 10257917SReza.Sabdar@Sun.COM 10267917SReza.Sabdar@Sun.COM 10277917SReza.Sabdar@Sun.COM /* 10287917SReza.Sabdar@Sun.COM * ndmpd_config_get_ext_list_v4 10297917SReza.Sabdar@Sun.COM * 10307917SReza.Sabdar@Sun.COM * This handler handles the ndmpd_config_get_ext_list_v4 request. 10317917SReza.Sabdar@Sun.COM * 10327917SReza.Sabdar@Sun.COM * Parameters: 10337917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 10347917SReza.Sabdar@Sun.COM * body (input) - request message body. 10357917SReza.Sabdar@Sun.COM * 10367917SReza.Sabdar@Sun.COM * Returns: 10377917SReza.Sabdar@Sun.COM * void 10387917SReza.Sabdar@Sun.COM */ 10397917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 10407917SReza.Sabdar@Sun.COM void 10417917SReza.Sabdar@Sun.COM ndmpd_config_get_ext_list_v4(ndmp_connection_t *connection, void *body) 10427917SReza.Sabdar@Sun.COM { 10437917SReza.Sabdar@Sun.COM ndmp_config_get_ext_list_reply_v4 reply; 10447917SReza.Sabdar@Sun.COM ndmpd_session_t *session = ndmp_get_client_data(connection); 10457917SReza.Sabdar@Sun.COM 10467917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 10477917SReza.Sabdar@Sun.COM 10487917SReza.Sabdar@Sun.COM if (session->ns_set_ext_list == FALSE) 10497917SReza.Sabdar@Sun.COM reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR; 10507917SReza.Sabdar@Sun.COM else 10517917SReza.Sabdar@Sun.COM reply.error = NDMP_NO_ERR; 10527917SReza.Sabdar@Sun.COM 10537917SReza.Sabdar@Sun.COM reply.class_list.class_list_val = NULL; 10547917SReza.Sabdar@Sun.COM reply.class_list.class_list_len = 0; 10557917SReza.Sabdar@Sun.COM 10567917SReza.Sabdar@Sun.COM 10577917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 10587917SReza.Sabdar@Sun.COM "error sending ndmp_config_get_ext_list reply"); 10597917SReza.Sabdar@Sun.COM } 10607917SReza.Sabdar@Sun.COM 10617917SReza.Sabdar@Sun.COM /* 10627917SReza.Sabdar@Sun.COM * ndmpd_config_set_ext_list_v4 10637917SReza.Sabdar@Sun.COM * 10647917SReza.Sabdar@Sun.COM * This handler handles the ndmpd_config_get_ext_list_v4 request. 10657917SReza.Sabdar@Sun.COM * 10667917SReza.Sabdar@Sun.COM * Parameters: 10677917SReza.Sabdar@Sun.COM * connection (input) - connection handle. 10687917SReza.Sabdar@Sun.COM * body (input) - request message body. 10697917SReza.Sabdar@Sun.COM * 10707917SReza.Sabdar@Sun.COM * Returns: 10717917SReza.Sabdar@Sun.COM * void 10727917SReza.Sabdar@Sun.COM */ 10737917SReza.Sabdar@Sun.COM /*ARGSUSED*/ 10747917SReza.Sabdar@Sun.COM void 10757917SReza.Sabdar@Sun.COM ndmpd_config_set_ext_list_v4(ndmp_connection_t *connection, void *body) 10767917SReza.Sabdar@Sun.COM { 10777917SReza.Sabdar@Sun.COM ndmp_config_set_ext_list_reply_v4 reply; 10787917SReza.Sabdar@Sun.COM ndmpd_session_t *session = ndmp_get_client_data(connection); 10797917SReza.Sabdar@Sun.COM 10807917SReza.Sabdar@Sun.COM (void) memset((void*)&reply, 0, sizeof (reply)); 10817917SReza.Sabdar@Sun.COM if (session->ns_set_ext_list == TRUE) { 10827917SReza.Sabdar@Sun.COM reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR; 10837917SReza.Sabdar@Sun.COM } else { 10847917SReza.Sabdar@Sun.COM session->ns_set_ext_list = TRUE; 10857917SReza.Sabdar@Sun.COM /* 10867917SReza.Sabdar@Sun.COM * NOTE: for now we are not supporting any extension list, 10877917SReza.Sabdar@Sun.COM * hence this error, when we start to support extensions, 10887917SReza.Sabdar@Sun.COM * this should be validated 10897917SReza.Sabdar@Sun.COM */ 10907917SReza.Sabdar@Sun.COM 10917917SReza.Sabdar@Sun.COM reply.error = NDMP_VERSION_NOT_SUPPORTED_ERR; 10927917SReza.Sabdar@Sun.COM } 10937917SReza.Sabdar@Sun.COM 10947917SReza.Sabdar@Sun.COM ndmp_send_reply(connection, (void *)&reply, 10957917SReza.Sabdar@Sun.COM "error sending ndmp_config_set_ext_list reply"); 10967917SReza.Sabdar@Sun.COM } 10977917SReza.Sabdar@Sun.COM 10987917SReza.Sabdar@Sun.COM 10997917SReza.Sabdar@Sun.COM 11007917SReza.Sabdar@Sun.COM /* 11017917SReza.Sabdar@Sun.COM * ************************************************************************ 11027917SReza.Sabdar@Sun.COM * LOCALS 11037917SReza.Sabdar@Sun.COM * ************************************************************************ 11047917SReza.Sabdar@Sun.COM */ 11057917SReza.Sabdar@Sun.COM 11067917SReza.Sabdar@Sun.COM /* 11077917SReza.Sabdar@Sun.COM * simple_get_attrs 11087917SReza.Sabdar@Sun.COM * 11097917SReza.Sabdar@Sun.COM * Set the default attrs for dump mode 11107917SReza.Sabdar@Sun.COM * 11117917SReza.Sabdar@Sun.COM * Parameters: 11127917SReza.Sabdar@Sun.COM * attributes (output) - the attributes for dump mode 11137917SReza.Sabdar@Sun.COM * 11147917SReza.Sabdar@Sun.COM * Returns: 11157917SReza.Sabdar@Sun.COM * void 11167917SReza.Sabdar@Sun.COM */ 11177917SReza.Sabdar@Sun.COM static void 11187917SReza.Sabdar@Sun.COM simple_get_attrs(ulong_t *attributes) 11197917SReza.Sabdar@Sun.COM { 11207917SReza.Sabdar@Sun.COM *attributes = NDMP_NO_RECOVER_FHINFO; 11217917SReza.Sabdar@Sun.COM } 1122