18474SJose.Borrego@Sun.COM /* 28474SJose.Borrego@Sun.COM * CDDL HEADER START 38474SJose.Borrego@Sun.COM * 48474SJose.Borrego@Sun.COM * The contents of this file are subject to the terms of the 58474SJose.Borrego@Sun.COM * Common Development and Distribution License (the "License"). 68474SJose.Borrego@Sun.COM * You may not use this file except in compliance with the License. 78474SJose.Borrego@Sun.COM * 88474SJose.Borrego@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 98474SJose.Borrego@Sun.COM * or http://www.opensolaris.org/os/licensing. 108474SJose.Borrego@Sun.COM * See the License for the specific language governing permissions 118474SJose.Borrego@Sun.COM * and limitations under the License. 128474SJose.Borrego@Sun.COM * 138474SJose.Borrego@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 148474SJose.Borrego@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 158474SJose.Borrego@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 168474SJose.Borrego@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 178474SJose.Borrego@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 188474SJose.Borrego@Sun.COM * 198474SJose.Borrego@Sun.COM * CDDL HEADER END 208474SJose.Borrego@Sun.COM */ 218474SJose.Borrego@Sun.COM /* 228474SJose.Borrego@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 238474SJose.Borrego@Sun.COM * Use is subject to license terms. 248474SJose.Borrego@Sun.COM */ 258474SJose.Borrego@Sun.COM 268474SJose.Borrego@Sun.COM /* 278474SJose.Borrego@Sun.COM * Server Service RPC (SRVSVC) server-side interface definition. 288474SJose.Borrego@Sun.COM * The server service provides a remote administration interface. 298474SJose.Borrego@Sun.COM * 308474SJose.Borrego@Sun.COM * This service uses NERR/Win32 error codes rather than NT status 318474SJose.Borrego@Sun.COM * values. 328474SJose.Borrego@Sun.COM */ 338474SJose.Borrego@Sun.COM 348474SJose.Borrego@Sun.COM #include <sys/errno.h> 35*10966SJordan.Brown@Sun.COM #include <sys/tzfile.h> 368474SJose.Borrego@Sun.COM #include <unistd.h> 378474SJose.Borrego@Sun.COM #include <netdb.h> 388474SJose.Borrego@Sun.COM #include <strings.h> 398474SJose.Borrego@Sun.COM #include <time.h> 408474SJose.Borrego@Sun.COM #include <thread.h> 418474SJose.Borrego@Sun.COM #include <ctype.h> 428474SJose.Borrego@Sun.COM #include <stdlib.h> 438474SJose.Borrego@Sun.COM #include <string.h> 448474SJose.Borrego@Sun.COM #include <sys/types.h> 458474SJose.Borrego@Sun.COM #include <sys/socket.h> 468474SJose.Borrego@Sun.COM #include <netinet/in.h> 478474SJose.Borrego@Sun.COM #include <arpa/inet.h> 488474SJose.Borrego@Sun.COM #include <libshare.h> 4910504SKeyur.Desai@Sun.COM #include <libnvpair.h> 508474SJose.Borrego@Sun.COM #include <smbsrv/libsmb.h> 518474SJose.Borrego@Sun.COM #include <smbsrv/libmlsvc.h> 528474SJose.Borrego@Sun.COM #include <smbsrv/lmerr.h> 538474SJose.Borrego@Sun.COM #include <smbsrv/nmpipes.h> 54*10966SJordan.Brown@Sun.COM #include <smbsrv/smb.h> 558474SJose.Borrego@Sun.COM #include <smbsrv/netrauth.h> 568474SJose.Borrego@Sun.COM #include <smbsrv/ndl/srvsvc.ndl> 578474SJose.Borrego@Sun.COM #include <smbsrv/smb_common_door.h> 589832Samw@Sun.COM #include "mlsvc.h" 598474SJose.Borrego@Sun.COM 608474SJose.Borrego@Sun.COM #define SV_TYPE_SENT_BY_ME (SV_TYPE_WORKSTATION | SV_TYPE_SERVER | SV_TYPE_NT) 618474SJose.Borrego@Sun.COM 628474SJose.Borrego@Sun.COM /* 638474SJose.Borrego@Sun.COM * Qualifier types for NetConnectEnum. 648474SJose.Borrego@Sun.COM */ 658474SJose.Borrego@Sun.COM #define SRVSVC_CONNECT_ENUM_NULL 0 668474SJose.Borrego@Sun.COM #define SRVSVC_CONNECT_ENUM_SHARE 1 678474SJose.Borrego@Sun.COM #define SRVSVC_CONNECT_ENUM_WKSTN 2 688474SJose.Borrego@Sun.COM 6910122SJordan.Brown@Sun.COM #define SMB_SRVSVC_MAXBUFLEN (8 * 1024 * 1024) 7010122SJordan.Brown@Sun.COM #define SMB_SRVSVC_MAXPREFLEN ((uint32_t)(-1)) 718474SJose.Borrego@Sun.COM 729832Samw@Sun.COM typedef struct srvsvc_sd { 739832Samw@Sun.COM uint8_t *sd_buf; 749832Samw@Sun.COM uint32_t sd_size; 759832Samw@Sun.COM } srvsvc_sd_t; 769832Samw@Sun.COM 779832Samw@Sun.COM typedef struct srvsvc_netshare_setinfo { 789832Samw@Sun.COM char *nss_netname; 799832Samw@Sun.COM char *nss_comment; 809832Samw@Sun.COM char *nss_path; 819832Samw@Sun.COM uint32_t nss_type; 829832Samw@Sun.COM srvsvc_sd_t nss_sd; 839832Samw@Sun.COM } srvsvc_netshare_setinfo_t; 849832Samw@Sun.COM 859832Samw@Sun.COM typedef union srvsvc_netshare_getinfo { 869832Samw@Sun.COM struct mslm_NetShareInfo_0 nsg_info0; 879832Samw@Sun.COM struct mslm_NetShareInfo_1 nsg_info1; 889832Samw@Sun.COM struct mslm_NetShareInfo_2 nsg_info2; 899832Samw@Sun.COM struct mslm_NetShareInfo_501 nsg_info501; 909832Samw@Sun.COM struct mslm_NetShareInfo_502 nsg_info502; 919832Samw@Sun.COM struct mslm_NetShareInfo_503 nsg_info503; 929832Samw@Sun.COM struct mslm_NetShareInfo_1004 nsg_info1004; 939832Samw@Sun.COM struct mslm_NetShareInfo_1005 nsg_info1005; 949832Samw@Sun.COM struct mslm_NetShareInfo_1006 nsg_info1006; 959832Samw@Sun.COM struct mslm_NetShareInfo_1501 nsg_info1501; 969832Samw@Sun.COM } srvsvc_netshare_getinfo_t; 979832Samw@Sun.COM 9810122SJordan.Brown@Sun.COM typedef struct mslm_infonres srvsvc_infonres_t; 9910122SJordan.Brown@Sun.COM typedef struct mslm_NetConnectEnum srvsvc_NetConnectEnum_t; 10010122SJordan.Brown@Sun.COM 10110122SJordan.Brown@Sun.COM static uint32_t srvsvc_netconnectenum_level0(ndr_xa_t *, smb_svcenum_t *, 10210122SJordan.Brown@Sun.COM srvsvc_NetConnectEnum_t *); 10310122SJordan.Brown@Sun.COM static uint32_t srvsvc_netconnectenum_level1(ndr_xa_t *, smb_svcenum_t *, 10410122SJordan.Brown@Sun.COM srvsvc_NetConnectEnum_t *); 10510122SJordan.Brown@Sun.COM static uint32_t srvsvc_netconnectenum_common(ndr_xa_t *, 10610122SJordan.Brown@Sun.COM srvsvc_NetConnectInfo_t *, smb_netsvc_t *, smb_svcenum_t *); 10710122SJordan.Brown@Sun.COM 10810122SJordan.Brown@Sun.COM static DWORD srvsvc_NetFileEnum2(ndr_xa_t *, struct mslm_NetFileEnum *, 10910122SJordan.Brown@Sun.COM smb_svcenum_t *se); 11010122SJordan.Brown@Sun.COM static DWORD srvsvc_NetFileEnum3(ndr_xa_t *, struct mslm_NetFileEnum *, 11110122SJordan.Brown@Sun.COM smb_svcenum_t *se); 11210122SJordan.Brown@Sun.COM 11310122SJordan.Brown@Sun.COM static uint32_t srvsvc_NetSessionEnumCommon(ndr_xa_t *, srvsvc_infonres_t *, 11410122SJordan.Brown@Sun.COM smb_netsvc_t *, smb_svcenum_t *); 11510122SJordan.Brown@Sun.COM 11610122SJordan.Brown@Sun.COM static DWORD mlsvc_NetShareEnumLevel0(ndr_xa_t *, srvsvc_infonres_t *, 11710122SJordan.Brown@Sun.COM smb_svcenum_t *, int); 11810122SJordan.Brown@Sun.COM static DWORD mlsvc_NetShareEnumLevel1(ndr_xa_t *, srvsvc_infonres_t *, 11910122SJordan.Brown@Sun.COM smb_svcenum_t *, int); 12010122SJordan.Brown@Sun.COM static DWORD mlsvc_NetShareEnumLevel2(ndr_xa_t *, srvsvc_infonres_t *, 12110122SJordan.Brown@Sun.COM smb_svcenum_t *, int); 12210122SJordan.Brown@Sun.COM static DWORD mlsvc_NetShareEnumLevel501(ndr_xa_t *, srvsvc_infonres_t *, 12310122SJordan.Brown@Sun.COM smb_svcenum_t *, int); 12410122SJordan.Brown@Sun.COM static DWORD mlsvc_NetShareEnumLevel502(ndr_xa_t *, srvsvc_infonres_t *, 12510122SJordan.Brown@Sun.COM smb_svcenum_t *, int); 12610122SJordan.Brown@Sun.COM static DWORD mlsvc_NetShareEnumCommon(ndr_xa_t *, smb_svcenum_t *, 12710122SJordan.Brown@Sun.COM smb_share_t *, void *); 12810122SJordan.Brown@Sun.COM static boolean_t srvsvc_add_autohome(ndr_xa_t *, smb_svcenum_t *, void *); 1298474SJose.Borrego@Sun.COM static char *srvsvc_share_mkpath(ndr_xa_t *, char *); 1309832Samw@Sun.COM static uint32_t srvsvc_share_getsd(ndr_xa_t *, smb_share_t *, srvsvc_sd_t *); 1318474SJose.Borrego@Sun.COM 1328474SJose.Borrego@Sun.COM static int srvsvc_netconnect_qualifier(const char *); 13310122SJordan.Brown@Sun.COM static void srvsvc_estimate_limit(smb_svcenum_t *, uint32_t); 13410122SJordan.Brown@Sun.COM static uint32_t srvsvc_open_sessions(void); 13510122SJordan.Brown@Sun.COM static uint32_t srvsvc_open_connections(uint32_t, const char *); 13610122SJordan.Brown@Sun.COM static uint32_t srvsvc_open_files(void); 1378474SJose.Borrego@Sun.COM 1389832Samw@Sun.COM static uint32_t srvsvc_modify_share(smb_share_t *, 1399832Samw@Sun.COM srvsvc_netshare_setinfo_t *); 1409832Samw@Sun.COM static uint32_t srvsvc_modify_transient_share(smb_share_t *, 1419832Samw@Sun.COM srvsvc_netshare_setinfo_t *); 1429832Samw@Sun.COM static uint32_t srvsvc_update_share_flags(smb_share_t *, uint32_t); 14310504SKeyur.Desai@Sun.COM static uint32_t srvsvc_get_share_flags(smb_share_t *); 1449832Samw@Sun.COM 1458474SJose.Borrego@Sun.COM static uint32_t srvsvc_sa_add(char *, char *, char *); 1468474SJose.Borrego@Sun.COM static uint32_t srvsvc_sa_delete(char *); 1479832Samw@Sun.COM static uint32_t srvsvc_sa_modify(smb_share_t *, srvsvc_netshare_setinfo_t *); 14810504SKeyur.Desai@Sun.COM static uint32_t srvsvc_sa_setprop(smb_share_t *, nvlist_t *); 1498474SJose.Borrego@Sun.COM 1508474SJose.Borrego@Sun.COM static char empty_string[1]; 1518474SJose.Borrego@Sun.COM 1528474SJose.Borrego@Sun.COM static ndr_stub_table_t srvsvc_stub_table[]; 1538474SJose.Borrego@Sun.COM 1548474SJose.Borrego@Sun.COM static ndr_service_t srvsvc_service = { 1558474SJose.Borrego@Sun.COM "SRVSVC", /* name */ 1568474SJose.Borrego@Sun.COM "Server services", /* desc */ 1578474SJose.Borrego@Sun.COM "\\srvsvc", /* endpoint */ 1588474SJose.Borrego@Sun.COM PIPE_NTSVCS, /* sec_addr_port */ 1598474SJose.Borrego@Sun.COM "4b324fc8-1670-01d3-1278-5a47bf6ee188", 3, /* abstract */ 1608474SJose.Borrego@Sun.COM NDR_TRANSFER_SYNTAX_UUID, 2, /* transfer */ 1618474SJose.Borrego@Sun.COM 0, /* no bind_instance_size */ 1628474SJose.Borrego@Sun.COM 0, /* no bind_req() */ 1638474SJose.Borrego@Sun.COM 0, /* no unbind_and_close() */ 1648474SJose.Borrego@Sun.COM 0, /* use generic_call_stub() */ 1658474SJose.Borrego@Sun.COM &TYPEINFO(srvsvc_interface), /* interface ti */ 1668474SJose.Borrego@Sun.COM srvsvc_stub_table /* stub_table */ 1678474SJose.Borrego@Sun.COM }; 1688474SJose.Borrego@Sun.COM 1698474SJose.Borrego@Sun.COM /* 1708474SJose.Borrego@Sun.COM * srvsvc_initialize 1718474SJose.Borrego@Sun.COM * 1728474SJose.Borrego@Sun.COM * This function registers the SRVSVC RPC interface with the RPC runtime 1738474SJose.Borrego@Sun.COM * library. It must be called in order to use either the client side 1748474SJose.Borrego@Sun.COM * or the server side functions. 1758474SJose.Borrego@Sun.COM */ 1768474SJose.Borrego@Sun.COM void 1778474SJose.Borrego@Sun.COM srvsvc_initialize(void) 1788474SJose.Borrego@Sun.COM { 1798474SJose.Borrego@Sun.COM (void) ndr_svc_register(&srvsvc_service); 1808474SJose.Borrego@Sun.COM } 1818474SJose.Borrego@Sun.COM 1828474SJose.Borrego@Sun.COM /* 1838474SJose.Borrego@Sun.COM * srvsvc_s_NetConnectEnum 1848474SJose.Borrego@Sun.COM * 1858474SJose.Borrego@Sun.COM * List tree connections made to a share on this server or all tree 1868474SJose.Borrego@Sun.COM * connections established from a specific client. Administrator, 1878474SJose.Borrego@Sun.COM * Server Operator, Print Operator or Power User group membership 1888474SJose.Borrego@Sun.COM * is required to use this interface. 1898474SJose.Borrego@Sun.COM * 1908474SJose.Borrego@Sun.COM * There are three information levels: 0, 1, and 50. We don't support 1918474SJose.Borrego@Sun.COM * level 50, which is only used by Windows 9x clients. 1928474SJose.Borrego@Sun.COM * 1938474SJose.Borrego@Sun.COM * It seems Server Manger (srvmgr) only sends workstation as the qualifier 1948474SJose.Borrego@Sun.COM * and the Computer Management Interface on Windows 2000 doesn't request 1958474SJose.Borrego@Sun.COM * a list of connections. 1968474SJose.Borrego@Sun.COM * 1978474SJose.Borrego@Sun.COM * Return Values: 1988474SJose.Borrego@Sun.COM * ERROR_SUCCESS Success 1998474SJose.Borrego@Sun.COM * ERROR_ACCESS_DENIED Caller does not have access to this call. 2008474SJose.Borrego@Sun.COM * ERROR_INVALID_PARAMETER One of the parameters is invalid. 2018474SJose.Borrego@Sun.COM * ERROR_INVALID_LEVEL Unknown information level specified. 2028474SJose.Borrego@Sun.COM * ERROR_MORE_DATA Partial date returned, more entries available. 2038474SJose.Borrego@Sun.COM * ERROR_NOT_ENOUGH_MEMORY Insufficient memory is available. 2048474SJose.Borrego@Sun.COM * NERR_NetNameNotFound The share qualifier cannot be found. 2058474SJose.Borrego@Sun.COM * NERR_BufTooSmall The supplied buffer is too small. 2068474SJose.Borrego@Sun.COM */ 2078474SJose.Borrego@Sun.COM static int 2088474SJose.Borrego@Sun.COM srvsvc_s_NetConnectEnum(void *arg, ndr_xa_t *mxa) 2098474SJose.Borrego@Sun.COM { 21010122SJordan.Brown@Sun.COM srvsvc_NetConnectEnum_t *param = arg; 21110122SJordan.Brown@Sun.COM smb_netsvc_t *ns; 21210122SJordan.Brown@Sun.COM smb_svcenum_t se; 21310122SJordan.Brown@Sun.COM char *qualifier; 21410122SJordan.Brown@Sun.COM int qualtype; 21510122SJordan.Brown@Sun.COM DWORD status = ERROR_SUCCESS; 2168474SJose.Borrego@Sun.COM 2178474SJose.Borrego@Sun.COM if (!ndr_is_poweruser(mxa)) { 21810122SJordan.Brown@Sun.COM status = ERROR_ACCESS_DENIED; 21910122SJordan.Brown@Sun.COM goto srvsvc_netconnectenum_error; 2208474SJose.Borrego@Sun.COM } 2218474SJose.Borrego@Sun.COM 2228474SJose.Borrego@Sun.COM qualifier = (char *)param->qualifier; 2238474SJose.Borrego@Sun.COM qualtype = srvsvc_netconnect_qualifier(qualifier); 2248474SJose.Borrego@Sun.COM if (qualtype == SRVSVC_CONNECT_ENUM_NULL) { 22510122SJordan.Brown@Sun.COM status = NERR_NetNameNotFound; 22610122SJordan.Brown@Sun.COM goto srvsvc_netconnectenum_error; 22710122SJordan.Brown@Sun.COM } 22810122SJordan.Brown@Sun.COM 22910122SJordan.Brown@Sun.COM param->total_entries = srvsvc_open_connections(qualtype, qualifier); 23010122SJordan.Brown@Sun.COM if (param->total_entries == 0) { 23110122SJordan.Brown@Sun.COM bzero(param, sizeof (srvsvc_NetConnectEnum_t)); 23210122SJordan.Brown@Sun.COM param->status = ERROR_SUCCESS; 2338474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 2348474SJose.Borrego@Sun.COM } 2358474SJose.Borrego@Sun.COM 23610122SJordan.Brown@Sun.COM bzero(&se, sizeof (smb_svcenum_t)); 23710122SJordan.Brown@Sun.COM se.se_type = SMB_SVCENUM_TYPE_TREE; 23810122SJordan.Brown@Sun.COM se.se_level = param->info.level; 23910122SJordan.Brown@Sun.COM se.se_ntotal = param->total_entries; 24010122SJordan.Brown@Sun.COM se.se_nlimit = se.se_ntotal; 24110122SJordan.Brown@Sun.COM 24210122SJordan.Brown@Sun.COM if (param->pref_max_len == SMB_SRVSVC_MAXPREFLEN || 24310122SJordan.Brown@Sun.COM param->pref_max_len > SMB_SRVSVC_MAXBUFLEN) 24410122SJordan.Brown@Sun.COM se.se_prefmaxlen = SMB_SRVSVC_MAXBUFLEN; 24510122SJordan.Brown@Sun.COM else 24610122SJordan.Brown@Sun.COM se.se_prefmaxlen = param->pref_max_len; 24710122SJordan.Brown@Sun.COM 24810122SJordan.Brown@Sun.COM if (param->resume_handle) { 24910122SJordan.Brown@Sun.COM se.se_resume = *param->resume_handle; 25010122SJordan.Brown@Sun.COM se.se_nskip = se.se_resume; 25110122SJordan.Brown@Sun.COM *param->resume_handle = 0; 25210122SJordan.Brown@Sun.COM } 25310122SJordan.Brown@Sun.COM 2548474SJose.Borrego@Sun.COM switch (param->info.level) { 2558474SJose.Borrego@Sun.COM case 0: 25610122SJordan.Brown@Sun.COM status = srvsvc_netconnectenum_level0(mxa, &se, param); 2578474SJose.Borrego@Sun.COM break; 2588474SJose.Borrego@Sun.COM case 1: 25910122SJordan.Brown@Sun.COM status = srvsvc_netconnectenum_level1(mxa, &se, param); 2608474SJose.Borrego@Sun.COM break; 2618474SJose.Borrego@Sun.COM case 50: 2628474SJose.Borrego@Sun.COM status = ERROR_NOT_SUPPORTED; 2638474SJose.Borrego@Sun.COM break; 2648474SJose.Borrego@Sun.COM default: 2658474SJose.Borrego@Sun.COM status = ERROR_INVALID_LEVEL; 2668474SJose.Borrego@Sun.COM break; 2678474SJose.Borrego@Sun.COM } 2688474SJose.Borrego@Sun.COM 2698474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 27010122SJordan.Brown@Sun.COM goto srvsvc_netconnectenum_error; 27110122SJordan.Brown@Sun.COM 27210122SJordan.Brown@Sun.COM if ((ns = smb_kmod_enum_init(&se)) == NULL) { 27310122SJordan.Brown@Sun.COM status = ERROR_NOT_ENOUGH_MEMORY; 27410122SJordan.Brown@Sun.COM goto srvsvc_netconnectenum_error; 27510122SJordan.Brown@Sun.COM } 27610122SJordan.Brown@Sun.COM 27710122SJordan.Brown@Sun.COM status = srvsvc_netconnectenum_common(mxa, ¶m->info, ns, &se); 27810122SJordan.Brown@Sun.COM smb_kmod_enum_fini(ns); 27910122SJordan.Brown@Sun.COM 28010122SJordan.Brown@Sun.COM if (status != ERROR_SUCCESS) 28110122SJordan.Brown@Sun.COM goto srvsvc_netconnectenum_error; 28210122SJordan.Brown@Sun.COM 28310122SJordan.Brown@Sun.COM if (param->resume_handle && 28410122SJordan.Brown@Sun.COM param->pref_max_len != SMB_SRVSVC_MAXPREFLEN) { 28510122SJordan.Brown@Sun.COM if (se.se_resume < param->total_entries) { 28610122SJordan.Brown@Sun.COM *param->resume_handle = se.se_resume; 28710122SJordan.Brown@Sun.COM status = ERROR_MORE_DATA; 28810122SJordan.Brown@Sun.COM } 28910122SJordan.Brown@Sun.COM } 29010122SJordan.Brown@Sun.COM 29110122SJordan.Brown@Sun.COM param->status = status; 29210122SJordan.Brown@Sun.COM return (NDR_DRC_OK); 29310122SJordan.Brown@Sun.COM 29410122SJordan.Brown@Sun.COM srvsvc_netconnectenum_error: 29510122SJordan.Brown@Sun.COM bzero(param, sizeof (srvsvc_NetConnectEnum_t)); 2968474SJose.Borrego@Sun.COM param->status = status; 2978474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 2988474SJose.Borrego@Sun.COM } 2998474SJose.Borrego@Sun.COM 30010122SJordan.Brown@Sun.COM /* 30110122SJordan.Brown@Sun.COM * Allocate memory and estimate the number of objects that can 30210122SJordan.Brown@Sun.COM * be returned for NetConnectEnum level 0. 30310122SJordan.Brown@Sun.COM */ 30410122SJordan.Brown@Sun.COM static uint32_t 30510122SJordan.Brown@Sun.COM srvsvc_netconnectenum_level0(ndr_xa_t *mxa, smb_svcenum_t *se, 30610122SJordan.Brown@Sun.COM srvsvc_NetConnectEnum_t *param) 3078474SJose.Borrego@Sun.COM { 30810122SJordan.Brown@Sun.COM srvsvc_NetConnectInfo0_t *info0; 30910122SJordan.Brown@Sun.COM srvsvc_NetConnectInfoBuf0_t *ci0; 31010122SJordan.Brown@Sun.COM 31110122SJordan.Brown@Sun.COM if ((info0 = NDR_NEW(mxa, srvsvc_NetConnectInfo0_t)) == NULL) 31210122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 31310122SJordan.Brown@Sun.COM 31410122SJordan.Brown@Sun.COM bzero(info0, sizeof (srvsvc_NetConnectInfo0_t)); 31510122SJordan.Brown@Sun.COM param->info.ru.info0 = info0; 31610122SJordan.Brown@Sun.COM 31710122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, sizeof (srvsvc_NetConnectInfoBuf0_t)); 31810122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 31910122SJordan.Brown@Sun.COM return (NERR_BufTooSmall); 32010122SJordan.Brown@Sun.COM 32110122SJordan.Brown@Sun.COM do { 32210122SJordan.Brown@Sun.COM ci0 = NDR_NEWN(mxa, srvsvc_NetConnectInfoBuf0_t, se->se_nlimit); 32310122SJordan.Brown@Sun.COM if (ci0 == NULL) 32410122SJordan.Brown@Sun.COM se->se_nlimit >>= 1; 32510122SJordan.Brown@Sun.COM } while ((se->se_nlimit > 0) && (ci0 == NULL)); 32610122SJordan.Brown@Sun.COM 3278474SJose.Borrego@Sun.COM if (ci0 == NULL) 3288474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 3298474SJose.Borrego@Sun.COM 3308474SJose.Borrego@Sun.COM info0->ci0 = ci0; 33110122SJordan.Brown@Sun.COM info0->entries_read = 0; 3328474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 3338474SJose.Borrego@Sun.COM } 3348474SJose.Borrego@Sun.COM 33510122SJordan.Brown@Sun.COM /* 33610122SJordan.Brown@Sun.COM * Allocate memory and estimate the number of objects that can 33710122SJordan.Brown@Sun.COM * be returned for NetConnectEnum level 1. 33810122SJordan.Brown@Sun.COM */ 33910122SJordan.Brown@Sun.COM static uint32_t 34010122SJordan.Brown@Sun.COM srvsvc_netconnectenum_level1(ndr_xa_t *mxa, smb_svcenum_t *se, 34110122SJordan.Brown@Sun.COM srvsvc_NetConnectEnum_t *param) 3428474SJose.Borrego@Sun.COM { 34310122SJordan.Brown@Sun.COM srvsvc_NetConnectInfo1_t *info1; 34410122SJordan.Brown@Sun.COM srvsvc_NetConnectInfoBuf1_t *ci1; 34510122SJordan.Brown@Sun.COM 34610122SJordan.Brown@Sun.COM if ((info1 = NDR_NEW(mxa, srvsvc_NetConnectInfo1_t)) == NULL) 34710122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 34810122SJordan.Brown@Sun.COM 34910122SJordan.Brown@Sun.COM bzero(info1, sizeof (srvsvc_NetConnectInfo1_t)); 35010122SJordan.Brown@Sun.COM param->info.ru.info1 = info1; 35110122SJordan.Brown@Sun.COM 35210122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 35310122SJordan.Brown@Sun.COM sizeof (srvsvc_NetConnectInfoBuf1_t) + MAXNAMELEN); 35410122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 35510122SJordan.Brown@Sun.COM return (NERR_BufTooSmall); 35610122SJordan.Brown@Sun.COM 35710122SJordan.Brown@Sun.COM do { 35810122SJordan.Brown@Sun.COM ci1 = NDR_NEWN(mxa, srvsvc_NetConnectInfoBuf1_t, se->se_nlimit); 35910122SJordan.Brown@Sun.COM if (ci1 == NULL) 36010122SJordan.Brown@Sun.COM se->se_nlimit >>= 1; 36110122SJordan.Brown@Sun.COM } while ((se->se_nlimit > 0) && (ci1 == NULL)); 36210122SJordan.Brown@Sun.COM 3638474SJose.Borrego@Sun.COM if (ci1 == NULL) 3648474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 3658474SJose.Borrego@Sun.COM 3668474SJose.Borrego@Sun.COM info1->ci1 = ci1; 36710122SJordan.Brown@Sun.COM info1->entries_read = 0; 36810122SJordan.Brown@Sun.COM return (ERROR_SUCCESS); 36910122SJordan.Brown@Sun.COM } 37010122SJordan.Brown@Sun.COM 37110122SJordan.Brown@Sun.COM /* 37210122SJordan.Brown@Sun.COM * Request a list of connections from the kernel and set up 37310122SJordan.Brown@Sun.COM * the connection information to be returned to the client. 37410122SJordan.Brown@Sun.COM */ 37510122SJordan.Brown@Sun.COM static uint32_t 37610122SJordan.Brown@Sun.COM srvsvc_netconnectenum_common(ndr_xa_t *mxa, srvsvc_NetConnectInfo_t *info, 37710122SJordan.Brown@Sun.COM smb_netsvc_t *ns, smb_svcenum_t *se) 37810122SJordan.Brown@Sun.COM { 37910122SJordan.Brown@Sun.COM srvsvc_NetConnectInfo0_t *info0; 38010122SJordan.Brown@Sun.COM srvsvc_NetConnectInfo1_t *info1; 38110122SJordan.Brown@Sun.COM srvsvc_NetConnectInfoBuf0_t *ci0; 38210122SJordan.Brown@Sun.COM srvsvc_NetConnectInfoBuf1_t *ci1; 38310122SJordan.Brown@Sun.COM smb_netsvcitem_t *item; 38410122SJordan.Brown@Sun.COM smb_netconnectinfo_t *tree; 38510122SJordan.Brown@Sun.COM 38610122SJordan.Brown@Sun.COM if (smb_kmod_enum(ns) != 0) 38710122SJordan.Brown@Sun.COM return (ERROR_INTERNAL_ERROR); 38810122SJordan.Brown@Sun.COM 38910122SJordan.Brown@Sun.COM info0 = info->ru.info0; 39010122SJordan.Brown@Sun.COM ci0 = info0->ci0; 39110122SJordan.Brown@Sun.COM 39210122SJordan.Brown@Sun.COM info1 = info->ru.info1; 39310122SJordan.Brown@Sun.COM ci1 = info1->ci1; 39410122SJordan.Brown@Sun.COM 39510122SJordan.Brown@Sun.COM item = list_head(&ns->ns_list); 39610122SJordan.Brown@Sun.COM while (item != NULL) { 39710122SJordan.Brown@Sun.COM tree = &item->nsi_un.nsi_tree; 39810122SJordan.Brown@Sun.COM 39910122SJordan.Brown@Sun.COM switch (se->se_level) { 40010122SJordan.Brown@Sun.COM case 0: 40110122SJordan.Brown@Sun.COM ci0->coni0_id = tree->ci_id; 40210122SJordan.Brown@Sun.COM ++ci0; 40310122SJordan.Brown@Sun.COM ++info0->entries_read; 40410122SJordan.Brown@Sun.COM break; 40510122SJordan.Brown@Sun.COM case 1: 40610122SJordan.Brown@Sun.COM ci1->coni1_id = tree->ci_id; 40710122SJordan.Brown@Sun.COM ci1->coni1_type = tree->ci_type; 40810122SJordan.Brown@Sun.COM ci1->coni1_num_opens = tree->ci_numopens; 40910122SJordan.Brown@Sun.COM ci1->coni1_num_users = tree->ci_numusers; 41010122SJordan.Brown@Sun.COM ci1->coni1_time = tree->ci_time; 41110122SJordan.Brown@Sun.COM ci1->coni1_username = (uint8_t *) 41210122SJordan.Brown@Sun.COM NDR_STRDUP(mxa, tree->ci_username); 41310122SJordan.Brown@Sun.COM ci1->coni1_netname = (uint8_t *) 41410122SJordan.Brown@Sun.COM NDR_STRDUP(mxa, tree->ci_share); 41510122SJordan.Brown@Sun.COM ++ci1; 41610122SJordan.Brown@Sun.COM ++info1->entries_read; 41710122SJordan.Brown@Sun.COM break; 41810122SJordan.Brown@Sun.COM default: 41910122SJordan.Brown@Sun.COM return (ERROR_INVALID_LEVEL); 42010122SJordan.Brown@Sun.COM } 42110122SJordan.Brown@Sun.COM 42210122SJordan.Brown@Sun.COM ++se->se_resume; 42310122SJordan.Brown@Sun.COM item = list_next(&ns->ns_list, item); 42410122SJordan.Brown@Sun.COM } 42510122SJordan.Brown@Sun.COM 4268474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 4278474SJose.Borrego@Sun.COM } 4288474SJose.Borrego@Sun.COM 4298474SJose.Borrego@Sun.COM /* 4308474SJose.Borrego@Sun.COM * srvsvc_netconnect_qualifier 4318474SJose.Borrego@Sun.COM * 4328474SJose.Borrego@Sun.COM * The qualifier is a string that specifies a share name or computer name 4338474SJose.Borrego@Sun.COM * for the connections of interest. If it is a share name then all the 4348474SJose.Borrego@Sun.COM * connections made to that share name are listed. If it is a computer 4358474SJose.Borrego@Sun.COM * name (it starts with two backslash characters), then NetConnectEnum 4368474SJose.Borrego@Sun.COM * lists all connections made from that computer to the specified server. 4378474SJose.Borrego@Sun.COM */ 4388474SJose.Borrego@Sun.COM static int 4398474SJose.Borrego@Sun.COM srvsvc_netconnect_qualifier(const char *qualifier) 4408474SJose.Borrego@Sun.COM { 4418474SJose.Borrego@Sun.COM if (qualifier == NULL || *qualifier == '\0') 4428474SJose.Borrego@Sun.COM return (SRVSVC_CONNECT_ENUM_NULL); 4438474SJose.Borrego@Sun.COM 4448474SJose.Borrego@Sun.COM if (strlen(qualifier) > MAXHOSTNAMELEN) 4458474SJose.Borrego@Sun.COM return (SRVSVC_CONNECT_ENUM_NULL); 4468474SJose.Borrego@Sun.COM 4478474SJose.Borrego@Sun.COM if (qualifier[0] == '\\' && qualifier[1] == '\\') { 4488474SJose.Borrego@Sun.COM return (SRVSVC_CONNECT_ENUM_WKSTN); 4498474SJose.Borrego@Sun.COM } else { 4508474SJose.Borrego@Sun.COM if (!smb_shr_exists((char *)qualifier)) 4518474SJose.Borrego@Sun.COM return (SRVSVC_CONNECT_ENUM_NULL); 4528474SJose.Borrego@Sun.COM 4538474SJose.Borrego@Sun.COM return (SRVSVC_CONNECT_ENUM_SHARE); 4548474SJose.Borrego@Sun.COM } 4558474SJose.Borrego@Sun.COM } 4568474SJose.Borrego@Sun.COM 45710122SJordan.Brown@Sun.COM static uint32_t 45810122SJordan.Brown@Sun.COM srvsvc_open_sessions(void) 45910122SJordan.Brown@Sun.COM { 46010122SJordan.Brown@Sun.COM smb_opennum_t opennum; 46110122SJordan.Brown@Sun.COM 46210122SJordan.Brown@Sun.COM bzero(&opennum, sizeof (smb_opennum_t)); 46310122SJordan.Brown@Sun.COM if (smb_kmod_get_open_num(&opennum) != 0) 46410122SJordan.Brown@Sun.COM return (0); 46510122SJordan.Brown@Sun.COM 46610122SJordan.Brown@Sun.COM return (opennum.open_users); 46710122SJordan.Brown@Sun.COM } 46810122SJordan.Brown@Sun.COM 46910122SJordan.Brown@Sun.COM static uint32_t 47010122SJordan.Brown@Sun.COM srvsvc_open_connections(uint32_t qualtype, const char *qualifier) 47110122SJordan.Brown@Sun.COM { 47210122SJordan.Brown@Sun.COM smb_opennum_t opennum; 47310122SJordan.Brown@Sun.COM 47410122SJordan.Brown@Sun.COM bzero(&opennum, sizeof (smb_opennum_t)); 47510122SJordan.Brown@Sun.COM opennum.qualtype = qualtype; 47610122SJordan.Brown@Sun.COM (void) strlcpy(opennum.qualifier, qualifier, MAXNAMELEN); 47710122SJordan.Brown@Sun.COM 47810122SJordan.Brown@Sun.COM if (smb_kmod_get_open_num(&opennum) != 0) 47910122SJordan.Brown@Sun.COM return (0); 48010122SJordan.Brown@Sun.COM 48110122SJordan.Brown@Sun.COM return (opennum.open_trees); 48210122SJordan.Brown@Sun.COM } 48310122SJordan.Brown@Sun.COM 48410122SJordan.Brown@Sun.COM static uint32_t 48510122SJordan.Brown@Sun.COM srvsvc_open_files(void) 48610122SJordan.Brown@Sun.COM { 48710122SJordan.Brown@Sun.COM smb_opennum_t opennum; 48810122SJordan.Brown@Sun.COM 48910122SJordan.Brown@Sun.COM bzero(&opennum, sizeof (smb_opennum_t)); 49010122SJordan.Brown@Sun.COM if (smb_kmod_get_open_num(&opennum) != 0) 49110122SJordan.Brown@Sun.COM return (0); 49210122SJordan.Brown@Sun.COM 49310122SJordan.Brown@Sun.COM return (opennum.open_files); 49410122SJordan.Brown@Sun.COM } 49510122SJordan.Brown@Sun.COM 4968474SJose.Borrego@Sun.COM /* 4978474SJose.Borrego@Sun.COM * srvsvc_s_NetFileEnum 4988474SJose.Borrego@Sun.COM * 4998474SJose.Borrego@Sun.COM * Return information on open files or named pipes. Only members of the 5008474SJose.Borrego@Sun.COM * Administrators or Server Operators local groups are allowed to make 5018474SJose.Borrego@Sun.COM * this call. Currently, we only support Administrators. 5028474SJose.Borrego@Sun.COM * 5038474SJose.Borrego@Sun.COM * If basepath is null, all open resources are enumerated. If basepath 5048474SJose.Borrego@Sun.COM * is non-null, only resources that have basepath as a prefix should 5058474SJose.Borrego@Sun.COM * be returned. 5068474SJose.Borrego@Sun.COM * 5078474SJose.Borrego@Sun.COM * If username is specified (non-null), only files opened by username 5088474SJose.Borrego@Sun.COM * should be returned. 5098474SJose.Borrego@Sun.COM * 5108474SJose.Borrego@Sun.COM * Notes: 5118474SJose.Borrego@Sun.COM * 1. We don't validate the servername because we would have to check 5128474SJose.Borrego@Sun.COM * all primary IPs and the ROI seems unlikely to be worth it. 5138474SJose.Borrego@Sun.COM * 2. Both basepath and username are currently ignored because both 5148474SJose.Borrego@Sun.COM * Server Manger (NT 4.0) and CMI (Windows 2000) always set them to null. 5158474SJose.Borrego@Sun.COM * 5168474SJose.Borrego@Sun.COM * The level of information requested may be one of: 5178474SJose.Borrego@Sun.COM * 5188474SJose.Borrego@Sun.COM * 2 Return the file identification number. 5198474SJose.Borrego@Sun.COM * This level is not supported on Windows Me/98/95. 5208474SJose.Borrego@Sun.COM * 5218474SJose.Borrego@Sun.COM * 3 Return information about the file. 5228474SJose.Borrego@Sun.COM * This level is not supported on Windows Me/98/95. 5238474SJose.Borrego@Sun.COM * 5248474SJose.Borrego@Sun.COM * 50 Windows Me/98/95: Return information about the file. 5258474SJose.Borrego@Sun.COM * 5268474SJose.Borrego@Sun.COM * Note: 5278474SJose.Borrego@Sun.COM * If pref_max_len is unlimited and resume_handle is null, the client 5288474SJose.Borrego@Sun.COM * expects to receive all data in a single call. 5298474SJose.Borrego@Sun.COM * If we are unable to do fit all data in a single response, we would 5308474SJose.Borrego@Sun.COM * normally return ERROR_MORE_DATA with a partial list. 5318474SJose.Borrego@Sun.COM * 5328474SJose.Borrego@Sun.COM * Unfortunately, when both of these conditions occur, Server Manager 5338474SJose.Borrego@Sun.COM * pops up an error box with the message "more data available" and 5348474SJose.Borrego@Sun.COM * doesn't display any of the returned data. In this case, it is 5358474SJose.Borrego@Sun.COM * probably better to return ERROR_SUCCESS with the partial list. 5368474SJose.Borrego@Sun.COM * Windows 2000 doesn't have this problem because it always sends a 5378474SJose.Borrego@Sun.COM * non-null resume_handle. 5388474SJose.Borrego@Sun.COM * 5398474SJose.Borrego@Sun.COM * Return Values: 5408474SJose.Borrego@Sun.COM * ERROR_SUCCESS Success 5418474SJose.Borrego@Sun.COM * ERROR_ACCESS_DENIED Caller does not have access to this call. 5428474SJose.Borrego@Sun.COM * ERROR_INVALID_PARAMETER One of the parameters is invalid. 5438474SJose.Borrego@Sun.COM * ERROR_INVALID_LEVEL Unknown information level specified. 5448474SJose.Borrego@Sun.COM * ERROR_MORE_DATA Partial date returned, more entries available. 5458474SJose.Borrego@Sun.COM * ERROR_NOT_ENOUGH_MEMORY Insufficient memory is available. 5468474SJose.Borrego@Sun.COM * NERR_BufTooSmall The supplied buffer is too small. 5478474SJose.Borrego@Sun.COM */ 5488474SJose.Borrego@Sun.COM static int 5498474SJose.Borrego@Sun.COM srvsvc_s_NetFileEnum(void *arg, ndr_xa_t *mxa) 5508474SJose.Borrego@Sun.COM { 55110122SJordan.Brown@Sun.COM struct mslm_NetFileEnum *param = arg; 55210122SJordan.Brown@Sun.COM smb_svcenum_t se; 55310122SJordan.Brown@Sun.COM DWORD status; 5548474SJose.Borrego@Sun.COM 5558474SJose.Borrego@Sun.COM if (!ndr_is_admin(mxa)) { 5568474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetFileEnum)); 5578474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 5588474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 5598474SJose.Borrego@Sun.COM } 5608474SJose.Borrego@Sun.COM 56110122SJordan.Brown@Sun.COM if ((param->total_entries = srvsvc_open_files()) == 0) { 56210122SJordan.Brown@Sun.COM bzero(param, sizeof (struct mslm_NetFileEnum)); 56310122SJordan.Brown@Sun.COM param->status = ERROR_SUCCESS; 56410122SJordan.Brown@Sun.COM return (NDR_DRC_OK); 56510122SJordan.Brown@Sun.COM } 56610122SJordan.Brown@Sun.COM 56710122SJordan.Brown@Sun.COM bzero(&se, sizeof (smb_svcenum_t)); 56810122SJordan.Brown@Sun.COM se.se_type = SMB_SVCENUM_TYPE_FILE; 56910122SJordan.Brown@Sun.COM se.se_level = param->info.switch_value; 57010122SJordan.Brown@Sun.COM se.se_ntotal = param->total_entries; 57110122SJordan.Brown@Sun.COM se.se_nlimit = se.se_ntotal; 57210122SJordan.Brown@Sun.COM 57310122SJordan.Brown@Sun.COM if (param->pref_max_len == SMB_SRVSVC_MAXPREFLEN || 57410122SJordan.Brown@Sun.COM param->pref_max_len > SMB_SRVSVC_MAXBUFLEN) 57510122SJordan.Brown@Sun.COM se.se_prefmaxlen = SMB_SRVSVC_MAXBUFLEN; 57610122SJordan.Brown@Sun.COM else 57710122SJordan.Brown@Sun.COM se.se_prefmaxlen = param->pref_max_len; 57810122SJordan.Brown@Sun.COM 57910122SJordan.Brown@Sun.COM if (param->resume_handle) { 58010122SJordan.Brown@Sun.COM se.se_resume = *param->resume_handle; 58110122SJordan.Brown@Sun.COM se.se_nskip = se.se_resume; 58210122SJordan.Brown@Sun.COM *param->resume_handle = 0; 58310122SJordan.Brown@Sun.COM } 58410122SJordan.Brown@Sun.COM 5858474SJose.Borrego@Sun.COM switch (param->info.switch_value) { 5868474SJose.Borrego@Sun.COM case 2: 58710122SJordan.Brown@Sun.COM status = srvsvc_NetFileEnum2(mxa, param, &se); 5888474SJose.Borrego@Sun.COM break; 5898474SJose.Borrego@Sun.COM 5908474SJose.Borrego@Sun.COM case 3: 59110122SJordan.Brown@Sun.COM status = srvsvc_NetFileEnum3(mxa, param, &se); 5928474SJose.Borrego@Sun.COM break; 5938474SJose.Borrego@Sun.COM 5948474SJose.Borrego@Sun.COM case 50: 5958474SJose.Borrego@Sun.COM status = ERROR_NOT_SUPPORTED; 5968474SJose.Borrego@Sun.COM break; 5978474SJose.Borrego@Sun.COM 5988474SJose.Borrego@Sun.COM default: 5998474SJose.Borrego@Sun.COM status = ERROR_INVALID_LEVEL; 6008474SJose.Borrego@Sun.COM break; 6018474SJose.Borrego@Sun.COM } 6028474SJose.Borrego@Sun.COM 6038474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) { 6048474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetFileEnum)); 6058474SJose.Borrego@Sun.COM param->status = status; 6068474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 6078474SJose.Borrego@Sun.COM } 6088474SJose.Borrego@Sun.COM 60910122SJordan.Brown@Sun.COM if (param->resume_handle && 61010122SJordan.Brown@Sun.COM param->pref_max_len != SMB_SRVSVC_MAXPREFLEN) { 61110122SJordan.Brown@Sun.COM if (se.se_resume < param->total_entries) { 61210122SJordan.Brown@Sun.COM *param->resume_handle = se.se_resume; 61310122SJordan.Brown@Sun.COM status = ERROR_MORE_DATA; 61410122SJordan.Brown@Sun.COM } 61510122SJordan.Brown@Sun.COM } 61610122SJordan.Brown@Sun.COM 61710122SJordan.Brown@Sun.COM param->status = status; 6188474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 6198474SJose.Borrego@Sun.COM } 6208474SJose.Borrego@Sun.COM 6218474SJose.Borrego@Sun.COM /* 6228474SJose.Borrego@Sun.COM * Build level 2 file information. 6238474SJose.Borrego@Sun.COM * 62410122SJordan.Brown@Sun.COM * SMB fids are 16-bit values but this interface expects 32-bit file ids. 62510122SJordan.Brown@Sun.COM * So we use the uniqid here. 62610122SJordan.Brown@Sun.COM * 6278474SJose.Borrego@Sun.COM * On success, the caller expects that the info2, fi2 and entries_read 6288474SJose.Borrego@Sun.COM * fields have been set up. 6298474SJose.Borrego@Sun.COM */ 6308474SJose.Borrego@Sun.COM static DWORD 63110122SJordan.Brown@Sun.COM srvsvc_NetFileEnum2(ndr_xa_t *mxa, struct mslm_NetFileEnum *param, 63210122SJordan.Brown@Sun.COM smb_svcenum_t *se) 6338474SJose.Borrego@Sun.COM { 63410122SJordan.Brown@Sun.COM struct mslm_NetFileInfoBuf2 *fi2; 63510122SJordan.Brown@Sun.COM smb_netsvc_t *ns; 63610122SJordan.Brown@Sun.COM smb_netsvcitem_t *item; 63710122SJordan.Brown@Sun.COM smb_netfileinfo_t *ofile; 63810122SJordan.Brown@Sun.COM uint32_t entries_read = 0; 6398474SJose.Borrego@Sun.COM 6408474SJose.Borrego@Sun.COM param->info.ru.info2 = NDR_NEW(mxa, struct mslm_NetFileInfo2); 6419832Samw@Sun.COM if (param->info.ru.info2 == NULL) 6428474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 6438474SJose.Borrego@Sun.COM 64410122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, sizeof (struct mslm_NetFileInfoBuf2)); 64510122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 64610122SJordan.Brown@Sun.COM return (NERR_BufTooSmall); 64710122SJordan.Brown@Sun.COM 64810122SJordan.Brown@Sun.COM do { 64910122SJordan.Brown@Sun.COM fi2 = NDR_NEWN(mxa, struct mslm_NetFileInfoBuf2, se->se_nlimit); 65010122SJordan.Brown@Sun.COM if (fi2 == NULL) 65110122SJordan.Brown@Sun.COM se->se_nlimit >>= 1; 65210122SJordan.Brown@Sun.COM } while ((se->se_nlimit > 0) && (fi2 == NULL)); 65310122SJordan.Brown@Sun.COM 6548474SJose.Borrego@Sun.COM if (fi2 == NULL) 6558474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 6568474SJose.Borrego@Sun.COM 6578474SJose.Borrego@Sun.COM param->info.ru.info2->fi2 = fi2; 6588474SJose.Borrego@Sun.COM 65910122SJordan.Brown@Sun.COM if ((ns = smb_kmod_enum_init(se)) == NULL) 66010122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 66110122SJordan.Brown@Sun.COM 66210122SJordan.Brown@Sun.COM if (smb_kmod_enum(ns) != 0) { 66310122SJordan.Brown@Sun.COM smb_kmod_enum_fini(ns); 66410122SJordan.Brown@Sun.COM return (ERROR_INTERNAL_ERROR); 66510122SJordan.Brown@Sun.COM } 66610122SJordan.Brown@Sun.COM 66710122SJordan.Brown@Sun.COM item = list_head(&ns->ns_list); 66810122SJordan.Brown@Sun.COM while (item != NULL) { 66910122SJordan.Brown@Sun.COM ofile = &item->nsi_un.nsi_ofile; 67010122SJordan.Brown@Sun.COM fi2->fi2_id = ofile->fi_uniqid; 6718474SJose.Borrego@Sun.COM 6728474SJose.Borrego@Sun.COM ++entries_read; 6738474SJose.Borrego@Sun.COM ++fi2; 67410122SJordan.Brown@Sun.COM item = list_next(&ns->ns_list, item); 6758474SJose.Borrego@Sun.COM } 6768474SJose.Borrego@Sun.COM 67710122SJordan.Brown@Sun.COM se->se_resume += entries_read; 6788474SJose.Borrego@Sun.COM param->info.ru.info2->entries_read = entries_read; 67910122SJordan.Brown@Sun.COM smb_kmod_enum_fini(ns); 6808474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 6818474SJose.Borrego@Sun.COM } 6828474SJose.Borrego@Sun.COM 6838474SJose.Borrego@Sun.COM /* 6848474SJose.Borrego@Sun.COM * Build level 3 file information. 6858474SJose.Borrego@Sun.COM * 68610122SJordan.Brown@Sun.COM * SMB fids are 16-bit values but this interface expects 32-bit file ids. 68710122SJordan.Brown@Sun.COM * So we use the uniqid here. 68810122SJordan.Brown@Sun.COM * 6898474SJose.Borrego@Sun.COM * On success, the caller expects that the info3, fi3 and entries_read 6908474SJose.Borrego@Sun.COM * fields have been set up. 6918474SJose.Borrego@Sun.COM */ 6928474SJose.Borrego@Sun.COM static DWORD 69310122SJordan.Brown@Sun.COM srvsvc_NetFileEnum3(ndr_xa_t *mxa, struct mslm_NetFileEnum *param, 69410122SJordan.Brown@Sun.COM smb_svcenum_t *se) 6958474SJose.Borrego@Sun.COM { 69610122SJordan.Brown@Sun.COM struct mslm_NetFileInfoBuf3 *fi3; 69710122SJordan.Brown@Sun.COM smb_netsvc_t *ns; 69810122SJordan.Brown@Sun.COM smb_netsvcitem_t *item; 69910122SJordan.Brown@Sun.COM smb_netfileinfo_t *ofile; 70010122SJordan.Brown@Sun.COM uint32_t entries_read = 0; 7018474SJose.Borrego@Sun.COM 7028474SJose.Borrego@Sun.COM param->info.ru.info3 = NDR_NEW(mxa, struct mslm_NetFileInfo3); 7038474SJose.Borrego@Sun.COM if (param->info.ru.info3 == NULL) 7048474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 7058474SJose.Borrego@Sun.COM 70610122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 70710122SJordan.Brown@Sun.COM sizeof (struct mslm_NetFileInfoBuf3) + MAXNAMELEN); 70810122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 70910122SJordan.Brown@Sun.COM return (NERR_BufTooSmall); 71010122SJordan.Brown@Sun.COM 71110122SJordan.Brown@Sun.COM do { 71210122SJordan.Brown@Sun.COM fi3 = NDR_NEWN(mxa, struct mslm_NetFileInfoBuf3, se->se_nlimit); 71310122SJordan.Brown@Sun.COM if (fi3 == NULL) 71410122SJordan.Brown@Sun.COM se->se_nlimit >>= 1; 71510122SJordan.Brown@Sun.COM } while ((se->se_nlimit > 0) && (fi3 == NULL)); 71610122SJordan.Brown@Sun.COM 7178474SJose.Borrego@Sun.COM if (fi3 == NULL) 7188474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 7198474SJose.Borrego@Sun.COM 7208474SJose.Borrego@Sun.COM param->info.ru.info3->fi3 = fi3; 7218474SJose.Borrego@Sun.COM 72210122SJordan.Brown@Sun.COM if ((ns = smb_kmod_enum_init(se)) == NULL) 72310122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 72410122SJordan.Brown@Sun.COM 72510122SJordan.Brown@Sun.COM if (smb_kmod_enum(ns) != 0) { 72610122SJordan.Brown@Sun.COM smb_kmod_enum_fini(ns); 72710122SJordan.Brown@Sun.COM return (ERROR_INTERNAL_ERROR); 72810122SJordan.Brown@Sun.COM } 72910122SJordan.Brown@Sun.COM 73010122SJordan.Brown@Sun.COM item = list_head(&ns->ns_list); 73110122SJordan.Brown@Sun.COM while (item != NULL) { 73210122SJordan.Brown@Sun.COM ofile = &item->nsi_un.nsi_ofile; 73310122SJordan.Brown@Sun.COM fi3->fi3_id = ofile->fi_uniqid; 73410122SJordan.Brown@Sun.COM fi3->fi3_permissions = ofile->fi_permissions; 73510122SJordan.Brown@Sun.COM fi3->fi3_num_locks = ofile->fi_numlocks; 7368474SJose.Borrego@Sun.COM fi3->fi3_pathname = (uint8_t *) 73710122SJordan.Brown@Sun.COM NDR_STRDUP(mxa, ofile->fi_path); 7388474SJose.Borrego@Sun.COM fi3->fi3_username = (uint8_t *) 73910122SJordan.Brown@Sun.COM NDR_STRDUP(mxa, ofile->fi_username); 7408474SJose.Borrego@Sun.COM 7418474SJose.Borrego@Sun.COM ++entries_read; 7428474SJose.Borrego@Sun.COM ++fi3; 74310122SJordan.Brown@Sun.COM item = list_next(&ns->ns_list, item); 7448474SJose.Borrego@Sun.COM } 7458474SJose.Borrego@Sun.COM 74610122SJordan.Brown@Sun.COM se->se_resume += entries_read; 7478474SJose.Borrego@Sun.COM param->info.ru.info3->entries_read = entries_read; 7488474SJose.Borrego@Sun.COM param->total_entries = entries_read; 7498474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 7508474SJose.Borrego@Sun.COM } 7518474SJose.Borrego@Sun.COM 7528474SJose.Borrego@Sun.COM /* 7538474SJose.Borrego@Sun.COM * srvsvc_s_NetFileClose 7548474SJose.Borrego@Sun.COM * 7558474SJose.Borrego@Sun.COM * NetFileClose forces a file to close. This function can be used when 75610122SJordan.Brown@Sun.COM * an error prevents closure by other means. Use NetFileClose with 7578474SJose.Borrego@Sun.COM * caution because it does not flush data, cached on a client, to the 7588474SJose.Borrego@Sun.COM * file before closing the file. 7598474SJose.Borrego@Sun.COM * 76010122SJordan.Brown@Sun.COM * SMB fids are 16-bit values but this interface expects 32-bit file ids. 76110122SJordan.Brown@Sun.COM * So we use the uniqid here. 76210122SJordan.Brown@Sun.COM * 7638474SJose.Borrego@Sun.COM * Return Values 7648474SJose.Borrego@Sun.COM * ERROR_SUCCESS Operation succeeded. 7658474SJose.Borrego@Sun.COM * ERROR_ACCESS_DENIED Operation denied. 7668474SJose.Borrego@Sun.COM * NERR_FileIdNotFound No open file with the specified id. 7678474SJose.Borrego@Sun.COM * 76810122SJordan.Brown@Sun.COM * Note: MSDN suggests ERROR_FILE_NOT_FOUND for NetFileClose but network 76910122SJordan.Brown@Sun.COM * captures using NT show NERR_FileIdNotFound, which is consistent with 77010122SJordan.Brown@Sun.COM * the NetFileClose2 page on MSDN. 7718474SJose.Borrego@Sun.COM */ 7728474SJose.Borrego@Sun.COM static int 7738474SJose.Borrego@Sun.COM srvsvc_s_NetFileClose(void *arg, ndr_xa_t *mxa) 7748474SJose.Borrego@Sun.COM { 77510122SJordan.Brown@Sun.COM static struct { 77610122SJordan.Brown@Sun.COM int errnum; 77710122SJordan.Brown@Sun.COM int nerr; 77810122SJordan.Brown@Sun.COM } errmap[] = { 77910122SJordan.Brown@Sun.COM 0, ERROR_SUCCESS, 78010122SJordan.Brown@Sun.COM EACCES, ERROR_ACCESS_DENIED, 78110122SJordan.Brown@Sun.COM EPERM, ERROR_ACCESS_DENIED, 78210122SJordan.Brown@Sun.COM EINVAL, ERROR_INVALID_PARAMETER, 78310122SJordan.Brown@Sun.COM ENOMEM, ERROR_NOT_ENOUGH_MEMORY, 78410122SJordan.Brown@Sun.COM ENOENT, NERR_FileIdNotFound 78510122SJordan.Brown@Sun.COM }; 78610122SJordan.Brown@Sun.COM 7878474SJose.Borrego@Sun.COM struct mslm_NetFileClose *param = arg; 78810122SJordan.Brown@Sun.COM int i; 78910122SJordan.Brown@Sun.COM int rc; 7908474SJose.Borrego@Sun.COM 7918474SJose.Borrego@Sun.COM if (!ndr_is_admin(mxa)) { 7928474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 7938474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 7948474SJose.Borrego@Sun.COM } 7958474SJose.Borrego@Sun.COM 79610122SJordan.Brown@Sun.COM rc = smb_kmod_file_close(param->file_id); 79710122SJordan.Brown@Sun.COM 79810122SJordan.Brown@Sun.COM for (i = 0; i < (sizeof (errmap) / sizeof (errmap[0])); ++i) { 79910122SJordan.Brown@Sun.COM if (rc == errmap[i].errnum) { 80010122SJordan.Brown@Sun.COM param->status = errmap[i].nerr; 80110122SJordan.Brown@Sun.COM return (NDR_DRC_OK); 80210122SJordan.Brown@Sun.COM } 80310122SJordan.Brown@Sun.COM } 80410122SJordan.Brown@Sun.COM 80510122SJordan.Brown@Sun.COM param->status = ERROR_INTERNAL_ERROR; 8068474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 8078474SJose.Borrego@Sun.COM } 8088474SJose.Borrego@Sun.COM 8098474SJose.Borrego@Sun.COM /* 8108474SJose.Borrego@Sun.COM * srvsvc_s_NetShareGetInfo 8118474SJose.Borrego@Sun.COM * 8128474SJose.Borrego@Sun.COM * Returns Win32 error codes. 8138474SJose.Borrego@Sun.COM */ 8148474SJose.Borrego@Sun.COM static int 8158474SJose.Borrego@Sun.COM srvsvc_s_NetShareGetInfo(void *arg, ndr_xa_t *mxa) 8168474SJose.Borrego@Sun.COM { 8178474SJose.Borrego@Sun.COM struct mlsm_NetShareGetInfo *param = arg; 8189343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_0 *info0; 8199343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_1 *info1; 8209343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_2 *info2; 8219343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_501 *info501; 8229343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_502 *info502; 8239832Samw@Sun.COM struct mslm_NetShareInfo_503 *info503; 8249343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_1004 *info1004; 8259343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_1005 *info1005; 8269343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_1006 *info1006; 8279832Samw@Sun.COM struct mslm_NetShareInfo_1501 *info1501; 8289832Samw@Sun.COM srvsvc_netshare_getinfo_t *info; 8299832Samw@Sun.COM uint8_t *netname; 8309832Samw@Sun.COM uint8_t *comment; 8318474SJose.Borrego@Sun.COM smb_share_t si; 8329832Samw@Sun.COM srvsvc_sd_t sd; 8338474SJose.Borrego@Sun.COM DWORD status; 8348474SJose.Borrego@Sun.COM 8358474SJose.Borrego@Sun.COM status = smb_shr_get((char *)param->netname, &si); 8368474SJose.Borrego@Sun.COM if (status != NERR_Success) { 8378474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mlsm_NetShareGetInfo)); 8388474SJose.Borrego@Sun.COM param->status = status; 8398474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 8408474SJose.Borrego@Sun.COM } 8418474SJose.Borrego@Sun.COM 8429832Samw@Sun.COM netname = (uint8_t *)NDR_STRDUP(mxa, si.shr_name); 8439832Samw@Sun.COM comment = (uint8_t *)NDR_STRDUP(mxa, si.shr_cmnt); 8449832Samw@Sun.COM info = NDR_NEW(mxa, srvsvc_netshare_getinfo_t); 8459832Samw@Sun.COM 8469832Samw@Sun.COM if (netname == NULL || comment == NULL || info == NULL) { 8479832Samw@Sun.COM bzero(param, sizeof (struct mlsm_NetShareGetInfo)); 8489832Samw@Sun.COM param->status = ERROR_NOT_ENOUGH_MEMORY; 8499832Samw@Sun.COM return (NDR_DRC_OK); 8509832Samw@Sun.COM } 8519832Samw@Sun.COM 8528474SJose.Borrego@Sun.COM switch (param->level) { 8538474SJose.Borrego@Sun.COM case 0: 8549832Samw@Sun.COM info0 = &info->nsg_info0; 8559832Samw@Sun.COM info0->shi0_netname = netname; 8568474SJose.Borrego@Sun.COM param->result.ru.info0 = info0; 8578474SJose.Borrego@Sun.COM break; 8588474SJose.Borrego@Sun.COM 8598474SJose.Borrego@Sun.COM case 1: 8609832Samw@Sun.COM info1 = &info->nsg_info1; 8619832Samw@Sun.COM info1->shi1_netname = netname; 8629832Samw@Sun.COM info1->shi1_comment = comment; 8638474SJose.Borrego@Sun.COM info1->shi1_type = si.shr_type; 8648474SJose.Borrego@Sun.COM param->result.ru.info1 = info1; 8658474SJose.Borrego@Sun.COM break; 8668474SJose.Borrego@Sun.COM 8678474SJose.Borrego@Sun.COM case 2: 8689832Samw@Sun.COM info2 = &info->nsg_info2; 8699832Samw@Sun.COM info2->shi2_netname = netname; 8709832Samw@Sun.COM info2->shi2_comment = comment; 8718474SJose.Borrego@Sun.COM info2->shi2_path = 8728474SJose.Borrego@Sun.COM (uint8_t *)srvsvc_share_mkpath(mxa, si.shr_path); 8738474SJose.Borrego@Sun.COM info2->shi2_passwd = 0; 8748474SJose.Borrego@Sun.COM info2->shi2_type = si.shr_type; 8758474SJose.Borrego@Sun.COM info2->shi2_permissions = 0; 8768474SJose.Borrego@Sun.COM info2->shi2_max_uses = SHI_USES_UNLIMITED; 8778474SJose.Borrego@Sun.COM info2->shi2_current_uses = 0; 8788474SJose.Borrego@Sun.COM param->result.ru.info2 = info2; 8798474SJose.Borrego@Sun.COM break; 8808474SJose.Borrego@Sun.COM 8819832Samw@Sun.COM case 501: 8829832Samw@Sun.COM info501 = &info->nsg_info501; 8839832Samw@Sun.COM info501->shi501_netname = netname; 8849832Samw@Sun.COM info501->shi501_comment = comment; 8859832Samw@Sun.COM info501->shi501_type = si.shr_type; 88610504SKeyur.Desai@Sun.COM info501->shi501_flags = srvsvc_get_share_flags(&si); 8879832Samw@Sun.COM param->result.ru.info501 = info501; 8889832Samw@Sun.COM break; 8899832Samw@Sun.COM 8909832Samw@Sun.COM case 502: 8919832Samw@Sun.COM info502 = &info->nsg_info502; 8929832Samw@Sun.COM info502->shi502_netname = netname; 8939832Samw@Sun.COM info502->shi502_comment = comment; 8949832Samw@Sun.COM info502->shi502_path = 8959832Samw@Sun.COM (uint8_t *)srvsvc_share_mkpath(mxa, si.shr_path); 8969832Samw@Sun.COM info502->shi502_passwd = 0; 8979832Samw@Sun.COM info502->shi502_type = si.shr_type; 8989832Samw@Sun.COM info502->shi502_permissions = 0; 8999832Samw@Sun.COM info502->shi502_max_uses = SHI_USES_UNLIMITED; 9009832Samw@Sun.COM info502->shi502_current_uses = 0; 9019832Samw@Sun.COM 9029832Samw@Sun.COM status = srvsvc_share_getsd(mxa, &si, &sd); 9039832Samw@Sun.COM if (status == ERROR_SUCCESS) { 9049832Samw@Sun.COM info502->shi502_reserved = sd.sd_size; 9059832Samw@Sun.COM info502->shi502_security_descriptor = sd.sd_buf; 9069832Samw@Sun.COM } else { 9079832Samw@Sun.COM info502->shi502_reserved = 0; 9089832Samw@Sun.COM info502->shi502_security_descriptor = NULL; 9098474SJose.Borrego@Sun.COM } 9108474SJose.Borrego@Sun.COM 9119832Samw@Sun.COM param->result.ru.info502 = info502; 9129832Samw@Sun.COM break; 9139832Samw@Sun.COM 9149832Samw@Sun.COM case 503: 9159832Samw@Sun.COM info503 = &info->nsg_info503; 9169832Samw@Sun.COM info503->shi503_netname = netname; 9179832Samw@Sun.COM info503->shi503_comment = comment; 9189832Samw@Sun.COM info503->shi503_path = 9199832Samw@Sun.COM (uint8_t *)srvsvc_share_mkpath(mxa, si.shr_path); 9209832Samw@Sun.COM info503->shi503_passwd = NULL; 9219832Samw@Sun.COM info503->shi503_type = si.shr_type; 9229832Samw@Sun.COM info503->shi503_permissions = 0; 9239832Samw@Sun.COM info503->shi503_max_uses = SHI_USES_UNLIMITED; 9249832Samw@Sun.COM info503->shi503_current_uses = 0; 9259832Samw@Sun.COM info503->shi503_servername = NULL; 9269832Samw@Sun.COM 9279832Samw@Sun.COM status = srvsvc_share_getsd(mxa, &si, &sd); 9289832Samw@Sun.COM if (status == ERROR_SUCCESS) { 9299832Samw@Sun.COM info503->shi503_reserved = sd.sd_size; 9309832Samw@Sun.COM info503->shi503_security_descriptor = sd.sd_buf; 9319832Samw@Sun.COM } else { 9329832Samw@Sun.COM info503->shi503_reserved = 0; 9339832Samw@Sun.COM info503->shi503_security_descriptor = NULL; 9349832Samw@Sun.COM } 9359832Samw@Sun.COM 9369832Samw@Sun.COM param->result.ru.info503 = info503; 9379832Samw@Sun.COM break; 9389832Samw@Sun.COM 9399832Samw@Sun.COM case 1004: 9409832Samw@Sun.COM info1004 = &info->nsg_info1004; 9419832Samw@Sun.COM info1004->shi1004_comment = comment; 9429832Samw@Sun.COM param->result.ru.info1004 = info1004; 9438474SJose.Borrego@Sun.COM break; 9448474SJose.Borrego@Sun.COM 9458474SJose.Borrego@Sun.COM case 1005: 9469832Samw@Sun.COM info1005 = &info->nsg_info1005; 94710504SKeyur.Desai@Sun.COM info1005->shi1005_flags = srvsvc_get_share_flags(&si); 9488474SJose.Borrego@Sun.COM param->result.ru.info1005 = info1005; 9498474SJose.Borrego@Sun.COM break; 9508474SJose.Borrego@Sun.COM 9518474SJose.Borrego@Sun.COM case 1006: 9529832Samw@Sun.COM info1006 = &info->nsg_info1006; 9538474SJose.Borrego@Sun.COM info1006->shi1006_max_uses = SHI_USES_UNLIMITED; 9548474SJose.Borrego@Sun.COM param->result.ru.info1006 = info1006; 9558474SJose.Borrego@Sun.COM break; 9568474SJose.Borrego@Sun.COM 9579832Samw@Sun.COM case 1501: 9589832Samw@Sun.COM info1501 = &info->nsg_info1501; 9599832Samw@Sun.COM 9609832Samw@Sun.COM status = srvsvc_share_getsd(mxa, &si, &sd); 9619832Samw@Sun.COM if (status == ERROR_SUCCESS) { 9629832Samw@Sun.COM info503->shi503_reserved = sd.sd_size; 9639832Samw@Sun.COM info503->shi503_security_descriptor = sd.sd_buf; 9649832Samw@Sun.COM } else { 9659832Samw@Sun.COM info503->shi503_reserved = 0; 9669832Samw@Sun.COM info503->shi503_security_descriptor = NULL; 9678474SJose.Borrego@Sun.COM } 9688474SJose.Borrego@Sun.COM 9699832Samw@Sun.COM param->result.ru.info1501 = info1501; 9708474SJose.Borrego@Sun.COM break; 9718474SJose.Borrego@Sun.COM 9728474SJose.Borrego@Sun.COM default: 9738474SJose.Borrego@Sun.COM status = ERROR_ACCESS_DENIED; 9748474SJose.Borrego@Sun.COM break; 9758474SJose.Borrego@Sun.COM } 9768474SJose.Borrego@Sun.COM 9778474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 9788474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mlsm_NetShareGetInfo)); 9798474SJose.Borrego@Sun.COM else 9808474SJose.Borrego@Sun.COM param->result.switch_value = param->level; 9818474SJose.Borrego@Sun.COM 9828474SJose.Borrego@Sun.COM param->status = status; 9838474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 9848474SJose.Borrego@Sun.COM } 9858474SJose.Borrego@Sun.COM 9869832Samw@Sun.COM static uint32_t 9879832Samw@Sun.COM srvsvc_share_getsd(ndr_xa_t *mxa, smb_share_t *si, srvsvc_sd_t *sd) 9889832Samw@Sun.COM { 9899832Samw@Sun.COM uint32_t status; 9909832Samw@Sun.COM 9919832Samw@Sun.COM status = srvsvc_sd_get(si, NULL, &sd->sd_size); 9929832Samw@Sun.COM if (status != ERROR_SUCCESS) { 9939832Samw@Sun.COM if (status == ERROR_PATH_NOT_FOUND) { 9949832Samw@Sun.COM bzero(sd, sizeof (srvsvc_sd_t)); 9959832Samw@Sun.COM status = ERROR_SUCCESS; 9969832Samw@Sun.COM } 9979832Samw@Sun.COM 9989832Samw@Sun.COM return (status); 9999832Samw@Sun.COM } 10009832Samw@Sun.COM 10019832Samw@Sun.COM if ((sd->sd_buf = NDR_MALLOC(mxa, sd->sd_size)) == NULL) 10029832Samw@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 10039832Samw@Sun.COM 10049832Samw@Sun.COM status = srvsvc_sd_get(si, sd->sd_buf, NULL); 10059832Samw@Sun.COM if (status == ERROR_PATH_NOT_FOUND) { 10069832Samw@Sun.COM bzero(sd, sizeof (srvsvc_sd_t)); 10079832Samw@Sun.COM status = ERROR_SUCCESS; 10089832Samw@Sun.COM } 10099832Samw@Sun.COM 10109832Samw@Sun.COM return (status); 10119832Samw@Sun.COM } 10128474SJose.Borrego@Sun.COM 10138474SJose.Borrego@Sun.COM /* 10148474SJose.Borrego@Sun.COM * srvsvc_s_NetShareSetInfo 10158474SJose.Borrego@Sun.COM * 10168474SJose.Borrego@Sun.COM * This call is made by SrvMgr to set share information. 10179832Samw@Sun.COM * Only power users groups can manage shares. 10189832Samw@Sun.COM * 10199832Samw@Sun.COM * To avoid misleading errors, we don't report an error 10209832Samw@Sun.COM * when a FS doesn't support ACLs on shares. 10218474SJose.Borrego@Sun.COM * 10228474SJose.Borrego@Sun.COM * Returns Win32 error codes. 10238474SJose.Borrego@Sun.COM */ 10248474SJose.Borrego@Sun.COM static int 10258474SJose.Borrego@Sun.COM srvsvc_s_NetShareSetInfo(void *arg, ndr_xa_t *mxa) 10268474SJose.Borrego@Sun.COM { 10278474SJose.Borrego@Sun.COM struct mlsm_NetShareSetInfo *param = arg; 10289832Samw@Sun.COM struct mslm_NetShareInfo_0 *info0; 10299832Samw@Sun.COM struct mslm_NetShareInfo_1 *info1; 10309832Samw@Sun.COM struct mslm_NetShareInfo_2 *info2; 10319832Samw@Sun.COM struct mslm_NetShareInfo_501 *info501; 10329832Samw@Sun.COM struct mslm_NetShareInfo_502 *info502; 10339832Samw@Sun.COM struct mslm_NetShareInfo_503 *info503; 10349832Samw@Sun.COM struct mslm_NetShareInfo_1004 *info1004; 10359832Samw@Sun.COM struct mslm_NetShareInfo_1005 *info1005; 10369832Samw@Sun.COM struct mslm_NetShareInfo_1501 *info1501; 10379832Samw@Sun.COM static DWORD parm_err = 0; 10389832Samw@Sun.COM srvsvc_netshare_setinfo_t info; 10399832Samw@Sun.COM smb_share_t si; 10409832Samw@Sun.COM uint8_t *sdbuf; 10419832Samw@Sun.COM int32_t native_os; 10429832Samw@Sun.COM DWORD status; 10439832Samw@Sun.COM 10449832Samw@Sun.COM native_os = ndr_native_os(mxa); 10459832Samw@Sun.COM 10469832Samw@Sun.COM if (!ndr_is_poweruser(mxa)) { 10479832Samw@Sun.COM status = ERROR_ACCESS_DENIED; 10489832Samw@Sun.COM goto netsharesetinfo_exit; 10499832Samw@Sun.COM } 10509832Samw@Sun.COM 10519832Samw@Sun.COM if (smb_shr_get((char *)param->netname, &si) != NERR_Success) { 10529832Samw@Sun.COM status = ERROR_INVALID_NETNAME; 10539832Samw@Sun.COM goto netsharesetinfo_exit; 10549832Samw@Sun.COM } 10559832Samw@Sun.COM 10569832Samw@Sun.COM if (param->result.ru.nullptr == NULL) { 10579832Samw@Sun.COM status = ERROR_INVALID_PARAMETER; 10589832Samw@Sun.COM goto netsharesetinfo_exit; 10599832Samw@Sun.COM } 10609832Samw@Sun.COM 10619832Samw@Sun.COM bzero(&info, sizeof (srvsvc_netshare_setinfo_t)); 10629832Samw@Sun.COM 10639832Samw@Sun.COM switch (param->level) { 10649832Samw@Sun.COM case 0: 10659832Samw@Sun.COM info0 = (struct mslm_NetShareInfo_0 *)param->result.ru.info0; 10669832Samw@Sun.COM info.nss_netname = (char *)info0->shi0_netname; 10679832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 10689832Samw@Sun.COM break; 10699832Samw@Sun.COM 10709832Samw@Sun.COM case 1: 10719832Samw@Sun.COM info1 = (struct mslm_NetShareInfo_1 *)param->result.ru.info1; 10729832Samw@Sun.COM info.nss_netname = (char *)info1->shi1_netname; 10739832Samw@Sun.COM info.nss_comment = (char *)info1->shi1_comment; 10749832Samw@Sun.COM info.nss_type = info1->shi1_type; 10759832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 10769832Samw@Sun.COM break; 10779832Samw@Sun.COM 10789832Samw@Sun.COM case 2: 10799832Samw@Sun.COM info2 = (struct mslm_NetShareInfo_2 *)param->result.ru.info2; 10809832Samw@Sun.COM info.nss_netname = (char *)info2->shi2_netname; 10819832Samw@Sun.COM info.nss_comment = (char *)info2->shi2_comment; 10829832Samw@Sun.COM info.nss_path = (char *)info2->shi2_path; 10839832Samw@Sun.COM info.nss_type = info2->shi2_type; 10849832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 10859832Samw@Sun.COM break; 10869832Samw@Sun.COM 10879832Samw@Sun.COM case 501: 10889832Samw@Sun.COM info501 = (struct mslm_NetShareInfo_501 *) 10899832Samw@Sun.COM param->result.ru.info501; 10909832Samw@Sun.COM info.nss_netname = (char *)info501->shi501_netname; 10919832Samw@Sun.COM info.nss_comment = (char *)info501->shi501_comment; 10929832Samw@Sun.COM info.nss_type = info501->shi501_type; 10939832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 109410504SKeyur.Desai@Sun.COM if (status == ERROR_SUCCESS) 109510504SKeyur.Desai@Sun.COM status = srvsvc_update_share_flags(&si, 109610504SKeyur.Desai@Sun.COM info501->shi501_flags); 10979832Samw@Sun.COM break; 10989832Samw@Sun.COM 10999832Samw@Sun.COM case 502: 11009832Samw@Sun.COM info502 = (struct mslm_NetShareInfo_502 *) 11019832Samw@Sun.COM param->result.ru.info502; 11029832Samw@Sun.COM info.nss_netname = (char *)info502->shi502_netname; 11039832Samw@Sun.COM info.nss_comment = (char *)info502->shi502_comment; 11049832Samw@Sun.COM info.nss_path = (char *)info502->shi502_path; 11059832Samw@Sun.COM info.nss_type = info502->shi502_type; 11069832Samw@Sun.COM info.nss_sd.sd_buf = info502->shi502_security_descriptor; 11079832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 11089832Samw@Sun.COM break; 11099832Samw@Sun.COM 11109832Samw@Sun.COM case 503: 11119832Samw@Sun.COM info503 = (struct mslm_NetShareInfo_503 *) 11129832Samw@Sun.COM param->result.ru.info503; 11139832Samw@Sun.COM info.nss_netname = (char *)info503->shi503_netname; 11149832Samw@Sun.COM info.nss_comment = (char *)info503->shi503_comment; 11159832Samw@Sun.COM info.nss_path = (char *)info503->shi503_path; 11169832Samw@Sun.COM info.nss_type = info503->shi503_type; 11179832Samw@Sun.COM info.nss_sd.sd_buf = info503->shi503_security_descriptor; 11189832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 11199832Samw@Sun.COM break; 11209832Samw@Sun.COM 11219832Samw@Sun.COM case 1004: 11229832Samw@Sun.COM info1004 = (struct mslm_NetShareInfo_1004 *) 11239832Samw@Sun.COM param->result.ru.info1004; 11249832Samw@Sun.COM info.nss_comment = (char *)info1004->shi1004_comment; 11259832Samw@Sun.COM status = srvsvc_modify_share(&si, &info); 11269832Samw@Sun.COM break; 11279832Samw@Sun.COM 11289832Samw@Sun.COM case 1005: 11299832Samw@Sun.COM info1005 = (struct mslm_NetShareInfo_1005 *) 11309832Samw@Sun.COM param->result.ru.info1005; 11319832Samw@Sun.COM status = srvsvc_update_share_flags(&si, 11329832Samw@Sun.COM info1005->shi1005_flags); 11339832Samw@Sun.COM break; 11349832Samw@Sun.COM 11359832Samw@Sun.COM case 1006: 11369832Samw@Sun.COM /* 11379832Samw@Sun.COM * We don't limit the maximum number of concurrent 11389832Samw@Sun.COM * connections to a share. 11399832Samw@Sun.COM */ 11409832Samw@Sun.COM status = ERROR_SUCCESS; 11419832Samw@Sun.COM break; 11429832Samw@Sun.COM 11439832Samw@Sun.COM case 1501: 11449832Samw@Sun.COM info1501 = (struct mslm_NetShareInfo_1501 *) 11459832Samw@Sun.COM param->result.ru.info1501; 11469832Samw@Sun.COM sdbuf = info1501->shi1501_security_descriptor; 11479832Samw@Sun.COM status = ERROR_SUCCESS; 11489832Samw@Sun.COM 11499832Samw@Sun.COM if (sdbuf != NULL) { 11509832Samw@Sun.COM status = srvsvc_sd_set(&si, sdbuf); 11519832Samw@Sun.COM if (status == ERROR_PATH_NOT_FOUND) 11529832Samw@Sun.COM status = ERROR_SUCCESS; 11539832Samw@Sun.COM } 11549832Samw@Sun.COM break; 11559832Samw@Sun.COM 11569832Samw@Sun.COM default: 11579832Samw@Sun.COM status = ERROR_ACCESS_DENIED; 11589832Samw@Sun.COM break; 11599832Samw@Sun.COM } 11609832Samw@Sun.COM 11619832Samw@Sun.COM netsharesetinfo_exit: 11629832Samw@Sun.COM if (status != ERROR_SUCCESS) 11639832Samw@Sun.COM bzero(param, sizeof (struct mlsm_NetShareSetInfo)); 11649832Samw@Sun.COM 11659832Samw@Sun.COM param->parm_err = (native_os == NATIVE_OS_WIN95) ? 0 : &parm_err; 11669832Samw@Sun.COM param->status = status; 11678474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 11688474SJose.Borrego@Sun.COM } 11698474SJose.Borrego@Sun.COM 11709832Samw@Sun.COM static uint32_t 11719832Samw@Sun.COM srvsvc_modify_share(smb_share_t *si, srvsvc_netshare_setinfo_t *info) 11729832Samw@Sun.COM { 11739832Samw@Sun.COM uint32_t nerr = NERR_Success; 11749832Samw@Sun.COM 11759832Samw@Sun.COM if (si->shr_flags & SMB_SHRF_TRANS) 11769832Samw@Sun.COM return (srvsvc_modify_transient_share(si, info)); 11779832Samw@Sun.COM 11789832Samw@Sun.COM if (info->nss_sd.sd_buf != NULL) { 11799832Samw@Sun.COM nerr = srvsvc_sd_set(si, info->nss_sd.sd_buf); 11809832Samw@Sun.COM if (nerr == ERROR_PATH_NOT_FOUND) 11819832Samw@Sun.COM nerr = NERR_Success; 11829832Samw@Sun.COM } 11839832Samw@Sun.COM 11849832Samw@Sun.COM if ((nerr = srvsvc_sa_modify(si, info)) == NERR_Success) 11859832Samw@Sun.COM nerr = smb_shr_modify(si); 11869832Samw@Sun.COM 11879832Samw@Sun.COM return (nerr); 11889832Samw@Sun.COM } 11899832Samw@Sun.COM 11909832Samw@Sun.COM /* 11919832Samw@Sun.COM * Update transient shares. This includes autohome shares. 11929832Samw@Sun.COM */ 11939832Samw@Sun.COM static uint32_t 11949832Samw@Sun.COM srvsvc_modify_transient_share(smb_share_t *si, srvsvc_netshare_setinfo_t *info) 11959832Samw@Sun.COM { 11969832Samw@Sun.COM uint32_t nerr; 11979832Samw@Sun.COM 11989832Samw@Sun.COM if (info->nss_netname != NULL && info->nss_netname[0] != '\0' && 1199*10966SJordan.Brown@Sun.COM smb_strcasecmp(info->nss_netname, si->shr_name, 0) != 0) { 12009832Samw@Sun.COM nerr = smb_shr_rename(si->shr_name, info->nss_netname); 12019832Samw@Sun.COM if (nerr != NERR_Success) 12029832Samw@Sun.COM return (nerr); 12039832Samw@Sun.COM 12049832Samw@Sun.COM (void) strlcpy(si->shr_name, info->nss_netname, MAXNAMELEN); 12059832Samw@Sun.COM } 12069832Samw@Sun.COM 12079832Samw@Sun.COM if ((info->nss_comment != NULL) && 12089832Samw@Sun.COM (strcmp(info->nss_comment, si->shr_cmnt) != 0)) { 12099832Samw@Sun.COM (void) strlcpy(si->shr_cmnt, info->nss_comment, 12109832Samw@Sun.COM SMB_SHARE_CMNT_MAX); 12119832Samw@Sun.COM 12129832Samw@Sun.COM if ((nerr = smb_shr_modify(si)) != NERR_Success) 12139832Samw@Sun.COM return (nerr); 12149832Samw@Sun.COM } 12159832Samw@Sun.COM 12169832Samw@Sun.COM return (NERR_Success); 12179832Samw@Sun.COM } 12189832Samw@Sun.COM 121910504SKeyur.Desai@Sun.COM /* 122010504SKeyur.Desai@Sun.COM * srvsvc_update_share_flags 122110504SKeyur.Desai@Sun.COM * 122210504SKeyur.Desai@Sun.COM * This function updates flags for shares. 122310504SKeyur.Desai@Sun.COM * Flags for Persistent shares are updated in both libshare and the local cache. 122410504SKeyur.Desai@Sun.COM * Flags for Transient shares are updated only in the local cache. 122510504SKeyur.Desai@Sun.COM */ 12269832Samw@Sun.COM static uint32_t 12279832Samw@Sun.COM srvsvc_update_share_flags(smb_share_t *si, uint32_t shi_flags) 12289832Samw@Sun.COM { 12299832Samw@Sun.COM uint32_t nerr = NERR_Success; 123010504SKeyur.Desai@Sun.COM uint32_t flag = 0; 123110504SKeyur.Desai@Sun.COM char *csc_value; 123210504SKeyur.Desai@Sun.COM char *abe_value = "false"; 123310504SKeyur.Desai@Sun.COM nvlist_t *nvl; 123410504SKeyur.Desai@Sun.COM int err = 0; 123510504SKeyur.Desai@Sun.COM 123610504SKeyur.Desai@Sun.COM if (shi_flags & SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM) { 123710504SKeyur.Desai@Sun.COM flag = SMB_SHRF_ABE; 123810504SKeyur.Desai@Sun.COM abe_value = "true"; 123910504SKeyur.Desai@Sun.COM } 124010504SKeyur.Desai@Sun.COM 124110504SKeyur.Desai@Sun.COM si->shr_flags &= ~SMB_SHRF_ABE; 124210504SKeyur.Desai@Sun.COM si->shr_flags |= flag; 12439832Samw@Sun.COM 12449832Samw@Sun.COM switch ((shi_flags & CSC_MASK)) { 12459832Samw@Sun.COM case CSC_CACHE_AUTO_REINT: 124610504SKeyur.Desai@Sun.COM flag = SMB_SHRF_CSC_AUTO; 12479832Samw@Sun.COM break; 12489832Samw@Sun.COM case CSC_CACHE_VDO: 124910504SKeyur.Desai@Sun.COM flag = SMB_SHRF_CSC_VDO; 12509832Samw@Sun.COM break; 12519832Samw@Sun.COM case CSC_CACHE_NONE: 125210504SKeyur.Desai@Sun.COM flag = SMB_SHRF_CSC_DISABLED; 12539832Samw@Sun.COM break; 12549832Samw@Sun.COM case CSC_CACHE_MANUAL_REINT: 125510504SKeyur.Desai@Sun.COM flag = SMB_SHRF_CSC_MANUAL; 12569832Samw@Sun.COM break; 12579832Samw@Sun.COM default: 125810504SKeyur.Desai@Sun.COM return (NERR_InternalError); 12599832Samw@Sun.COM } 12609832Samw@Sun.COM 12619832Samw@Sun.COM si->shr_flags &= ~SMB_SHRF_CSC_MASK; 126210504SKeyur.Desai@Sun.COM si->shr_flags |= flag; 12639832Samw@Sun.COM 12649832Samw@Sun.COM if ((si->shr_flags & SMB_SHRF_TRANS) == 0) { 126510504SKeyur.Desai@Sun.COM csc_value = smb_shr_sa_csc_name(si); 126610504SKeyur.Desai@Sun.COM 126710504SKeyur.Desai@Sun.COM if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) 126810504SKeyur.Desai@Sun.COM return (NERR_InternalError); 126910504SKeyur.Desai@Sun.COM 127010504SKeyur.Desai@Sun.COM err |= nvlist_add_string(nvl, SHOPT_CSC, csc_value); 127110504SKeyur.Desai@Sun.COM err |= nvlist_add_string(nvl, SHOPT_ABE, abe_value); 127210504SKeyur.Desai@Sun.COM if (err) { 127310504SKeyur.Desai@Sun.COM nvlist_free(nvl); 127410504SKeyur.Desai@Sun.COM return (NERR_InternalError); 127510504SKeyur.Desai@Sun.COM } 127610504SKeyur.Desai@Sun.COM 127710504SKeyur.Desai@Sun.COM nerr = srvsvc_sa_setprop(si, nvl); 127810504SKeyur.Desai@Sun.COM nvlist_free(nvl); 127910504SKeyur.Desai@Sun.COM 128010504SKeyur.Desai@Sun.COM if (nerr != NERR_Success) 12819832Samw@Sun.COM return (nerr); 12829832Samw@Sun.COM } 12839832Samw@Sun.COM 12849832Samw@Sun.COM return (smb_shr_modify(si)); 12859832Samw@Sun.COM } 12869832Samw@Sun.COM 128710504SKeyur.Desai@Sun.COM static uint32_t 128810504SKeyur.Desai@Sun.COM srvsvc_get_share_flags(smb_share_t *si) 128910504SKeyur.Desai@Sun.COM { 129010504SKeyur.Desai@Sun.COM uint32_t flags = 0; 129110504SKeyur.Desai@Sun.COM 129210504SKeyur.Desai@Sun.COM switch (si->shr_flags & SMB_SHRF_CSC_MASK) { 129310504SKeyur.Desai@Sun.COM case SMB_SHRF_CSC_DISABLED: 129410504SKeyur.Desai@Sun.COM flags |= CSC_CACHE_NONE; 129510504SKeyur.Desai@Sun.COM break; 129610504SKeyur.Desai@Sun.COM case SMB_SHRF_CSC_AUTO: 129710504SKeyur.Desai@Sun.COM flags |= CSC_CACHE_AUTO_REINT; 129810504SKeyur.Desai@Sun.COM break; 129910504SKeyur.Desai@Sun.COM case SMB_SHRF_CSC_VDO: 130010504SKeyur.Desai@Sun.COM flags |= CSC_CACHE_VDO; 130110504SKeyur.Desai@Sun.COM break; 130210504SKeyur.Desai@Sun.COM case SMB_SHRF_CSC_MANUAL: 130310504SKeyur.Desai@Sun.COM default: 130410504SKeyur.Desai@Sun.COM /* 130510504SKeyur.Desai@Sun.COM * Default to CSC_CACHE_MANUAL_REINT. 130610504SKeyur.Desai@Sun.COM */ 130710504SKeyur.Desai@Sun.COM break; 130810504SKeyur.Desai@Sun.COM } 130910504SKeyur.Desai@Sun.COM 131010504SKeyur.Desai@Sun.COM if (si->shr_flags & SMB_SHRF_ABE) 131110504SKeyur.Desai@Sun.COM flags |= SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM; 131210504SKeyur.Desai@Sun.COM 131310504SKeyur.Desai@Sun.COM return (flags); 131410504SKeyur.Desai@Sun.COM } 131510504SKeyur.Desai@Sun.COM 13168474SJose.Borrego@Sun.COM /* 13178474SJose.Borrego@Sun.COM * srvsvc_s_NetSessionEnum 13188474SJose.Borrego@Sun.COM * 13198474SJose.Borrego@Sun.COM * Level 1 request is made by (Server Manager (srvmgr) on NT Server when 13208474SJose.Borrego@Sun.COM * the user info icon is selected. 13218474SJose.Borrego@Sun.COM * 13228474SJose.Borrego@Sun.COM * On success, the return value is NERR_Success. 13238474SJose.Borrego@Sun.COM * On error, the return value can be one of the following error codes: 13248474SJose.Borrego@Sun.COM * 13258474SJose.Borrego@Sun.COM * ERROR_ACCESS_DENIED The user does not have access to the requested 13268474SJose.Borrego@Sun.COM * information. 13278474SJose.Borrego@Sun.COM * ERROR_INVALID_LEVEL The value specified for the level is invalid. 13288474SJose.Borrego@Sun.COM * ERROR_INVALID_PARAMETER The specified parameter is invalid. 13298474SJose.Borrego@Sun.COM * ERROR_MORE_DATA More entries are available. Specify a large 13308474SJose.Borrego@Sun.COM * enough buffer to receive all entries. 13318474SJose.Borrego@Sun.COM * ERROR_NOT_ENOUGH_MEMORY Insufficient memory is available. 13328474SJose.Borrego@Sun.COM * NERR_ClientNameNotFound A session does not exist with the computer name. 13338474SJose.Borrego@Sun.COM * NERR_InvalidComputer The computer name is invalid. 13348474SJose.Borrego@Sun.COM * NERR_UserNotFound The user name could not be found. 13358474SJose.Borrego@Sun.COM */ 13368474SJose.Borrego@Sun.COM static int 13378474SJose.Borrego@Sun.COM srvsvc_s_NetSessionEnum(void *arg, ndr_xa_t *mxa) 13388474SJose.Borrego@Sun.COM { 133910122SJordan.Brown@Sun.COM struct mslm_NetSessionEnum *param = arg; 134010122SJordan.Brown@Sun.COM srvsvc_infonres_t *info; 134110122SJordan.Brown@Sun.COM smb_netsvc_t *ns; 134210122SJordan.Brown@Sun.COM smb_svcenum_t se; 134310122SJordan.Brown@Sun.COM DWORD status = ERROR_SUCCESS; 134410122SJordan.Brown@Sun.COM 134510122SJordan.Brown@Sun.COM if (!ndr_is_admin(mxa)) { 134610122SJordan.Brown@Sun.COM status = ERROR_ACCESS_DENIED; 134710122SJordan.Brown@Sun.COM goto srvsvc_netsessionenum_error; 134810122SJordan.Brown@Sun.COM } 134910122SJordan.Brown@Sun.COM 135010122SJordan.Brown@Sun.COM if ((info = NDR_NEW(mxa, srvsvc_infonres_t)) == NULL) { 135110122SJordan.Brown@Sun.COM status = ERROR_NOT_ENOUGH_MEMORY; 135210122SJordan.Brown@Sun.COM goto srvsvc_netsessionenum_error; 135310122SJordan.Brown@Sun.COM } 135410122SJordan.Brown@Sun.COM 135510122SJordan.Brown@Sun.COM info->entriesread = 0; 135610122SJordan.Brown@Sun.COM info->entries = NULL; 135710122SJordan.Brown@Sun.COM param->result.level = param->level; 135810122SJordan.Brown@Sun.COM param->result.bufptr.p = info; 135910122SJordan.Brown@Sun.COM 136010122SJordan.Brown@Sun.COM if ((param->total_entries = srvsvc_open_sessions()) == 0) { 136110122SJordan.Brown@Sun.COM param->resume_handle = NULL; 136210122SJordan.Brown@Sun.COM param->status = ERROR_SUCCESS; 13638474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 13648474SJose.Borrego@Sun.COM } 13658474SJose.Borrego@Sun.COM 136610122SJordan.Brown@Sun.COM bzero(&se, sizeof (smb_svcenum_t)); 136710122SJordan.Brown@Sun.COM se.se_type = SMB_SVCENUM_TYPE_USER; 136810122SJordan.Brown@Sun.COM se.se_level = param->level; 136910122SJordan.Brown@Sun.COM se.se_ntotal = param->total_entries; 137010122SJordan.Brown@Sun.COM se.se_nlimit = se.se_ntotal; 137110122SJordan.Brown@Sun.COM 137210122SJordan.Brown@Sun.COM if (param->resume_handle) { 137310122SJordan.Brown@Sun.COM se.se_resume = *param->resume_handle; 137410122SJordan.Brown@Sun.COM se.se_nskip = se.se_resume; 137510122SJordan.Brown@Sun.COM *param->resume_handle = 0; 137610122SJordan.Brown@Sun.COM } 13778474SJose.Borrego@Sun.COM 13788474SJose.Borrego@Sun.COM switch (param->level) { 13798474SJose.Borrego@Sun.COM case 0: 138010122SJordan.Brown@Sun.COM info->entries = NDR_NEWN(mxa, struct mslm_SESSION_INFO_0, 138110122SJordan.Brown@Sun.COM se.se_nlimit); 13828474SJose.Borrego@Sun.COM break; 138310122SJordan.Brown@Sun.COM case 1: 138410122SJordan.Brown@Sun.COM info->entries = NDR_NEWN(mxa, struct mslm_SESSION_INFO_1, 138510122SJordan.Brown@Sun.COM se.se_nlimit); 13869832Samw@Sun.COM break; 138710122SJordan.Brown@Sun.COM case 2: 138810122SJordan.Brown@Sun.COM info->entries = NDR_NEWN(mxa, struct mslm_SESSION_INFO_2, 138910122SJordan.Brown@Sun.COM se.se_nlimit); 13909832Samw@Sun.COM break; 139110122SJordan.Brown@Sun.COM case 10: 139210122SJordan.Brown@Sun.COM info->entries = NDR_NEWN(mxa, struct mslm_SESSION_INFO_10, 139310122SJordan.Brown@Sun.COM se.se_nlimit); 139410122SJordan.Brown@Sun.COM break; 13959832Samw@Sun.COM case 502: 139610122SJordan.Brown@Sun.COM info->entries = NDR_NEWN(mxa, struct mslm_SESSION_INFO_502, 139710122SJordan.Brown@Sun.COM se.se_nlimit); 13989832Samw@Sun.COM break; 13998474SJose.Borrego@Sun.COM default: 14008474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetSessionEnum)); 140110122SJordan.Brown@Sun.COM param->status = ERROR_INVALID_LEVEL; 14028474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 14038474SJose.Borrego@Sun.COM } 14048474SJose.Borrego@Sun.COM 140510122SJordan.Brown@Sun.COM if (info->entries == NULL) { 140610122SJordan.Brown@Sun.COM status = ERROR_NOT_ENOUGH_MEMORY; 140710122SJordan.Brown@Sun.COM goto srvsvc_netsessionenum_error; 140810122SJordan.Brown@Sun.COM } 140910122SJordan.Brown@Sun.COM 141010122SJordan.Brown@Sun.COM if ((ns = smb_kmod_enum_init(&se)) == NULL) { 141110122SJordan.Brown@Sun.COM status = ERROR_NOT_ENOUGH_MEMORY; 141210122SJordan.Brown@Sun.COM goto srvsvc_netsessionenum_error; 141310122SJordan.Brown@Sun.COM } 141410122SJordan.Brown@Sun.COM 141510122SJordan.Brown@Sun.COM status = srvsvc_NetSessionEnumCommon(mxa, info, ns, &se); 141610122SJordan.Brown@Sun.COM smb_kmod_enum_fini(ns); 141710122SJordan.Brown@Sun.COM 141810122SJordan.Brown@Sun.COM if (status != ERROR_SUCCESS) 141910122SJordan.Brown@Sun.COM goto srvsvc_netsessionenum_error; 142010122SJordan.Brown@Sun.COM 142110122SJordan.Brown@Sun.COM if (param->resume_handle && 142210122SJordan.Brown@Sun.COM param->pref_max_len != SMB_SRVSVC_MAXPREFLEN) { 142310122SJordan.Brown@Sun.COM if (se.se_resume < param->total_entries) { 142410122SJordan.Brown@Sun.COM *param->resume_handle = se.se_resume; 142510122SJordan.Brown@Sun.COM status = ERROR_MORE_DATA; 142610122SJordan.Brown@Sun.COM } 142710122SJordan.Brown@Sun.COM } 142810122SJordan.Brown@Sun.COM 142910122SJordan.Brown@Sun.COM param->total_entries = info->entriesread; 143010122SJordan.Brown@Sun.COM param->status = status; 143110122SJordan.Brown@Sun.COM return (NDR_DRC_OK); 143210122SJordan.Brown@Sun.COM 143310122SJordan.Brown@Sun.COM srvsvc_netsessionenum_error: 143410122SJordan.Brown@Sun.COM bzero(param, sizeof (struct mslm_NetSessionEnum)); 14358474SJose.Borrego@Sun.COM param->status = status; 14368474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 14378474SJose.Borrego@Sun.COM } 14388474SJose.Borrego@Sun.COM 143910122SJordan.Brown@Sun.COM static uint32_t 144010122SJordan.Brown@Sun.COM srvsvc_NetSessionEnumCommon(ndr_xa_t *mxa, srvsvc_infonres_t *info, 144110122SJordan.Brown@Sun.COM smb_netsvc_t *ns, smb_svcenum_t *se) 14428474SJose.Borrego@Sun.COM { 144310122SJordan.Brown@Sun.COM struct mslm_SESSION_INFO_0 *info0 = info->entries; 144410122SJordan.Brown@Sun.COM struct mslm_SESSION_INFO_1 *info1 = info->entries; 144510122SJordan.Brown@Sun.COM struct mslm_SESSION_INFO_2 *info2 = info->entries; 144610122SJordan.Brown@Sun.COM struct mslm_SESSION_INFO_10 *info10 = info->entries; 144710122SJordan.Brown@Sun.COM struct mslm_SESSION_INFO_502 *info502 = info->entries; 144810122SJordan.Brown@Sun.COM smb_netsvcitem_t *item; 144910122SJordan.Brown@Sun.COM smb_netuserinfo_t *user; 145010122SJordan.Brown@Sun.COM char *workstation; 145110122SJordan.Brown@Sun.COM char account[MAXNAMELEN]; 145210122SJordan.Brown@Sun.COM char ipaddr_buf[INET6_ADDRSTRLEN]; 145310122SJordan.Brown@Sun.COM uint32_t logon_time; 145410122SJordan.Brown@Sun.COM uint32_t flags; 145510122SJordan.Brown@Sun.COM uint32_t entries_read = 0; 145610122SJordan.Brown@Sun.COM 145710122SJordan.Brown@Sun.COM if (smb_kmod_enum(ns) != 0) 145810122SJordan.Brown@Sun.COM return (ERROR_INTERNAL_ERROR); 145910122SJordan.Brown@Sun.COM 146010122SJordan.Brown@Sun.COM item = list_head(&ns->ns_list); 146110122SJordan.Brown@Sun.COM while (item != NULL) { 146210122SJordan.Brown@Sun.COM user = &item->nsi_un.nsi_user; 146310122SJordan.Brown@Sun.COM 146410122SJordan.Brown@Sun.COM workstation = user->ui_workstation; 14658474SJose.Borrego@Sun.COM if (workstation == NULL || *workstation == '\0') { 146610122SJordan.Brown@Sun.COM (void) smb_inet_ntop(&user->ui_ipaddr, ipaddr_buf, 146710122SJordan.Brown@Sun.COM SMB_IPSTRLEN(user->ui_ipaddr.a_family)); 14688474SJose.Borrego@Sun.COM workstation = ipaddr_buf; 14698474SJose.Borrego@Sun.COM } 14708474SJose.Borrego@Sun.COM 14718474SJose.Borrego@Sun.COM (void) snprintf(account, MAXNAMELEN, "%s\\%s", 147210122SJordan.Brown@Sun.COM user->ui_domain, user->ui_account); 147310122SJordan.Brown@Sun.COM 147410122SJordan.Brown@Sun.COM logon_time = time(0) - user->ui_logon_time; 147510122SJordan.Brown@Sun.COM flags = (user->ui_flags & SMB_ATF_GUEST) ? SESS_GUEST : 0; 147610122SJordan.Brown@Sun.COM 147710122SJordan.Brown@Sun.COM switch (se->se_level) { 147810122SJordan.Brown@Sun.COM case 0: 147910122SJordan.Brown@Sun.COM info0->sesi0_cname = NDR_STRDUP(mxa, workstation); 148010122SJordan.Brown@Sun.COM if (info0->sesi0_cname == NULL) 148110122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 148210122SJordan.Brown@Sun.COM ++info0; 148310122SJordan.Brown@Sun.COM break; 148410122SJordan.Brown@Sun.COM 148510122SJordan.Brown@Sun.COM case 1: 148610122SJordan.Brown@Sun.COM info1->sesi1_cname = NDR_STRDUP(mxa, workstation); 148710122SJordan.Brown@Sun.COM info1->sesi1_uname = NDR_STRDUP(mxa, account); 148810122SJordan.Brown@Sun.COM 148910122SJordan.Brown@Sun.COM if (info1->sesi1_cname == NULL || 149010122SJordan.Brown@Sun.COM info1->sesi1_uname == NULL) 149110122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 149210122SJordan.Brown@Sun.COM 149310122SJordan.Brown@Sun.COM info1->sesi1_nopens = user->ui_numopens; 149410122SJordan.Brown@Sun.COM info1->sesi1_time = logon_time; 149510122SJordan.Brown@Sun.COM info1->sesi1_itime = 0; 149610122SJordan.Brown@Sun.COM info1->sesi1_uflags = flags; 149710122SJordan.Brown@Sun.COM ++info1; 149810122SJordan.Brown@Sun.COM break; 149910122SJordan.Brown@Sun.COM 150010122SJordan.Brown@Sun.COM case 2: 150110122SJordan.Brown@Sun.COM info2->sesi2_cname = NDR_STRDUP(mxa, workstation); 150210122SJordan.Brown@Sun.COM info2->sesi2_uname = NDR_STRDUP(mxa, account); 150310122SJordan.Brown@Sun.COM 150410122SJordan.Brown@Sun.COM if (info2->sesi2_cname == NULL || 150510122SJordan.Brown@Sun.COM info2->sesi2_uname == NULL) 150610122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 150710122SJordan.Brown@Sun.COM 150810122SJordan.Brown@Sun.COM info2->sesi2_nopens = user->ui_numopens; 150910122SJordan.Brown@Sun.COM info2->sesi2_time = logon_time; 151010122SJordan.Brown@Sun.COM info2->sesi2_itime = 0; 151110122SJordan.Brown@Sun.COM info2->sesi2_uflags = flags; 151210122SJordan.Brown@Sun.COM info2->sesi2_cltype_name = (uint8_t *)""; 151310122SJordan.Brown@Sun.COM ++info2; 151410122SJordan.Brown@Sun.COM break; 151510122SJordan.Brown@Sun.COM 151610122SJordan.Brown@Sun.COM case 10: 151710122SJordan.Brown@Sun.COM info10->sesi10_cname = NDR_STRDUP(mxa, workstation); 151810122SJordan.Brown@Sun.COM info10->sesi10_uname = NDR_STRDUP(mxa, account); 151910122SJordan.Brown@Sun.COM 152010122SJordan.Brown@Sun.COM if (info10->sesi10_cname == NULL || 152110122SJordan.Brown@Sun.COM info10->sesi10_uname == NULL) 152210122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 152310122SJordan.Brown@Sun.COM 152410122SJordan.Brown@Sun.COM info10->sesi10_time = logon_time; 152510122SJordan.Brown@Sun.COM info10->sesi10_itime = 0; 152610122SJordan.Brown@Sun.COM ++info10; 152710122SJordan.Brown@Sun.COM break; 152810122SJordan.Brown@Sun.COM 152910122SJordan.Brown@Sun.COM case 502: 153010122SJordan.Brown@Sun.COM info502->sesi502_cname = NDR_STRDUP(mxa, workstation); 153110122SJordan.Brown@Sun.COM info502->sesi502_uname = NDR_STRDUP(mxa, account); 153210122SJordan.Brown@Sun.COM 153310122SJordan.Brown@Sun.COM if (info502->sesi502_cname == NULL || 153410122SJordan.Brown@Sun.COM info502->sesi502_uname == NULL) 153510122SJordan.Brown@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 153610122SJordan.Brown@Sun.COM 153710122SJordan.Brown@Sun.COM info502->sesi502_nopens = user->ui_numopens; 153810122SJordan.Brown@Sun.COM info502->sesi502_time = logon_time; 153910122SJordan.Brown@Sun.COM info502->sesi502_itime = 0; 154010122SJordan.Brown@Sun.COM info502->sesi502_uflags = flags; 154110122SJordan.Brown@Sun.COM info502->sesi502_cltype_name = (uint8_t *)""; 154210122SJordan.Brown@Sun.COM info502->sesi502_transport = (uint8_t *)""; 154310122SJordan.Brown@Sun.COM ++info502; 154410122SJordan.Brown@Sun.COM break; 154510122SJordan.Brown@Sun.COM 154610122SJordan.Brown@Sun.COM default: 154710122SJordan.Brown@Sun.COM return (ERROR_INVALID_LEVEL); 15488474SJose.Borrego@Sun.COM } 15498474SJose.Borrego@Sun.COM 155010122SJordan.Brown@Sun.COM ++entries_read; 155110122SJordan.Brown@Sun.COM item = list_next(&ns->ns_list, item); 15529832Samw@Sun.COM } 15539832Samw@Sun.COM 155410122SJordan.Brown@Sun.COM info->entriesread = entries_read; 15559832Samw@Sun.COM return (ERROR_SUCCESS); 15569832Samw@Sun.COM } 15579832Samw@Sun.COM 15589832Samw@Sun.COM /* 15598474SJose.Borrego@Sun.COM * srvsvc_s_NetSessionDel 15608474SJose.Borrego@Sun.COM * 15618474SJose.Borrego@Sun.COM * Ends a network session between a server and a workstation. 15628474SJose.Borrego@Sun.COM * On NT only members of the Administrators or Account Operators 15638474SJose.Borrego@Sun.COM * local groups are permitted to use NetSessionDel. 15648474SJose.Borrego@Sun.COM * 156510122SJordan.Brown@Sun.COM * If unc_clientname is NULL, all sessions associated with the 156610122SJordan.Brown@Sun.COM * specified user will be disconnected. 156710122SJordan.Brown@Sun.COM * 156810122SJordan.Brown@Sun.COM * If username is NULL, all sessions from the specified client 156910122SJordan.Brown@Sun.COM * will be disconnected. 157010122SJordan.Brown@Sun.COM * 15718474SJose.Borrego@Sun.COM * Return Values 157210122SJordan.Brown@Sun.COM * On success, the return value is NERR_Success/ERROR_SUCCESS. 157310122SJordan.Brown@Sun.COM * On failure, the return value can be one of the following errors: 15748474SJose.Borrego@Sun.COM * 15758474SJose.Borrego@Sun.COM * ERROR_ACCESS_DENIED The user does not have access to the 157610122SJordan.Brown@Sun.COM * requested information. 15778474SJose.Borrego@Sun.COM * ERROR_INVALID_PARAMETER The specified parameter is invalid. 15788474SJose.Borrego@Sun.COM * ERROR_NOT_ENOUGH_MEMORY Insufficient memory is available. 15798474SJose.Borrego@Sun.COM * NERR_ClientNameNotFound A session does not exist with that 158010122SJordan.Brown@Sun.COM * computer name. 15818474SJose.Borrego@Sun.COM */ 15828474SJose.Borrego@Sun.COM static int 15838474SJose.Borrego@Sun.COM srvsvc_s_NetSessionDel(void *arg, ndr_xa_t *mxa) 15848474SJose.Borrego@Sun.COM { 158510122SJordan.Brown@Sun.COM static struct { 158610122SJordan.Brown@Sun.COM int errnum; 158710122SJordan.Brown@Sun.COM int nerr; 158810122SJordan.Brown@Sun.COM } errmap[] = { 158910122SJordan.Brown@Sun.COM 0, ERROR_SUCCESS, 159010122SJordan.Brown@Sun.COM EACCES, ERROR_ACCESS_DENIED, 159110122SJordan.Brown@Sun.COM EPERM, ERROR_ACCESS_DENIED, 159210122SJordan.Brown@Sun.COM EINVAL, ERROR_INVALID_PARAMETER, 159310122SJordan.Brown@Sun.COM ENOMEM, ERROR_NOT_ENOUGH_MEMORY, 159410122SJordan.Brown@Sun.COM ENOENT, NERR_ClientNameNotFound 159510122SJordan.Brown@Sun.COM }; 159610122SJordan.Brown@Sun.COM 15978474SJose.Borrego@Sun.COM struct mslm_NetSessionDel *param = arg; 159810122SJordan.Brown@Sun.COM int i; 159910122SJordan.Brown@Sun.COM int rc; 160010122SJordan.Brown@Sun.COM 160110122SJordan.Brown@Sun.COM if (!ndr_is_admin(mxa)) { 16028474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 16038474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 16048474SJose.Borrego@Sun.COM } 16058474SJose.Borrego@Sun.COM 160610122SJordan.Brown@Sun.COM rc = smb_kmod_session_close((char *)param->unc_clientname, 160710122SJordan.Brown@Sun.COM (char *)param->username); 160810122SJordan.Brown@Sun.COM 160910122SJordan.Brown@Sun.COM for (i = 0; i < (sizeof (errmap) / sizeof (errmap[0])); ++i) { 161010122SJordan.Brown@Sun.COM if (rc == errmap[i].errnum) { 161110122SJordan.Brown@Sun.COM param->status = errmap[i].nerr; 161210122SJordan.Brown@Sun.COM return (NDR_DRC_OK); 161310122SJordan.Brown@Sun.COM } 161410122SJordan.Brown@Sun.COM } 161510122SJordan.Brown@Sun.COM 161610122SJordan.Brown@Sun.COM param->status = ERROR_INTERNAL_ERROR; 16178474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 16188474SJose.Borrego@Sun.COM } 16198474SJose.Borrego@Sun.COM 16208474SJose.Borrego@Sun.COM /* 16218474SJose.Borrego@Sun.COM * SRVSVC NetServerGetInfo 16228474SJose.Borrego@Sun.COM * 16238474SJose.Borrego@Sun.COM * IN LPTSTR servername, 16248474SJose.Borrego@Sun.COM * IN DWORD level, 16258474SJose.Borrego@Sun.COM * OUT union switch(level) { 16268474SJose.Borrego@Sun.COM * case 100: mslm_SERVER_INFO_100 *p100; 16278474SJose.Borrego@Sun.COM * case 101: mslm_SERVER_INFO_101 *p101; 16288474SJose.Borrego@Sun.COM * case 102: mslm_SERVER_INFO_102 *p102; 16299832Samw@Sun.COM * ... 16308474SJose.Borrego@Sun.COM * default: char *nullptr; 16318474SJose.Borrego@Sun.COM * } bufptr, 16328474SJose.Borrego@Sun.COM * OUT DWORD status 16338474SJose.Borrego@Sun.COM */ 16348474SJose.Borrego@Sun.COM static int 16358474SJose.Borrego@Sun.COM srvsvc_s_NetServerGetInfo(void *arg, ndr_xa_t *mxa) 16368474SJose.Borrego@Sun.COM { 16378474SJose.Borrego@Sun.COM struct mslm_NetServerGetInfo *param = arg; 16388474SJose.Borrego@Sun.COM struct mslm_SERVER_INFO_100 *info100; 16398474SJose.Borrego@Sun.COM struct mslm_SERVER_INFO_101 *info101; 16408474SJose.Borrego@Sun.COM struct mslm_SERVER_INFO_102 *info102; 16419832Samw@Sun.COM struct mslm_SERVER_INFO_502 *info502; 16429832Samw@Sun.COM struct mslm_SERVER_INFO_503 *info503; 16438474SJose.Borrego@Sun.COM char sys_comment[SMB_PI_MAX_COMMENT]; 16448474SJose.Borrego@Sun.COM char hostname[NETBIOS_NAME_SZ]; 16458474SJose.Borrego@Sun.COM 16468474SJose.Borrego@Sun.COM if (smb_getnetbiosname(hostname, sizeof (hostname)) != 0) { 16478474SJose.Borrego@Sun.COM netservergetinfo_no_memory: 16488474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetServerGetInfo)); 16498474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 16508474SJose.Borrego@Sun.COM } 16518474SJose.Borrego@Sun.COM 16528474SJose.Borrego@Sun.COM (void) smb_config_getstr(SMB_CI_SYS_CMNT, sys_comment, 16538474SJose.Borrego@Sun.COM sizeof (sys_comment)); 16548474SJose.Borrego@Sun.COM if (*sys_comment == '\0') 16558474SJose.Borrego@Sun.COM (void) strcpy(sys_comment, " "); 16568474SJose.Borrego@Sun.COM 16578474SJose.Borrego@Sun.COM switch (param->level) { 16588474SJose.Borrego@Sun.COM case 100: 16598474SJose.Borrego@Sun.COM info100 = NDR_NEW(mxa, struct mslm_SERVER_INFO_100); 16608474SJose.Borrego@Sun.COM if (info100 == NULL) 16618474SJose.Borrego@Sun.COM goto netservergetinfo_no_memory; 16628474SJose.Borrego@Sun.COM 16638474SJose.Borrego@Sun.COM bzero(info100, sizeof (struct mslm_SERVER_INFO_100)); 16648474SJose.Borrego@Sun.COM info100->sv100_platform_id = SV_PLATFORM_ID_NT; 16658474SJose.Borrego@Sun.COM info100->sv100_name = (uint8_t *)NDR_STRDUP(mxa, hostname); 16668474SJose.Borrego@Sun.COM if (info100->sv100_name == NULL) 16678474SJose.Borrego@Sun.COM goto netservergetinfo_no_memory; 16688474SJose.Borrego@Sun.COM 16698474SJose.Borrego@Sun.COM param->result.bufptr.bufptr100 = info100; 16708474SJose.Borrego@Sun.COM break; 16718474SJose.Borrego@Sun.COM 16728474SJose.Borrego@Sun.COM case 101: 16738474SJose.Borrego@Sun.COM info101 = NDR_NEW(mxa, struct mslm_SERVER_INFO_101); 16748474SJose.Borrego@Sun.COM if (info101 == NULL) 16758474SJose.Borrego@Sun.COM goto netservergetinfo_no_memory; 16768474SJose.Borrego@Sun.COM 16778474SJose.Borrego@Sun.COM bzero(info101, sizeof (struct mslm_SERVER_INFO_101)); 16788474SJose.Borrego@Sun.COM info101->sv101_platform_id = SV_PLATFORM_ID_NT; 16798474SJose.Borrego@Sun.COM info101->sv101_version_major = 4; 16808474SJose.Borrego@Sun.COM info101->sv101_version_minor = 0; 16818474SJose.Borrego@Sun.COM info101->sv101_type = SV_TYPE_SENT_BY_ME; 16828474SJose.Borrego@Sun.COM info101->sv101_name = (uint8_t *)NDR_STRDUP(mxa, hostname); 16838474SJose.Borrego@Sun.COM info101->sv101_comment 16848474SJose.Borrego@Sun.COM = (uint8_t *)NDR_STRDUP(mxa, sys_comment); 16858474SJose.Borrego@Sun.COM 16868474SJose.Borrego@Sun.COM if (info101->sv101_name == NULL || 16878474SJose.Borrego@Sun.COM info101->sv101_comment == NULL) 16888474SJose.Borrego@Sun.COM goto netservergetinfo_no_memory; 16898474SJose.Borrego@Sun.COM 16908474SJose.Borrego@Sun.COM param->result.bufptr.bufptr101 = info101; 16918474SJose.Borrego@Sun.COM break; 16928474SJose.Borrego@Sun.COM 16938474SJose.Borrego@Sun.COM case 102: 16948474SJose.Borrego@Sun.COM info102 = NDR_NEW(mxa, struct mslm_SERVER_INFO_102); 16958474SJose.Borrego@Sun.COM if (info102 == NULL) 16968474SJose.Borrego@Sun.COM goto netservergetinfo_no_memory; 16978474SJose.Borrego@Sun.COM 16988474SJose.Borrego@Sun.COM bzero(info102, sizeof (struct mslm_SERVER_INFO_102)); 16998474SJose.Borrego@Sun.COM info102->sv102_platform_id = SV_PLATFORM_ID_NT; 17008474SJose.Borrego@Sun.COM info102->sv102_version_major = 4; 17018474SJose.Borrego@Sun.COM info102->sv102_version_minor = 0; 17028474SJose.Borrego@Sun.COM info102->sv102_type = SV_TYPE_SENT_BY_ME; 17038474SJose.Borrego@Sun.COM info102->sv102_name = (uint8_t *)NDR_STRDUP(mxa, hostname); 17048474SJose.Borrego@Sun.COM info102->sv102_comment 17058474SJose.Borrego@Sun.COM = (uint8_t *)NDR_STRDUP(mxa, sys_comment); 17068474SJose.Borrego@Sun.COM 17078474SJose.Borrego@Sun.COM /* 17088474SJose.Borrego@Sun.COM * The following level 102 fields are defaulted to zero 17098474SJose.Borrego@Sun.COM * by virtue of the call to bzero above. 17108474SJose.Borrego@Sun.COM * 17118474SJose.Borrego@Sun.COM * sv102_users 17128474SJose.Borrego@Sun.COM * sv102_disc 17138474SJose.Borrego@Sun.COM * sv102_hidden 17148474SJose.Borrego@Sun.COM * sv102_announce 17158474SJose.Borrego@Sun.COM * sv102_anndelta 17168474SJose.Borrego@Sun.COM * sv102_licenses 17178474SJose.Borrego@Sun.COM * sv102_userpath 17188474SJose.Borrego@Sun.COM */ 17198474SJose.Borrego@Sun.COM if (info102->sv102_name == NULL || 17208474SJose.Borrego@Sun.COM info102->sv102_comment == NULL) 17218474SJose.Borrego@Sun.COM goto netservergetinfo_no_memory; 17228474SJose.Borrego@Sun.COM 17238474SJose.Borrego@Sun.COM param->result.bufptr.bufptr102 = info102; 17248474SJose.Borrego@Sun.COM break; 17258474SJose.Borrego@Sun.COM 17269832Samw@Sun.COM case 502: 17279832Samw@Sun.COM info502 = NDR_NEW(mxa, struct mslm_SERVER_INFO_502); 17289832Samw@Sun.COM if (info502 == NULL) 17299832Samw@Sun.COM goto netservergetinfo_no_memory; 17309832Samw@Sun.COM 17319832Samw@Sun.COM bzero(info502, sizeof (struct mslm_SERVER_INFO_502)); 17329832Samw@Sun.COM param->result.bufptr.bufptr502 = info502; 17339832Samw@Sun.COM #ifdef SRVSVC_SATISFY_SMBTORTURE 17349832Samw@Sun.COM break; 17359832Samw@Sun.COM #else 17369832Samw@Sun.COM param->result.level = param->level; 17379832Samw@Sun.COM param->status = ERROR_ACCESS_DENIED; 17389832Samw@Sun.COM return (NDR_DRC_OK); 17399832Samw@Sun.COM #endif /* SRVSVC_SATISFY_SMBTORTURE */ 17409832Samw@Sun.COM 17419832Samw@Sun.COM case 503: 17429832Samw@Sun.COM info503 = NDR_NEW(mxa, struct mslm_SERVER_INFO_503); 17439832Samw@Sun.COM if (info503 == NULL) 17449832Samw@Sun.COM goto netservergetinfo_no_memory; 17459832Samw@Sun.COM 17469832Samw@Sun.COM bzero(info503, sizeof (struct mslm_SERVER_INFO_503)); 17479832Samw@Sun.COM param->result.bufptr.bufptr503 = info503; 17489832Samw@Sun.COM #ifdef SRVSVC_SATISFY_SMBTORTURE 17499832Samw@Sun.COM break; 17509832Samw@Sun.COM #else 17519832Samw@Sun.COM param->result.level = param->level; 17529832Samw@Sun.COM param->status = ERROR_ACCESS_DENIED; 17539832Samw@Sun.COM return (NDR_DRC_OK); 17549832Samw@Sun.COM #endif /* SRVSVC_SATISFY_SMBTORTURE */ 17559832Samw@Sun.COM 17568474SJose.Borrego@Sun.COM default: 17578474SJose.Borrego@Sun.COM bzero(¶m->result, 17588474SJose.Borrego@Sun.COM sizeof (struct mslm_NetServerGetInfo_result)); 17598474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 17608474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 17618474SJose.Borrego@Sun.COM } 17628474SJose.Borrego@Sun.COM 17638474SJose.Borrego@Sun.COM param->result.level = param->level; 17649832Samw@Sun.COM param->status = ERROR_SUCCESS; 17658474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 17668474SJose.Borrego@Sun.COM } 17678474SJose.Borrego@Sun.COM 17688474SJose.Borrego@Sun.COM /* 17698474SJose.Borrego@Sun.COM * NetRemoteTOD 17708474SJose.Borrego@Sun.COM * 17718474SJose.Borrego@Sun.COM * Returns information about the time of day on this server. 17728474SJose.Borrego@Sun.COM * 17738474SJose.Borrego@Sun.COM * typedef struct _TIME_OF_DAY_INFO { 17748474SJose.Borrego@Sun.COM * DWORD tod_elapsedt; // seconds since 00:00:00 January 1 1970 GMT 17758474SJose.Borrego@Sun.COM * DWORD tod_msecs; // arbitrary milliseconds (since reset) 17768474SJose.Borrego@Sun.COM * DWORD tod_hours; // current hour [0-23] 17778474SJose.Borrego@Sun.COM * DWORD tod_mins; // current minute [0-59] 17788474SJose.Borrego@Sun.COM * DWORD tod_secs; // current second [0-59] 17798474SJose.Borrego@Sun.COM * DWORD tod_hunds; // current hundredth (0.01) second [0-99] 17808474SJose.Borrego@Sun.COM * LONG tod_timezone; // time zone of the server 17818474SJose.Borrego@Sun.COM * DWORD tod_tinterval; // clock tick time interval 17828474SJose.Borrego@Sun.COM * DWORD tod_day; // day of the month [1-31] 17838474SJose.Borrego@Sun.COM * DWORD tod_month; // month of the year [1-12] 17848474SJose.Borrego@Sun.COM * DWORD tod_year; // current year 17858474SJose.Borrego@Sun.COM * DWORD tod_weekday; // day of the week since Sunday [0-6] 17868474SJose.Borrego@Sun.COM * } TIME_OF_DAY_INFO; 17878474SJose.Borrego@Sun.COM * 17888474SJose.Borrego@Sun.COM * The time zone of the server is calculated in minutes from Greenwich 17898474SJose.Borrego@Sun.COM * Mean Time (GMT). For time zones west of Greenwich, the value is 17908474SJose.Borrego@Sun.COM * positive; for time zones east of Greenwich, the value is negative. 17918474SJose.Borrego@Sun.COM * A value of -1 indicates that the time zone is undefined. 17928474SJose.Borrego@Sun.COM * 1793*10966SJordan.Brown@Sun.COM * Determine offset from GMT. If daylight saving time use altzone, 1794*10966SJordan.Brown@Sun.COM * otherwise use timezone. 1795*10966SJordan.Brown@Sun.COM * 17968474SJose.Borrego@Sun.COM * The clock tick value represents a resolution of one ten-thousandth 17978474SJose.Borrego@Sun.COM * (0.0001) second. 17988474SJose.Borrego@Sun.COM */ 17998474SJose.Borrego@Sun.COM static int 18008474SJose.Borrego@Sun.COM srvsvc_s_NetRemoteTOD(void *arg, ndr_xa_t *mxa) 18018474SJose.Borrego@Sun.COM { 18028474SJose.Borrego@Sun.COM struct mslm_NetRemoteTOD *param = arg; 18038474SJose.Borrego@Sun.COM struct mslm_TIME_OF_DAY_INFO *tod; 18048474SJose.Borrego@Sun.COM struct timeval time_val; 18058474SJose.Borrego@Sun.COM struct tm tm; 1806*10966SJordan.Brown@Sun.COM time_t gmtoff; 1807*10966SJordan.Brown@Sun.COM 18088474SJose.Borrego@Sun.COM 18098474SJose.Borrego@Sun.COM (void) gettimeofday(&time_val, 0); 18108474SJose.Borrego@Sun.COM (void) gmtime_r(&time_val.tv_sec, &tm); 18118474SJose.Borrego@Sun.COM 18128474SJose.Borrego@Sun.COM tod = NDR_NEW(mxa, struct mslm_TIME_OF_DAY_INFO); 18138474SJose.Borrego@Sun.COM if (tod == NULL) { 18148474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetRemoteTOD)); 18158474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 18168474SJose.Borrego@Sun.COM } 18178474SJose.Borrego@Sun.COM 1818*10966SJordan.Brown@Sun.COM bzero(tod, sizeof (struct mslm_TIME_OF_DAY_INFO)); 1819*10966SJordan.Brown@Sun.COM 18208474SJose.Borrego@Sun.COM tod->tod_elapsedt = time_val.tv_sec; 18218474SJose.Borrego@Sun.COM tod->tod_msecs = time_val.tv_usec; 18228474SJose.Borrego@Sun.COM tod->tod_hours = tm.tm_hour; 18238474SJose.Borrego@Sun.COM tod->tod_mins = tm.tm_min; 18248474SJose.Borrego@Sun.COM tod->tod_secs = tm.tm_sec; 18258474SJose.Borrego@Sun.COM tod->tod_hunds = 0; 18268474SJose.Borrego@Sun.COM tod->tod_tinterval = 1000; 18278474SJose.Borrego@Sun.COM tod->tod_day = tm.tm_mday; 18288474SJose.Borrego@Sun.COM tod->tod_month = tm.tm_mon+1; 18298474SJose.Borrego@Sun.COM tod->tod_year = tm.tm_year+1900; 18308474SJose.Borrego@Sun.COM tod->tod_weekday = tm.tm_wday; 18318474SJose.Borrego@Sun.COM 18328474SJose.Borrego@Sun.COM (void) localtime_r(&time_val.tv_sec, &tm); 1833*10966SJordan.Brown@Sun.COM gmtoff = (tm.tm_isdst) ? altzone : timezone; 1834*10966SJordan.Brown@Sun.COM tod->tod_timezone = gmtoff / SECSPERMIN; 18358474SJose.Borrego@Sun.COM 18368474SJose.Borrego@Sun.COM param->bufptr = tod; 18378474SJose.Borrego@Sun.COM param->status = ERROR_SUCCESS; 18388474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 18398474SJose.Borrego@Sun.COM } 18408474SJose.Borrego@Sun.COM 18418474SJose.Borrego@Sun.COM /* 18428474SJose.Borrego@Sun.COM * srvsvc_s_NetNameValidate 18438474SJose.Borrego@Sun.COM * 18448474SJose.Borrego@Sun.COM * Perform name validation. 18458474SJose.Borrego@Sun.COM * 18468474SJose.Borrego@Sun.COM * The share name is considered invalid if it contains any of the 18478474SJose.Borrego@Sun.COM * following character (MSDN 236388). 18488474SJose.Borrego@Sun.COM * 18498474SJose.Borrego@Sun.COM * " / \ [ ] : | < > + ; , ? * = 18508474SJose.Borrego@Sun.COM * 18518474SJose.Borrego@Sun.COM * Returns Win32 error codes. 18528474SJose.Borrego@Sun.COM */ 18538474SJose.Borrego@Sun.COM /*ARGSUSED*/ 18548474SJose.Borrego@Sun.COM static int 18558474SJose.Borrego@Sun.COM srvsvc_s_NetNameValidate(void *arg, ndr_xa_t *mxa) 18568474SJose.Borrego@Sun.COM { 18578474SJose.Borrego@Sun.COM struct mslm_NetNameValidate *param = arg; 18588474SJose.Borrego@Sun.COM char *name; 18598474SJose.Borrego@Sun.COM int len; 18608474SJose.Borrego@Sun.COM 18618474SJose.Borrego@Sun.COM if ((name = (char *)param->pathname) == NULL) { 18628474SJose.Borrego@Sun.COM param->status = ERROR_INVALID_PARAMETER; 18638474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 18648474SJose.Borrego@Sun.COM } 18658474SJose.Borrego@Sun.COM 18668474SJose.Borrego@Sun.COM len = strlen(name); 18678474SJose.Borrego@Sun.COM 18688474SJose.Borrego@Sun.COM if ((param->flags == 0 && len > 81) || 18698474SJose.Borrego@Sun.COM (param->flags == 0x80000000 && len > 13)) { 18708474SJose.Borrego@Sun.COM param->status = ERROR_INVALID_NAME; 18718474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 18728474SJose.Borrego@Sun.COM } 18738474SJose.Borrego@Sun.COM 18748474SJose.Borrego@Sun.COM switch (param->type) { 18758474SJose.Borrego@Sun.COM case NAMETYPE_SHARE: 18768474SJose.Borrego@Sun.COM if (smb_shr_chkname(name)) 18778474SJose.Borrego@Sun.COM param->status = ERROR_SUCCESS; 18788474SJose.Borrego@Sun.COM else 18798474SJose.Borrego@Sun.COM param->status = ERROR_INVALID_NAME; 18808474SJose.Borrego@Sun.COM break; 18818474SJose.Borrego@Sun.COM 18828474SJose.Borrego@Sun.COM case NAMETYPE_USER: 18838474SJose.Borrego@Sun.COM case NAMETYPE_PASSWORD: 18848474SJose.Borrego@Sun.COM case NAMETYPE_GROUP: 18858474SJose.Borrego@Sun.COM case NAMETYPE_COMPUTER: 18868474SJose.Borrego@Sun.COM case NAMETYPE_EVENT: 18878474SJose.Borrego@Sun.COM case NAMETYPE_DOMAIN: 18888474SJose.Borrego@Sun.COM case NAMETYPE_SERVICE: 18898474SJose.Borrego@Sun.COM case NAMETYPE_NET: 18908474SJose.Borrego@Sun.COM case NAMETYPE_MESSAGE: 18918474SJose.Borrego@Sun.COM case NAMETYPE_MESSAGEDEST: 18928474SJose.Borrego@Sun.COM case NAMETYPE_SHAREPASSWORD: 18938474SJose.Borrego@Sun.COM case NAMETYPE_WORKGROUP: 18948474SJose.Borrego@Sun.COM param->status = ERROR_NOT_SUPPORTED; 18958474SJose.Borrego@Sun.COM break; 18968474SJose.Borrego@Sun.COM 18978474SJose.Borrego@Sun.COM default: 18988474SJose.Borrego@Sun.COM param->status = ERROR_INVALID_PARAMETER; 18998474SJose.Borrego@Sun.COM break; 19008474SJose.Borrego@Sun.COM } 19018474SJose.Borrego@Sun.COM 19028474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19038474SJose.Borrego@Sun.COM } 19048474SJose.Borrego@Sun.COM 19058474SJose.Borrego@Sun.COM /* 19068474SJose.Borrego@Sun.COM * srvsvc_s_NetShareAdd 19078474SJose.Borrego@Sun.COM * 19089832Samw@Sun.COM * Add a new share. Only power users groups can manage shares. 19098474SJose.Borrego@Sun.COM * 19108474SJose.Borrego@Sun.COM * This interface is used by the rmtshare command from the NT resource 19118474SJose.Borrego@Sun.COM * kit. Rmtshare allows a client to add or remove shares on a server 19128474SJose.Borrego@Sun.COM * from the client's command line. 19138474SJose.Borrego@Sun.COM * 19148474SJose.Borrego@Sun.COM * Returns Win32 error codes. 19158474SJose.Borrego@Sun.COM */ 19168474SJose.Borrego@Sun.COM static int 19178474SJose.Borrego@Sun.COM srvsvc_s_NetShareAdd(void *arg, ndr_xa_t *mxa) 19188474SJose.Borrego@Sun.COM { 19198474SJose.Borrego@Sun.COM static DWORD parm_err = 0; 19208474SJose.Borrego@Sun.COM DWORD parm_stat; 19218474SJose.Borrego@Sun.COM struct mslm_NetShareAdd *param = arg; 19229343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_2 *info2; 19239832Samw@Sun.COM struct mslm_NetShareInfo_502 *info502; 19248474SJose.Borrego@Sun.COM char realpath[MAXPATHLEN]; 19258474SJose.Borrego@Sun.COM int32_t native_os; 19269832Samw@Sun.COM uint8_t *sdbuf = NULL; 19279832Samw@Sun.COM uint32_t status; 19289832Samw@Sun.COM smb_share_t si; 19298474SJose.Borrego@Sun.COM 19308474SJose.Borrego@Sun.COM native_os = ndr_native_os(mxa); 19318474SJose.Borrego@Sun.COM 19328474SJose.Borrego@Sun.COM if (!ndr_is_poweruser(mxa)) { 19338474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareAdd)); 19348474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 19358474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19368474SJose.Borrego@Sun.COM } 19378474SJose.Borrego@Sun.COM 19388474SJose.Borrego@Sun.COM switch (param->level) { 19398474SJose.Borrego@Sun.COM case 2: 19409832Samw@Sun.COM info2 = (struct mslm_NetShareInfo_2 *)param->info.un.info2; 19418474SJose.Borrego@Sun.COM break; 19428474SJose.Borrego@Sun.COM 19438474SJose.Borrego@Sun.COM case 502: 19449832Samw@Sun.COM info502 = (struct mslm_NetShareInfo_502 *) 19459832Samw@Sun.COM param->info.un.info502; 19469832Samw@Sun.COM sdbuf = info502->shi502_security_descriptor; 19479832Samw@Sun.COM info2 = (struct mslm_NetShareInfo_2 *)info502; 19488474SJose.Borrego@Sun.COM break; 19498474SJose.Borrego@Sun.COM 19508474SJose.Borrego@Sun.COM default: 19518474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareAdd)); 19528474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 19538474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19548474SJose.Borrego@Sun.COM } 19558474SJose.Borrego@Sun.COM 19568474SJose.Borrego@Sun.COM if (info2->shi2_netname == NULL || info2->shi2_path == NULL) { 19578474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareAdd)); 19588474SJose.Borrego@Sun.COM param->status = NERR_NetNameNotFound; 19598474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19608474SJose.Borrego@Sun.COM } 19618474SJose.Borrego@Sun.COM 19628474SJose.Borrego@Sun.COM if (smb_shr_is_restricted((char *)info2->shi2_netname)) { 19638474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareAdd)); 19648474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 19658474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19668474SJose.Borrego@Sun.COM } 19678474SJose.Borrego@Sun.COM 19689343SAfshin.Ardakani@Sun.COM if (info2->shi2_comment == NULL) 19699343SAfshin.Ardakani@Sun.COM info2->shi2_comment = (uint8_t *)""; 19708474SJose.Borrego@Sun.COM 19718474SJose.Borrego@Sun.COM /* 19728474SJose.Borrego@Sun.COM * Derive the real path which will be stored in the 19738474SJose.Borrego@Sun.COM * directory field of the smb_share_t structure 19748474SJose.Borrego@Sun.COM * from the path field in this RPC request. 19758474SJose.Borrego@Sun.COM */ 19768474SJose.Borrego@Sun.COM parm_stat = smb_shr_get_realpath((const char *)info2->shi2_path, 19778474SJose.Borrego@Sun.COM realpath, MAXPATHLEN); 19788474SJose.Borrego@Sun.COM 19798474SJose.Borrego@Sun.COM if (parm_stat != NERR_Success) { 19808474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareAdd)); 19818474SJose.Borrego@Sun.COM param->status = parm_stat; 19828474SJose.Borrego@Sun.COM param->parm_err 19838474SJose.Borrego@Sun.COM = (native_os == NATIVE_OS_WIN95) ? 0 : &parm_err; 19848474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19858474SJose.Borrego@Sun.COM } 19868474SJose.Borrego@Sun.COM 19878474SJose.Borrego@Sun.COM param->status = srvsvc_sa_add((char *)info2->shi2_netname, realpath, 19889343SAfshin.Ardakani@Sun.COM (char *)info2->shi2_comment); 19898474SJose.Borrego@Sun.COM if (param->status == NERR_Success) { 19909832Samw@Sun.COM status = smb_shr_get((char *)info2->shi2_netname, &si); 19919832Samw@Sun.COM 19929832Samw@Sun.COM if ((sdbuf != NULL) && (status == NERR_Success)) 19939832Samw@Sun.COM (void) srvsvc_sd_set(&si, sdbuf); 19948474SJose.Borrego@Sun.COM } 19958474SJose.Borrego@Sun.COM param->parm_err = (native_os == NATIVE_OS_WIN95) ? 0 : &parm_err; 19968474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 19978474SJose.Borrego@Sun.COM } 19988474SJose.Borrego@Sun.COM 19998474SJose.Borrego@Sun.COM /* 200010122SJordan.Brown@Sun.COM * srvsvc_estimate_limit 20018474SJose.Borrego@Sun.COM * 20028474SJose.Borrego@Sun.COM * Estimate the number of objects that will fit in prefmaxlen. 200310122SJordan.Brown@Sun.COM * nlimit is adjusted here. 20048474SJose.Borrego@Sun.COM */ 200510122SJordan.Brown@Sun.COM static void 200610122SJordan.Brown@Sun.COM srvsvc_estimate_limit(smb_svcenum_t *se, uint32_t obj_size) 20078474SJose.Borrego@Sun.COM { 20088474SJose.Borrego@Sun.COM DWORD max_cnt; 20098474SJose.Borrego@Sun.COM 201010122SJordan.Brown@Sun.COM if (obj_size == 0) { 201110122SJordan.Brown@Sun.COM se->se_nlimit = 0; 201210122SJordan.Brown@Sun.COM return; 201310122SJordan.Brown@Sun.COM } 201410122SJordan.Brown@Sun.COM 201510122SJordan.Brown@Sun.COM if ((max_cnt = (se->se_prefmaxlen / obj_size)) == 0) { 201610122SJordan.Brown@Sun.COM se->se_nlimit = 0; 201710122SJordan.Brown@Sun.COM return; 201810122SJordan.Brown@Sun.COM } 201910122SJordan.Brown@Sun.COM 202010122SJordan.Brown@Sun.COM if (se->se_ntotal > max_cnt) 202110122SJordan.Brown@Sun.COM se->se_nlimit = max_cnt; 202210122SJordan.Brown@Sun.COM else 202310122SJordan.Brown@Sun.COM se->se_nlimit = se->se_ntotal; 20248474SJose.Borrego@Sun.COM } 20258474SJose.Borrego@Sun.COM 20268474SJose.Borrego@Sun.COM /* 20278474SJose.Borrego@Sun.COM * srvsvc_s_NetShareEnum 20288474SJose.Borrego@Sun.COM * 20298474SJose.Borrego@Sun.COM * Enumerate all shares (see also NetShareEnumSticky). 20308474SJose.Borrego@Sun.COM * 20318474SJose.Borrego@Sun.COM * Request for various levels of information about our shares. 20328474SJose.Borrego@Sun.COM * Level 0: share names. 20338474SJose.Borrego@Sun.COM * Level 1: share name, share type and comment field. 20348474SJose.Borrego@Sun.COM * Level 2: everything that we know about the shares. 203510504SKeyur.Desai@Sun.COM * Level 501: level 1 + flags. 20368474SJose.Borrego@Sun.COM * Level 502: level 2 + security descriptor. 20378474SJose.Borrego@Sun.COM */ 20388474SJose.Borrego@Sun.COM static int 20398474SJose.Borrego@Sun.COM srvsvc_s_NetShareEnum(void *arg, ndr_xa_t *mxa) 20408474SJose.Borrego@Sun.COM { 20418474SJose.Borrego@Sun.COM struct mslm_NetShareEnum *param = arg; 204210122SJordan.Brown@Sun.COM srvsvc_infonres_t *infonres; 204310122SJordan.Brown@Sun.COM smb_svcenum_t se; 20448474SJose.Borrego@Sun.COM DWORD status; 20458474SJose.Borrego@Sun.COM 204610122SJordan.Brown@Sun.COM infonres = NDR_NEW(mxa, srvsvc_infonres_t); 20478474SJose.Borrego@Sun.COM if (infonres == NULL) { 20488474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareEnum)); 20498474SJose.Borrego@Sun.COM param->status = ERROR_NOT_ENOUGH_MEMORY; 20508474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 20518474SJose.Borrego@Sun.COM } 20528474SJose.Borrego@Sun.COM 20538474SJose.Borrego@Sun.COM infonres->entriesread = 0; 20548474SJose.Borrego@Sun.COM infonres->entries = NULL; 20558474SJose.Borrego@Sun.COM param->result.level = param->level; 20568474SJose.Borrego@Sun.COM param->result.bufptr.p = infonres; 20578474SJose.Borrego@Sun.COM 205810122SJordan.Brown@Sun.COM bzero(&se, sizeof (smb_svcenum_t)); 205910122SJordan.Brown@Sun.COM se.se_type = SMB_SVCENUM_TYPE_SHARE; 20608474SJose.Borrego@Sun.COM se.se_level = param->level; 206110122SJordan.Brown@Sun.COM se.se_ntotal = smb_shr_count(); 206210122SJordan.Brown@Sun.COM se.se_nlimit = se.se_ntotal; 20638474SJose.Borrego@Sun.COM 20648474SJose.Borrego@Sun.COM if (param->prefmaxlen == SMB_SRVSVC_MAXPREFLEN || 20658474SJose.Borrego@Sun.COM param->prefmaxlen > SMB_SRVSVC_MAXBUFLEN) 20668474SJose.Borrego@Sun.COM se.se_prefmaxlen = SMB_SRVSVC_MAXBUFLEN; 20678474SJose.Borrego@Sun.COM else 20688474SJose.Borrego@Sun.COM se.se_prefmaxlen = param->prefmaxlen; 20698474SJose.Borrego@Sun.COM 20708474SJose.Borrego@Sun.COM if (param->resume_handle) { 207110122SJordan.Brown@Sun.COM se.se_resume = *param->resume_handle; 207210122SJordan.Brown@Sun.COM se.se_nskip = se.se_resume; 207310122SJordan.Brown@Sun.COM *param->resume_handle = 0; 20748474SJose.Borrego@Sun.COM } 20758474SJose.Borrego@Sun.COM 20768474SJose.Borrego@Sun.COM switch (param->level) { 20778474SJose.Borrego@Sun.COM case 0: 20788474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel0(mxa, infonres, &se, 0); 20798474SJose.Borrego@Sun.COM break; 20808474SJose.Borrego@Sun.COM 20818474SJose.Borrego@Sun.COM case 1: 20828474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel1(mxa, infonres, &se, 0); 20838474SJose.Borrego@Sun.COM break; 20848474SJose.Borrego@Sun.COM 20858474SJose.Borrego@Sun.COM case 2: 20868474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel2(mxa, infonres, &se, 0); 20878474SJose.Borrego@Sun.COM break; 20888474SJose.Borrego@Sun.COM 20898474SJose.Borrego@Sun.COM case 501: 20908474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel501(mxa, infonres, &se, 0); 20918474SJose.Borrego@Sun.COM break; 20928474SJose.Borrego@Sun.COM 20938474SJose.Borrego@Sun.COM case 502: 20948474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel502(mxa, infonres, &se, 0); 20958474SJose.Borrego@Sun.COM break; 20968474SJose.Borrego@Sun.COM 20978474SJose.Borrego@Sun.COM default: 20989832Samw@Sun.COM status = ERROR_INVALID_LEVEL; 20998474SJose.Borrego@Sun.COM break; 21008474SJose.Borrego@Sun.COM } 21018474SJose.Borrego@Sun.COM 21028474SJose.Borrego@Sun.COM if (status != 0) { 21038474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareEnum)); 21048474SJose.Borrego@Sun.COM param->status = status; 21058474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 21068474SJose.Borrego@Sun.COM } 21078474SJose.Borrego@Sun.COM 210810122SJordan.Brown@Sun.COM if (se.se_nlimit == 0) { 21098474SJose.Borrego@Sun.COM param->status = ERROR_SUCCESS; 21108474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 21118474SJose.Borrego@Sun.COM } 21128474SJose.Borrego@Sun.COM 21138474SJose.Borrego@Sun.COM if (param->resume_handle && 21148474SJose.Borrego@Sun.COM param->prefmaxlen != SMB_SRVSVC_MAXPREFLEN) { 211510122SJordan.Brown@Sun.COM if (se.se_resume < se.se_ntotal) { 211610122SJordan.Brown@Sun.COM *param->resume_handle = se.se_resume; 21178474SJose.Borrego@Sun.COM status = ERROR_MORE_DATA; 21188474SJose.Borrego@Sun.COM } 21198474SJose.Borrego@Sun.COM } 21208474SJose.Borrego@Sun.COM 212110122SJordan.Brown@Sun.COM param->totalentries = se.se_ntotal; 21228474SJose.Borrego@Sun.COM param->status = status; 21238474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 21248474SJose.Borrego@Sun.COM } 21258474SJose.Borrego@Sun.COM 21268474SJose.Borrego@Sun.COM /* 21278474SJose.Borrego@Sun.COM * srvsvc_s_NetShareEnumSticky 21288474SJose.Borrego@Sun.COM * 21298474SJose.Borrego@Sun.COM * Enumerate sticky shares: all shares except those marked STYPE_SPECIAL. 21308474SJose.Borrego@Sun.COM * Except for excluding STYPE_SPECIAL shares, NetShareEnumSticky is the 21318474SJose.Borrego@Sun.COM * same as NetShareEnum. 21328474SJose.Borrego@Sun.COM * 21338474SJose.Borrego@Sun.COM * Request for various levels of information about our shares. 21348474SJose.Borrego@Sun.COM * Level 0: share names. 21358474SJose.Borrego@Sun.COM * Level 1: share name, share type and comment field. 21368474SJose.Borrego@Sun.COM * Level 2: everything that we know about the shares. 21378474SJose.Borrego@Sun.COM * Level 501: not valid for this request. 21388474SJose.Borrego@Sun.COM * Level 502: level 2 + security descriptor. 21398474SJose.Borrego@Sun.COM * 21408474SJose.Borrego@Sun.COM * We set n_skip to resume_handle, which is used to find the appropriate 21418474SJose.Borrego@Sun.COM * place to resume. The resume_handle is similar to the readdir cookie. 21428474SJose.Borrego@Sun.COM */ 21438474SJose.Borrego@Sun.COM static int 21448474SJose.Borrego@Sun.COM srvsvc_s_NetShareEnumSticky(void *arg, ndr_xa_t *mxa) 21458474SJose.Borrego@Sun.COM { 21468474SJose.Borrego@Sun.COM struct mslm_NetShareEnum *param = arg; 214710122SJordan.Brown@Sun.COM srvsvc_infonres_t *infonres; 214810122SJordan.Brown@Sun.COM smb_svcenum_t se; 21498474SJose.Borrego@Sun.COM DWORD status; 21508474SJose.Borrego@Sun.COM 215110122SJordan.Brown@Sun.COM infonres = NDR_NEW(mxa, srvsvc_infonres_t); 21528474SJose.Borrego@Sun.COM if (infonres == NULL) { 21538474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareEnum)); 21548474SJose.Borrego@Sun.COM param->status = ERROR_NOT_ENOUGH_MEMORY; 21558474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 21568474SJose.Borrego@Sun.COM } 21578474SJose.Borrego@Sun.COM 21588474SJose.Borrego@Sun.COM infonres->entriesread = 0; 21598474SJose.Borrego@Sun.COM infonres->entries = NULL; 21608474SJose.Borrego@Sun.COM param->result.level = param->level; 21618474SJose.Borrego@Sun.COM param->result.bufptr.p = infonres; 21628474SJose.Borrego@Sun.COM 216310122SJordan.Brown@Sun.COM bzero(&se, sizeof (smb_svcenum_t)); 216410122SJordan.Brown@Sun.COM se.se_type = SMB_SVCENUM_TYPE_SHARE; 21658474SJose.Borrego@Sun.COM se.se_level = param->level; 216610122SJordan.Brown@Sun.COM se.se_ntotal = smb_shr_count(); 216710122SJordan.Brown@Sun.COM se.se_nlimit = se.se_ntotal; 21688474SJose.Borrego@Sun.COM 21698474SJose.Borrego@Sun.COM if (param->prefmaxlen == SMB_SRVSVC_MAXPREFLEN || 21708474SJose.Borrego@Sun.COM param->prefmaxlen > SMB_SRVSVC_MAXBUFLEN) 21718474SJose.Borrego@Sun.COM se.se_prefmaxlen = SMB_SRVSVC_MAXBUFLEN; 21728474SJose.Borrego@Sun.COM else 21738474SJose.Borrego@Sun.COM se.se_prefmaxlen = param->prefmaxlen; 21748474SJose.Borrego@Sun.COM 21758474SJose.Borrego@Sun.COM if (param->resume_handle) { 217610122SJordan.Brown@Sun.COM se.se_resume = *param->resume_handle; 217710122SJordan.Brown@Sun.COM se.se_nskip = se.se_resume; 217810122SJordan.Brown@Sun.COM *param->resume_handle = 0; 21798474SJose.Borrego@Sun.COM } 21808474SJose.Borrego@Sun.COM 21818474SJose.Borrego@Sun.COM switch (param->level) { 21828474SJose.Borrego@Sun.COM case 0: 21838474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel0(mxa, infonres, &se, 1); 21848474SJose.Borrego@Sun.COM break; 21858474SJose.Borrego@Sun.COM 21868474SJose.Borrego@Sun.COM case 1: 21878474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel1(mxa, infonres, &se, 1); 21888474SJose.Borrego@Sun.COM break; 21898474SJose.Borrego@Sun.COM 21908474SJose.Borrego@Sun.COM case 2: 21918474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel2(mxa, infonres, &se, 1); 21928474SJose.Borrego@Sun.COM break; 21938474SJose.Borrego@Sun.COM 21948474SJose.Borrego@Sun.COM case 502: 21958474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumLevel502(mxa, infonres, &se, 1); 21968474SJose.Borrego@Sun.COM break; 21978474SJose.Borrego@Sun.COM 21989832Samw@Sun.COM case 501: 21998474SJose.Borrego@Sun.COM default: 22008474SJose.Borrego@Sun.COM status = ERROR_INVALID_LEVEL; 22018474SJose.Borrego@Sun.COM break; 22028474SJose.Borrego@Sun.COM } 22038474SJose.Borrego@Sun.COM 22048474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) { 22058474SJose.Borrego@Sun.COM bzero(param, sizeof (struct mslm_NetShareEnum)); 22068474SJose.Borrego@Sun.COM param->status = status; 22078474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 22088474SJose.Borrego@Sun.COM } 22098474SJose.Borrego@Sun.COM 221010122SJordan.Brown@Sun.COM if (se.se_nlimit == 0) { 22118474SJose.Borrego@Sun.COM param->status = ERROR_SUCCESS; 22128474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 22138474SJose.Borrego@Sun.COM } 22148474SJose.Borrego@Sun.COM 22158474SJose.Borrego@Sun.COM if (param->resume_handle && 22168474SJose.Borrego@Sun.COM param->prefmaxlen != SMB_SRVSVC_MAXPREFLEN) { 221710122SJordan.Brown@Sun.COM if (se.se_resume < se.se_ntotal) { 221810122SJordan.Brown@Sun.COM *param->resume_handle = se.se_resume; 22198474SJose.Borrego@Sun.COM status = ERROR_MORE_DATA; 22208474SJose.Borrego@Sun.COM } 22218474SJose.Borrego@Sun.COM } 22228474SJose.Borrego@Sun.COM 222310122SJordan.Brown@Sun.COM param->totalentries = se.se_ntotal; 22248474SJose.Borrego@Sun.COM param->status = status; 22258474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 22268474SJose.Borrego@Sun.COM } 22278474SJose.Borrego@Sun.COM 22288474SJose.Borrego@Sun.COM /* 22298474SJose.Borrego@Sun.COM * NetShareEnum Level 0 22308474SJose.Borrego@Sun.COM */ 22318474SJose.Borrego@Sun.COM static DWORD 223210122SJordan.Brown@Sun.COM mlsvc_NetShareEnumLevel0(ndr_xa_t *mxa, srvsvc_infonres_t *infonres, 223310122SJordan.Brown@Sun.COM smb_svcenum_t *se, int sticky) 22348474SJose.Borrego@Sun.COM { 22359343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_0 *info0; 22368474SJose.Borrego@Sun.COM smb_shriter_t iterator; 22378474SJose.Borrego@Sun.COM smb_share_t *si; 22388474SJose.Borrego@Sun.COM DWORD status; 22398474SJose.Borrego@Sun.COM 224010122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 224110122SJordan.Brown@Sun.COM sizeof (struct mslm_NetShareInfo_0) + MAXNAMELEN); 224210122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 22438474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 22448474SJose.Borrego@Sun.COM 224510122SJordan.Brown@Sun.COM info0 = NDR_NEWN(mxa, struct mslm_NetShareInfo_0, se->se_nlimit); 22468474SJose.Borrego@Sun.COM if (info0 == NULL) 22478474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 22488474SJose.Borrego@Sun.COM 22498474SJose.Borrego@Sun.COM smb_shr_iterinit(&iterator); 22508474SJose.Borrego@Sun.COM 225110122SJordan.Brown@Sun.COM se->se_nitems = 0; 22528474SJose.Borrego@Sun.COM while ((si = smb_shr_iterate(&iterator)) != NULL) { 225310122SJordan.Brown@Sun.COM if (se->se_nskip > 0) { 225410122SJordan.Brown@Sun.COM --se->se_nskip; 22558474SJose.Borrego@Sun.COM continue; 22568474SJose.Borrego@Sun.COM } 22578474SJose.Borrego@Sun.COM 225810122SJordan.Brown@Sun.COM ++se->se_resume; 22598474SJose.Borrego@Sun.COM 22608474SJose.Borrego@Sun.COM if (sticky && (si->shr_flags & SMB_SHRF_TRANS)) 22618474SJose.Borrego@Sun.COM continue; 22628474SJose.Borrego@Sun.COM 22638474SJose.Borrego@Sun.COM if (si->shr_flags & SMB_SHRF_AUTOHOME) 22648474SJose.Borrego@Sun.COM continue; 22658474SJose.Borrego@Sun.COM 226610122SJordan.Brown@Sun.COM if (se->se_nitems >= se->se_nlimit) { 226710122SJordan.Brown@Sun.COM se->se_nitems = se->se_nlimit; 22688474SJose.Borrego@Sun.COM break; 22698474SJose.Borrego@Sun.COM } 22708474SJose.Borrego@Sun.COM 22718474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumCommon(mxa, se, si, (void *)info0); 22728474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 22738474SJose.Borrego@Sun.COM break; 22748474SJose.Borrego@Sun.COM 227510122SJordan.Brown@Sun.COM ++se->se_nitems; 22768474SJose.Borrego@Sun.COM } 22778474SJose.Borrego@Sun.COM 227810122SJordan.Brown@Sun.COM if (se->se_nitems < se->se_nlimit) { 22798474SJose.Borrego@Sun.COM if (srvsvc_add_autohome(mxa, se, (void *)info0)) 228010122SJordan.Brown@Sun.COM ++se->se_nitems; 22818474SJose.Borrego@Sun.COM } 22828474SJose.Borrego@Sun.COM 228310122SJordan.Brown@Sun.COM infonres->entriesread = se->se_nitems; 22848474SJose.Borrego@Sun.COM infonres->entries = info0; 22858474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 22868474SJose.Borrego@Sun.COM } 22878474SJose.Borrego@Sun.COM 22888474SJose.Borrego@Sun.COM /* 22898474SJose.Borrego@Sun.COM * NetShareEnum Level 1 22908474SJose.Borrego@Sun.COM */ 22918474SJose.Borrego@Sun.COM static DWORD 229210122SJordan.Brown@Sun.COM mlsvc_NetShareEnumLevel1(ndr_xa_t *mxa, srvsvc_infonres_t *infonres, 229310122SJordan.Brown@Sun.COM smb_svcenum_t *se, int sticky) 22948474SJose.Borrego@Sun.COM { 22959343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_1 *info1; 22968474SJose.Borrego@Sun.COM smb_shriter_t iterator; 22978474SJose.Borrego@Sun.COM smb_share_t *si; 22988474SJose.Borrego@Sun.COM DWORD status; 22998474SJose.Borrego@Sun.COM 230010122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 230110122SJordan.Brown@Sun.COM sizeof (struct mslm_NetShareInfo_1) + MAXNAMELEN); 230210122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 23038474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 23048474SJose.Borrego@Sun.COM 230510122SJordan.Brown@Sun.COM info1 = NDR_NEWN(mxa, struct mslm_NetShareInfo_1, se->se_nlimit); 23068474SJose.Borrego@Sun.COM if (info1 == NULL) 23078474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 23088474SJose.Borrego@Sun.COM 23098474SJose.Borrego@Sun.COM smb_shr_iterinit(&iterator); 23108474SJose.Borrego@Sun.COM 231110122SJordan.Brown@Sun.COM se->se_nitems = 0; 23128474SJose.Borrego@Sun.COM while ((si = smb_shr_iterate(&iterator)) != 0) { 231310122SJordan.Brown@Sun.COM if (se->se_nskip > 0) { 231410122SJordan.Brown@Sun.COM --se->se_nskip; 23158474SJose.Borrego@Sun.COM continue; 23168474SJose.Borrego@Sun.COM } 23178474SJose.Borrego@Sun.COM 231810122SJordan.Brown@Sun.COM ++se->se_resume; 23198474SJose.Borrego@Sun.COM 23208474SJose.Borrego@Sun.COM if (sticky && (si->shr_flags & SMB_SHRF_TRANS)) 23218474SJose.Borrego@Sun.COM continue; 23228474SJose.Borrego@Sun.COM 23238474SJose.Borrego@Sun.COM if (si->shr_flags & SMB_SHRF_AUTOHOME) 23248474SJose.Borrego@Sun.COM continue; 23258474SJose.Borrego@Sun.COM 232610122SJordan.Brown@Sun.COM if (se->se_nitems >= se->se_nlimit) { 232710122SJordan.Brown@Sun.COM se->se_nitems = se->se_nlimit; 23288474SJose.Borrego@Sun.COM break; 23298474SJose.Borrego@Sun.COM } 23308474SJose.Borrego@Sun.COM 23318474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumCommon(mxa, se, si, (void *)info1); 23328474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 23338474SJose.Borrego@Sun.COM break; 23348474SJose.Borrego@Sun.COM 233510122SJordan.Brown@Sun.COM ++se->se_nitems; 23368474SJose.Borrego@Sun.COM } 23378474SJose.Borrego@Sun.COM 233810122SJordan.Brown@Sun.COM if (se->se_nitems < se->se_nlimit) { 23398474SJose.Borrego@Sun.COM if (srvsvc_add_autohome(mxa, se, (void *)info1)) 234010122SJordan.Brown@Sun.COM ++se->se_nitems; 23418474SJose.Borrego@Sun.COM } 23428474SJose.Borrego@Sun.COM 234310122SJordan.Brown@Sun.COM infonres->entriesread = se->se_nitems; 23448474SJose.Borrego@Sun.COM infonres->entries = info1; 23458474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 23468474SJose.Borrego@Sun.COM } 23478474SJose.Borrego@Sun.COM 23488474SJose.Borrego@Sun.COM /* 23498474SJose.Borrego@Sun.COM * NetShareEnum Level 2 23508474SJose.Borrego@Sun.COM */ 23518474SJose.Borrego@Sun.COM static DWORD 235210122SJordan.Brown@Sun.COM mlsvc_NetShareEnumLevel2(ndr_xa_t *mxa, srvsvc_infonres_t *infonres, 235310122SJordan.Brown@Sun.COM smb_svcenum_t *se, int sticky) 23548474SJose.Borrego@Sun.COM { 23559343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_2 *info2; 23568474SJose.Borrego@Sun.COM smb_shriter_t iterator; 23578474SJose.Borrego@Sun.COM smb_share_t *si; 23588474SJose.Borrego@Sun.COM DWORD status; 23598474SJose.Borrego@Sun.COM 236010122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 236110122SJordan.Brown@Sun.COM sizeof (struct mslm_NetShareInfo_2) + MAXNAMELEN); 236210122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 23638474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 23648474SJose.Borrego@Sun.COM 236510122SJordan.Brown@Sun.COM info2 = NDR_NEWN(mxa, struct mslm_NetShareInfo_2, se->se_nlimit); 23668474SJose.Borrego@Sun.COM if (info2 == NULL) 23678474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 23688474SJose.Borrego@Sun.COM 23698474SJose.Borrego@Sun.COM smb_shr_iterinit(&iterator); 23708474SJose.Borrego@Sun.COM 237110122SJordan.Brown@Sun.COM se->se_nitems = 0; 23728474SJose.Borrego@Sun.COM while ((si = smb_shr_iterate(&iterator)) != 0) { 237310122SJordan.Brown@Sun.COM if (se->se_nskip > 0) { 237410122SJordan.Brown@Sun.COM --se->se_nskip; 23758474SJose.Borrego@Sun.COM continue; 23768474SJose.Borrego@Sun.COM } 23778474SJose.Borrego@Sun.COM 237810122SJordan.Brown@Sun.COM ++se->se_resume; 23798474SJose.Borrego@Sun.COM 23808474SJose.Borrego@Sun.COM if (sticky && (si->shr_flags & SMB_SHRF_TRANS)) 23818474SJose.Borrego@Sun.COM continue; 23828474SJose.Borrego@Sun.COM 23838474SJose.Borrego@Sun.COM if (si->shr_flags & SMB_SHRF_AUTOHOME) 23848474SJose.Borrego@Sun.COM continue; 23858474SJose.Borrego@Sun.COM 238610122SJordan.Brown@Sun.COM if (se->se_nitems >= se->se_nlimit) { 238710122SJordan.Brown@Sun.COM se->se_nitems = se->se_nlimit; 23888474SJose.Borrego@Sun.COM break; 23898474SJose.Borrego@Sun.COM } 23908474SJose.Borrego@Sun.COM 23918474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumCommon(mxa, se, si, (void *)info2); 23928474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 23938474SJose.Borrego@Sun.COM break; 23948474SJose.Borrego@Sun.COM 239510122SJordan.Brown@Sun.COM ++se->se_nitems; 23968474SJose.Borrego@Sun.COM } 23978474SJose.Borrego@Sun.COM 239810122SJordan.Brown@Sun.COM if (se->se_nitems < se->se_nlimit) { 23998474SJose.Borrego@Sun.COM if (srvsvc_add_autohome(mxa, se, (void *)info2)) 240010122SJordan.Brown@Sun.COM ++se->se_nitems; 24018474SJose.Borrego@Sun.COM } 24028474SJose.Borrego@Sun.COM 240310122SJordan.Brown@Sun.COM infonres->entriesread = se->se_nitems; 24048474SJose.Borrego@Sun.COM infonres->entries = info2; 24058474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 24068474SJose.Borrego@Sun.COM } 24078474SJose.Borrego@Sun.COM 24088474SJose.Borrego@Sun.COM /* 24098474SJose.Borrego@Sun.COM * NetShareEnum Level 501 24108474SJose.Borrego@Sun.COM */ 24118474SJose.Borrego@Sun.COM static DWORD 241210122SJordan.Brown@Sun.COM mlsvc_NetShareEnumLevel501(ndr_xa_t *mxa, srvsvc_infonres_t *infonres, 241310122SJordan.Brown@Sun.COM smb_svcenum_t *se, int sticky) 24148474SJose.Borrego@Sun.COM { 24159343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_501 *info501; 24168474SJose.Borrego@Sun.COM smb_shriter_t iterator; 24178474SJose.Borrego@Sun.COM smb_share_t *si; 24188474SJose.Borrego@Sun.COM DWORD status; 24198474SJose.Borrego@Sun.COM 242010122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 242110122SJordan.Brown@Sun.COM sizeof (struct mslm_NetShareInfo_501) + MAXNAMELEN); 242210122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 24238474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 24248474SJose.Borrego@Sun.COM 24259343SAfshin.Ardakani@Sun.COM info501 = NDR_NEWN(mxa, struct mslm_NetShareInfo_501, 242610122SJordan.Brown@Sun.COM se->se_nlimit); 24278474SJose.Borrego@Sun.COM if (info501 == NULL) 24288474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 24298474SJose.Borrego@Sun.COM 24308474SJose.Borrego@Sun.COM smb_shr_iterinit(&iterator); 24318474SJose.Borrego@Sun.COM 243210122SJordan.Brown@Sun.COM se->se_nitems = 0; 24338474SJose.Borrego@Sun.COM while ((si = smb_shr_iterate(&iterator)) != 0) { 243410122SJordan.Brown@Sun.COM if (se->se_nskip > 0) { 243510122SJordan.Brown@Sun.COM --se->se_nskip; 24368474SJose.Borrego@Sun.COM continue; 24378474SJose.Borrego@Sun.COM } 24388474SJose.Borrego@Sun.COM 243910122SJordan.Brown@Sun.COM ++se->se_resume; 24408474SJose.Borrego@Sun.COM 24418474SJose.Borrego@Sun.COM if (sticky && (si->shr_flags & SMB_SHRF_TRANS)) 24428474SJose.Borrego@Sun.COM continue; 24438474SJose.Borrego@Sun.COM 24448474SJose.Borrego@Sun.COM if (si->shr_flags & SMB_SHRF_AUTOHOME) 24458474SJose.Borrego@Sun.COM continue; 24468474SJose.Borrego@Sun.COM 244710122SJordan.Brown@Sun.COM if (se->se_nitems >= se->se_nlimit) { 244810122SJordan.Brown@Sun.COM se->se_nitems = se->se_nlimit; 24498474SJose.Borrego@Sun.COM break; 24508474SJose.Borrego@Sun.COM } 24518474SJose.Borrego@Sun.COM 24528474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumCommon(mxa, se, si, (void *)info501); 24538474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 24548474SJose.Borrego@Sun.COM break; 24558474SJose.Borrego@Sun.COM 245610122SJordan.Brown@Sun.COM ++se->se_nitems; 24578474SJose.Borrego@Sun.COM } 24588474SJose.Borrego@Sun.COM 245910122SJordan.Brown@Sun.COM if (se->se_nitems < se->se_nlimit) { 24608474SJose.Borrego@Sun.COM if (srvsvc_add_autohome(mxa, se, (void *)info501)) 246110122SJordan.Brown@Sun.COM ++se->se_nitems; 24628474SJose.Borrego@Sun.COM } 24638474SJose.Borrego@Sun.COM 246410122SJordan.Brown@Sun.COM infonres->entriesread = se->se_nitems; 24658474SJose.Borrego@Sun.COM infonres->entries = info501; 24668474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 24678474SJose.Borrego@Sun.COM } 24688474SJose.Borrego@Sun.COM 24698474SJose.Borrego@Sun.COM /* 24708474SJose.Borrego@Sun.COM * NetShareEnum Level 502 24718474SJose.Borrego@Sun.COM */ 24728474SJose.Borrego@Sun.COM static DWORD 247310122SJordan.Brown@Sun.COM mlsvc_NetShareEnumLevel502(ndr_xa_t *mxa, srvsvc_infonres_t *infonres, 247410122SJordan.Brown@Sun.COM smb_svcenum_t *se, int sticky) 24758474SJose.Borrego@Sun.COM { 24769343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_502 *info502; 24778474SJose.Borrego@Sun.COM smb_shriter_t iterator; 24788474SJose.Borrego@Sun.COM smb_share_t *si; 24798474SJose.Borrego@Sun.COM DWORD status; 24808474SJose.Borrego@Sun.COM 248110122SJordan.Brown@Sun.COM srvsvc_estimate_limit(se, 248210122SJordan.Brown@Sun.COM sizeof (struct mslm_NetShareInfo_502) + MAXNAMELEN); 248310122SJordan.Brown@Sun.COM if (se->se_nlimit == 0) 24848474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 24858474SJose.Borrego@Sun.COM 24869343SAfshin.Ardakani@Sun.COM info502 = NDR_NEWN(mxa, struct mslm_NetShareInfo_502, 248710122SJordan.Brown@Sun.COM se->se_nlimit); 24888474SJose.Borrego@Sun.COM if (info502 == NULL) 24898474SJose.Borrego@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 24908474SJose.Borrego@Sun.COM 24918474SJose.Borrego@Sun.COM smb_shr_iterinit(&iterator); 24928474SJose.Borrego@Sun.COM 249310122SJordan.Brown@Sun.COM se->se_nitems = 0; 24948474SJose.Borrego@Sun.COM while ((si = smb_shr_iterate(&iterator)) != NULL) { 249510122SJordan.Brown@Sun.COM if (se->se_nskip > 0) { 249610122SJordan.Brown@Sun.COM --se->se_nskip; 24978474SJose.Borrego@Sun.COM continue; 24988474SJose.Borrego@Sun.COM } 24998474SJose.Borrego@Sun.COM 250010122SJordan.Brown@Sun.COM ++se->se_resume; 25018474SJose.Borrego@Sun.COM 25028474SJose.Borrego@Sun.COM if (sticky && (si->shr_flags & SMB_SHRF_TRANS)) 25038474SJose.Borrego@Sun.COM continue; 25048474SJose.Borrego@Sun.COM 25058474SJose.Borrego@Sun.COM if (si->shr_flags & SMB_SHRF_AUTOHOME) 25068474SJose.Borrego@Sun.COM continue; 25078474SJose.Borrego@Sun.COM 250810122SJordan.Brown@Sun.COM if (se->se_nitems >= se->se_nlimit) { 250910122SJordan.Brown@Sun.COM se->se_nitems = se->se_nlimit; 25108474SJose.Borrego@Sun.COM break; 25118474SJose.Borrego@Sun.COM } 25128474SJose.Borrego@Sun.COM 25138474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumCommon(mxa, se, si, (void *)info502); 25148474SJose.Borrego@Sun.COM if (status != ERROR_SUCCESS) 25158474SJose.Borrego@Sun.COM break; 25168474SJose.Borrego@Sun.COM 251710122SJordan.Brown@Sun.COM ++se->se_nitems; 25188474SJose.Borrego@Sun.COM } 25198474SJose.Borrego@Sun.COM 252010122SJordan.Brown@Sun.COM if (se->se_nitems < se->se_nlimit) { 25218474SJose.Borrego@Sun.COM if (srvsvc_add_autohome(mxa, se, (void *)info502)) 252210122SJordan.Brown@Sun.COM ++se->se_nitems; 25238474SJose.Borrego@Sun.COM } 25248474SJose.Borrego@Sun.COM 252510122SJordan.Brown@Sun.COM infonres->entriesread = se->se_nitems; 25268474SJose.Borrego@Sun.COM infonres->entries = info502; 25278474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 25288474SJose.Borrego@Sun.COM } 25298474SJose.Borrego@Sun.COM 25308474SJose.Borrego@Sun.COM /* 25318474SJose.Borrego@Sun.COM * mlsvc_NetShareEnumCommon 25328474SJose.Borrego@Sun.COM * 25338474SJose.Borrego@Sun.COM * Build the levels 0, 1, 2, 501 and 502 share information. This function 25348474SJose.Borrego@Sun.COM * is called by the various NetShareEnum levels for each share. If 25358474SJose.Borrego@Sun.COM * we cannot build the share data for some reason, we return an error 25368474SJose.Borrego@Sun.COM * but the actual value of the error is not important to the caller. 25378474SJose.Borrego@Sun.COM * The caller just needs to know not to include this info in the RPC 25388474SJose.Borrego@Sun.COM * response. 25398474SJose.Borrego@Sun.COM * 25408474SJose.Borrego@Sun.COM * Returns: 25418474SJose.Borrego@Sun.COM * ERROR_SUCCESS 25428474SJose.Borrego@Sun.COM * ERROR_NOT_ENOUGH_MEMORY 25438474SJose.Borrego@Sun.COM * ERROR_INVALID_LEVEL 25448474SJose.Borrego@Sun.COM */ 25458474SJose.Borrego@Sun.COM static DWORD 254610122SJordan.Brown@Sun.COM mlsvc_NetShareEnumCommon(ndr_xa_t *mxa, smb_svcenum_t *se, 25478474SJose.Borrego@Sun.COM smb_share_t *si, void *infop) 25488474SJose.Borrego@Sun.COM { 25499343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_0 *info0; 25509343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_1 *info1; 25519343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_2 *info2; 25529343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_501 *info501; 25539343SAfshin.Ardakani@Sun.COM struct mslm_NetShareInfo_502 *info502; 25549832Samw@Sun.COM srvsvc_sd_t sd; 25559832Samw@Sun.COM uint8_t *netname; 25569832Samw@Sun.COM uint8_t *comment; 25579832Samw@Sun.COM uint8_t *passwd; 25589832Samw@Sun.COM uint8_t *path; 255910122SJordan.Brown@Sun.COM int i = se->se_nitems; 25608474SJose.Borrego@Sun.COM 25619832Samw@Sun.COM netname = (uint8_t *)NDR_STRDUP(mxa, si->shr_name); 25629832Samw@Sun.COM comment = (uint8_t *)NDR_STRDUP(mxa, si->shr_cmnt); 25639832Samw@Sun.COM passwd = (uint8_t *)NDR_STRDUP(mxa, empty_string); 25649832Samw@Sun.COM path = (uint8_t *)srvsvc_share_mkpath(mxa, si->shr_path); 25659832Samw@Sun.COM 25669832Samw@Sun.COM if (!netname || !comment || !passwd || !path) 25679832Samw@Sun.COM return (ERROR_NOT_ENOUGH_MEMORY); 25689832Samw@Sun.COM 25698474SJose.Borrego@Sun.COM switch (se->se_level) { 25708474SJose.Borrego@Sun.COM case 0: 25719343SAfshin.Ardakani@Sun.COM info0 = (struct mslm_NetShareInfo_0 *)infop; 25729832Samw@Sun.COM info0[i].shi0_netname = netname; 25738474SJose.Borrego@Sun.COM break; 25748474SJose.Borrego@Sun.COM 25758474SJose.Borrego@Sun.COM case 1: 25769343SAfshin.Ardakani@Sun.COM info1 = (struct mslm_NetShareInfo_1 *)infop; 25779832Samw@Sun.COM info1[i].shi1_netname = netname; 25789832Samw@Sun.COM info1[i].shi1_comment = comment; 25798474SJose.Borrego@Sun.COM info1[i].shi1_type = si->shr_type; 25808474SJose.Borrego@Sun.COM break; 25818474SJose.Borrego@Sun.COM 25828474SJose.Borrego@Sun.COM case 2: 25839343SAfshin.Ardakani@Sun.COM info2 = (struct mslm_NetShareInfo_2 *)infop; 25849832Samw@Sun.COM info2[i].shi2_netname = netname; 25859832Samw@Sun.COM info2[i].shi2_comment = comment; 25869832Samw@Sun.COM info2[i].shi2_path = path; 25878474SJose.Borrego@Sun.COM info2[i].shi2_type = si->shr_type; 25888474SJose.Borrego@Sun.COM info2[i].shi2_permissions = 0; 25898474SJose.Borrego@Sun.COM info2[i].shi2_max_uses = SHI_USES_UNLIMITED; 25908474SJose.Borrego@Sun.COM info2[i].shi2_current_uses = 0; 25919832Samw@Sun.COM info2[i].shi2_passwd = passwd; 25928474SJose.Borrego@Sun.COM break; 25938474SJose.Borrego@Sun.COM 25948474SJose.Borrego@Sun.COM case 501: 25959343SAfshin.Ardakani@Sun.COM info501 = (struct mslm_NetShareInfo_501 *)infop; 25969832Samw@Sun.COM info501[i].shi501_netname = netname; 25979832Samw@Sun.COM info501[i].shi501_comment = comment; 25988474SJose.Borrego@Sun.COM info501[i].shi501_type = si->shr_type; 259910504SKeyur.Desai@Sun.COM info501[i].shi501_flags = srvsvc_get_share_flags(si); 26008474SJose.Borrego@Sun.COM break; 26018474SJose.Borrego@Sun.COM 26028474SJose.Borrego@Sun.COM case 502: 26039343SAfshin.Ardakani@Sun.COM info502 = (struct mslm_NetShareInfo_502 *)infop; 26049832Samw@Sun.COM info502[i].shi502_netname = netname; 26059832Samw@Sun.COM info502[i].shi502_comment = comment; 26069832Samw@Sun.COM info502[i].shi502_path = path; 26078474SJose.Borrego@Sun.COM info502[i].shi502_type = si->shr_type; 26088474SJose.Borrego@Sun.COM info502[i].shi502_permissions = 0; 26098474SJose.Borrego@Sun.COM info502[i].shi502_max_uses = SHI_USES_UNLIMITED; 26108474SJose.Borrego@Sun.COM info502[i].shi502_current_uses = 0; 26119832Samw@Sun.COM info502[i].shi502_passwd = passwd; 26129832Samw@Sun.COM 26139832Samw@Sun.COM if (srvsvc_share_getsd(mxa, si, &sd) == ERROR_SUCCESS) { 26149832Samw@Sun.COM info502[i].shi502_reserved = sd.sd_size; 26159832Samw@Sun.COM info502[i].shi502_security_descriptor = sd.sd_buf; 26169832Samw@Sun.COM } else { 26179832Samw@Sun.COM info502[i].shi502_reserved = 0; 26189832Samw@Sun.COM info502[i].shi502_security_descriptor = NULL; 26199832Samw@Sun.COM } 26209832Samw@Sun.COM 26218474SJose.Borrego@Sun.COM break; 26228474SJose.Borrego@Sun.COM 26238474SJose.Borrego@Sun.COM default: 26248474SJose.Borrego@Sun.COM return (ERROR_INVALID_LEVEL); 26258474SJose.Borrego@Sun.COM } 26268474SJose.Borrego@Sun.COM 26278474SJose.Borrego@Sun.COM return (ERROR_SUCCESS); 26288474SJose.Borrego@Sun.COM } 26298474SJose.Borrego@Sun.COM 26308474SJose.Borrego@Sun.COM /* 26318474SJose.Borrego@Sun.COM * srvsvc_add_autohome 26328474SJose.Borrego@Sun.COM * 26338474SJose.Borrego@Sun.COM * Add the autohome share for the user. The share must not be a permanent 26348474SJose.Borrego@Sun.COM * share to avoid duplicates. 26358474SJose.Borrego@Sun.COM */ 26368474SJose.Borrego@Sun.COM static boolean_t 263710122SJordan.Brown@Sun.COM srvsvc_add_autohome(ndr_xa_t *mxa, smb_svcenum_t *se, void *infop) 26388474SJose.Borrego@Sun.COM { 263910122SJordan.Brown@Sun.COM smb_netuserinfo_t *user = &mxa->pipe->np_user; 264010122SJordan.Brown@Sun.COM char *username = user->ui_account; 26418474SJose.Borrego@Sun.COM smb_share_t si; 26428474SJose.Borrego@Sun.COM DWORD status; 26438474SJose.Borrego@Sun.COM 26448474SJose.Borrego@Sun.COM if (smb_shr_get(username, &si) != NERR_Success) 26458474SJose.Borrego@Sun.COM return (B_FALSE); 26468474SJose.Borrego@Sun.COM 26478474SJose.Borrego@Sun.COM if ((si.shr_flags & SMB_SHRF_AUTOHOME) == 0) 26488474SJose.Borrego@Sun.COM return (B_FALSE); 26498474SJose.Borrego@Sun.COM 26508474SJose.Borrego@Sun.COM status = mlsvc_NetShareEnumCommon(mxa, se, &si, infop); 26518474SJose.Borrego@Sun.COM return (status == ERROR_SUCCESS); 26528474SJose.Borrego@Sun.COM } 26538474SJose.Borrego@Sun.COM 26548474SJose.Borrego@Sun.COM /* 26558474SJose.Borrego@Sun.COM * srvsvc_share_mkpath 26568474SJose.Borrego@Sun.COM * 26578474SJose.Borrego@Sun.COM * Create the share path required by the share enum calls. The path 26588474SJose.Borrego@Sun.COM * is created in a heap buffer ready for use by the caller. 26598474SJose.Borrego@Sun.COM * 26608474SJose.Borrego@Sun.COM * Some Windows over-the-wire backup applications do not work unless a 26618474SJose.Borrego@Sun.COM * drive letter is present in the share path. We don't care about the 26628474SJose.Borrego@Sun.COM * drive letter since the path is fully qualified with the volume name. 26638474SJose.Borrego@Sun.COM * 26648474SJose.Borrego@Sun.COM * Windows clients seem to be mostly okay with forward slashes in 26658474SJose.Borrego@Sun.COM * share paths but they cannot handle one immediately after the drive 26668474SJose.Borrego@Sun.COM * letter, i.e. B:/. For consistency we convert all the slashes in 26678474SJose.Borrego@Sun.COM * the path. 26688474SJose.Borrego@Sun.COM * 26698474SJose.Borrego@Sun.COM * Returns a pointer to a heap buffer containing the share path, which 26708474SJose.Borrego@Sun.COM * could be a null pointer if the heap allocation fails. 26718474SJose.Borrego@Sun.COM */ 26728474SJose.Borrego@Sun.COM static char * 26738474SJose.Borrego@Sun.COM srvsvc_share_mkpath(ndr_xa_t *mxa, char *path) 26748474SJose.Borrego@Sun.COM { 26758474SJose.Borrego@Sun.COM char tmpbuf[MAXPATHLEN]; 26768474SJose.Borrego@Sun.COM char *p; 26778474SJose.Borrego@Sun.COM 26788474SJose.Borrego@Sun.COM if (strlen(path) == 0) 26798474SJose.Borrego@Sun.COM return (NDR_STRDUP(mxa, path)); 26808474SJose.Borrego@Sun.COM 26818474SJose.Borrego@Sun.COM /* 26828474SJose.Borrego@Sun.COM * Strip the volume name from the path (/vol1/home -> /home). 26838474SJose.Borrego@Sun.COM */ 26848474SJose.Borrego@Sun.COM p = path; 26858474SJose.Borrego@Sun.COM p += strspn(p, "/"); 26868474SJose.Borrego@Sun.COM p += strcspn(p, "/"); 26878474SJose.Borrego@Sun.COM p += strspn(p, "/"); 26888474SJose.Borrego@Sun.COM (void) snprintf(tmpbuf, MAXPATHLEN, "%c:/%s", 'B', p); 26898474SJose.Borrego@Sun.COM (void) strsubst(tmpbuf, '/', '\\'); 26908474SJose.Borrego@Sun.COM 26918474SJose.Borrego@Sun.COM return (NDR_STRDUP(mxa, tmpbuf)); 26928474SJose.Borrego@Sun.COM } 26938474SJose.Borrego@Sun.COM 26949832Samw@Sun.COM static int 26959832Samw@Sun.COM srvsvc_s_NetShareCheck(void *arg, ndr_xa_t *mxa) 26969832Samw@Sun.COM { 26979832Samw@Sun.COM struct mslm_NetShareCheck *param = arg; 26989832Samw@Sun.COM smb_shriter_t iterator; 26999832Samw@Sun.COM smb_share_t *si; 27009832Samw@Sun.COM char *path; 27019832Samw@Sun.COM 27029832Samw@Sun.COM if (param->path == NULL) { 27039832Samw@Sun.COM param->stype = STYPE_DISKTREE; 27049832Samw@Sun.COM param->status = NERR_NetNameNotFound; 27059832Samw@Sun.COM return (NDR_DRC_OK); 27069832Samw@Sun.COM } 27079832Samw@Sun.COM 27089832Samw@Sun.COM (void) strsubst((char *)param->path, '/', '\\'); 27099832Samw@Sun.COM 27109832Samw@Sun.COM smb_shr_iterinit(&iterator); 27119832Samw@Sun.COM 27129832Samw@Sun.COM while ((si = smb_shr_iterate(&iterator)) != NULL) { 27139832Samw@Sun.COM path = srvsvc_share_mkpath(mxa, si->shr_path); 27149832Samw@Sun.COM 2715*10966SJordan.Brown@Sun.COM if (smb_strcasecmp(path, (char *)param->path, 0) == 0) { 27169832Samw@Sun.COM param->stype = (si->shr_type & STYPE_MASK); 27179832Samw@Sun.COM param->status = NERR_Success; 27189832Samw@Sun.COM return (NDR_DRC_OK); 27199832Samw@Sun.COM } 27209832Samw@Sun.COM } 27219832Samw@Sun.COM 27229832Samw@Sun.COM param->stype = STYPE_DISKTREE; 27239832Samw@Sun.COM param->status = NERR_NetNameNotFound; 27249832Samw@Sun.COM return (NDR_DRC_OK); 27259832Samw@Sun.COM } 27269832Samw@Sun.COM 27278474SJose.Borrego@Sun.COM /* 27288474SJose.Borrego@Sun.COM * srvsvc_s_NetShareDel 27298474SJose.Borrego@Sun.COM * 273010122SJordan.Brown@Sun.COM * Delete a share. Only members of the Administrators, Server Operators 273110122SJordan.Brown@Sun.COM * or Power Users local groups are allowed to delete shares. 27328474SJose.Borrego@Sun.COM * 27338474SJose.Borrego@Sun.COM * This interface is used by the rmtshare command from the NT resource 27348474SJose.Borrego@Sun.COM * kit. Rmtshare allows a client to add or remove shares on a server 27358474SJose.Borrego@Sun.COM * from the client's command line. 27368474SJose.Borrego@Sun.COM * 27378474SJose.Borrego@Sun.COM * Returns Win32 error codes. 27388474SJose.Borrego@Sun.COM */ 27398474SJose.Borrego@Sun.COM static int 27408474SJose.Borrego@Sun.COM srvsvc_s_NetShareDel(void *arg, ndr_xa_t *mxa) 27418474SJose.Borrego@Sun.COM { 27428474SJose.Borrego@Sun.COM struct mslm_NetShareDel *param = arg; 27438474SJose.Borrego@Sun.COM 27448474SJose.Borrego@Sun.COM if (!ndr_is_poweruser(mxa) || 27458474SJose.Borrego@Sun.COM smb_shr_is_restricted((char *)param->netname)) { 27468474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 27478474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 27488474SJose.Borrego@Sun.COM } 27498474SJose.Borrego@Sun.COM 27508474SJose.Borrego@Sun.COM param->status = srvsvc_sa_delete((char *)param->netname); 27518474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 27528474SJose.Borrego@Sun.COM } 27538474SJose.Borrego@Sun.COM 27548474SJose.Borrego@Sun.COM /* 27558474SJose.Borrego@Sun.COM * srvsvc_s_NetGetFileSecurity 27568474SJose.Borrego@Sun.COM * 27578474SJose.Borrego@Sun.COM * Get security descriptor of the requested file/folder 27588474SJose.Borrego@Sun.COM * 27598474SJose.Borrego@Sun.COM * Right now, just returns ERROR_ACCESS_DENIED, because we cannot 27608474SJose.Borrego@Sun.COM * get the requested SD here in RPC code. 27618474SJose.Borrego@Sun.COM */ 27628474SJose.Borrego@Sun.COM /*ARGSUSED*/ 27638474SJose.Borrego@Sun.COM static int 27648474SJose.Borrego@Sun.COM srvsvc_s_NetGetFileSecurity(void *arg, ndr_xa_t *mxa) 27658474SJose.Borrego@Sun.COM { 27668474SJose.Borrego@Sun.COM struct mslm_NetGetFileSecurity *param = arg; 27678474SJose.Borrego@Sun.COM 27688474SJose.Borrego@Sun.COM param->length = 0; 27698474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 27708474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 27718474SJose.Borrego@Sun.COM } 27728474SJose.Borrego@Sun.COM 27738474SJose.Borrego@Sun.COM /* 27748474SJose.Borrego@Sun.COM * srvsvc_s_NetSetFileSecurity 27758474SJose.Borrego@Sun.COM * 27768474SJose.Borrego@Sun.COM * Set the given security descriptor for the requested file/folder 27778474SJose.Borrego@Sun.COM * 27788474SJose.Borrego@Sun.COM * Right now, just returns ERROR_ACCESS_DENIED, because we cannot 27798474SJose.Borrego@Sun.COM * set the requested SD here in RPC code. 27808474SJose.Borrego@Sun.COM */ 27818474SJose.Borrego@Sun.COM /*ARGSUSED*/ 27828474SJose.Borrego@Sun.COM static int 27838474SJose.Borrego@Sun.COM srvsvc_s_NetSetFileSecurity(void *arg, ndr_xa_t *mxa) 27848474SJose.Borrego@Sun.COM { 27858474SJose.Borrego@Sun.COM struct mslm_NetSetFileSecurity *param = arg; 27868474SJose.Borrego@Sun.COM 27878474SJose.Borrego@Sun.COM param->status = ERROR_ACCESS_DENIED; 27888474SJose.Borrego@Sun.COM return (NDR_DRC_OK); 27898474SJose.Borrego@Sun.COM } 27908474SJose.Borrego@Sun.COM 27918474SJose.Borrego@Sun.COM /* 27928474SJose.Borrego@Sun.COM * If the default "smb" share group exists then return the group 27938474SJose.Borrego@Sun.COM * handle, otherwise create the group and return the handle. 27948474SJose.Borrego@Sun.COM * 27958474SJose.Borrego@Sun.COM * All shares created via the srvsvc will be added to the "smb" 27968474SJose.Borrego@Sun.COM * group. 27978474SJose.Borrego@Sun.COM */ 27988474SJose.Borrego@Sun.COM static sa_group_t 27998474SJose.Borrego@Sun.COM srvsvc_sa_get_smbgrp(sa_handle_t handle) 28008474SJose.Borrego@Sun.COM { 28018474SJose.Borrego@Sun.COM sa_group_t group = NULL; 28028474SJose.Borrego@Sun.COM int err; 28038474SJose.Borrego@Sun.COM 28048474SJose.Borrego@Sun.COM group = sa_get_group(handle, SMB_DEFAULT_SHARE_GROUP); 28058474SJose.Borrego@Sun.COM if (group != NULL) 28068474SJose.Borrego@Sun.COM return (group); 28078474SJose.Borrego@Sun.COM 28088474SJose.Borrego@Sun.COM group = sa_create_group(handle, SMB_DEFAULT_SHARE_GROUP, &err); 28098474SJose.Borrego@Sun.COM if (group == NULL) 28108474SJose.Borrego@Sun.COM return (NULL); 28118474SJose.Borrego@Sun.COM 28128474SJose.Borrego@Sun.COM if (sa_create_optionset(group, SMB_DEFAULT_SHARE_GROUP) == NULL) { 28138474SJose.Borrego@Sun.COM (void) sa_remove_group(group); 28148474SJose.Borrego@Sun.COM group = NULL; 28158474SJose.Borrego@Sun.COM } 28168474SJose.Borrego@Sun.COM 28178474SJose.Borrego@Sun.COM return (group); 28188474SJose.Borrego@Sun.COM } 28198474SJose.Borrego@Sun.COM 28208474SJose.Borrego@Sun.COM /* 28218474SJose.Borrego@Sun.COM * Stores the given share in sharemgr 28228474SJose.Borrego@Sun.COM */ 28238474SJose.Borrego@Sun.COM static uint32_t 28248474SJose.Borrego@Sun.COM srvsvc_sa_add(char *sharename, char *path, char *cmnt) 28258474SJose.Borrego@Sun.COM { 28268474SJose.Borrego@Sun.COM sa_handle_t handle; 28278474SJose.Borrego@Sun.COM sa_share_t share; 28288474SJose.Borrego@Sun.COM sa_group_t group; 28298474SJose.Borrego@Sun.COM sa_resource_t resource; 28308474SJose.Borrego@Sun.COM boolean_t new_share = B_FALSE; 28318474SJose.Borrego@Sun.COM uint32_t status = NERR_Success; 28328474SJose.Borrego@Sun.COM int err; 28338474SJose.Borrego@Sun.COM 28348474SJose.Borrego@Sun.COM if ((handle = smb_shr_sa_enter()) == NULL) 28358474SJose.Borrego@Sun.COM return (NERR_InternalError); 28368474SJose.Borrego@Sun.COM 28378474SJose.Borrego@Sun.COM share = sa_find_share(handle, path); 28388474SJose.Borrego@Sun.COM if (share == NULL) { 28398474SJose.Borrego@Sun.COM group = srvsvc_sa_get_smbgrp(handle); 28408474SJose.Borrego@Sun.COM if (group == NULL) { 28418474SJose.Borrego@Sun.COM smb_shr_sa_exit(); 28428474SJose.Borrego@Sun.COM return (NERR_InternalError); 28438474SJose.Borrego@Sun.COM } 28448474SJose.Borrego@Sun.COM 28458474SJose.Borrego@Sun.COM share = sa_add_share(group, path, SA_SHARE_PERMANENT, &err); 28468474SJose.Borrego@Sun.COM if (share == NULL) { 28478474SJose.Borrego@Sun.COM smb_shr_sa_exit(); 28488474SJose.Borrego@Sun.COM return (NERR_InternalError); 28498474SJose.Borrego@Sun.COM } 28508474SJose.Borrego@Sun.COM new_share = B_TRUE; 28518474SJose.Borrego@Sun.COM } 28528474SJose.Borrego@Sun.COM 28538474SJose.Borrego@Sun.COM resource = sa_get_share_resource(share, sharename); 28548474SJose.Borrego@Sun.COM if (resource == NULL) { 28558474SJose.Borrego@Sun.COM resource = sa_add_resource(share, sharename, 28568474SJose.Borrego@Sun.COM SA_SHARE_PERMANENT, &err); 28578474SJose.Borrego@Sun.COM if (resource == NULL) { 28588474SJose.Borrego@Sun.COM if (new_share) 28598474SJose.Borrego@Sun.COM (void) sa_remove_share(share); 28608474SJose.Borrego@Sun.COM smb_shr_sa_exit(); 28618474SJose.Borrego@Sun.COM return (NERR_InternalError); 28628474SJose.Borrego@Sun.COM } 28638474SJose.Borrego@Sun.COM } 28648474SJose.Borrego@Sun.COM 28658474SJose.Borrego@Sun.COM (void) sa_set_resource_description(resource, cmnt); 28668474SJose.Borrego@Sun.COM 28678474SJose.Borrego@Sun.COM smb_shr_sa_exit(); 28688474SJose.Borrego@Sun.COM return (status); 28698474SJose.Borrego@Sun.COM } 28708474SJose.Borrego@Sun.COM 28718474SJose.Borrego@Sun.COM /* 28728474SJose.Borrego@Sun.COM * Removes the share from sharemgr 28738474SJose.Borrego@Sun.COM */ 28748474SJose.Borrego@Sun.COM static uint32_t 28758474SJose.Borrego@Sun.COM srvsvc_sa_delete(char *sharename) 28768474SJose.Borrego@Sun.COM { 28778474SJose.Borrego@Sun.COM sa_handle_t handle; 28788474SJose.Borrego@Sun.COM sa_resource_t resource; 28798474SJose.Borrego@Sun.COM uint32_t status; 28808474SJose.Borrego@Sun.COM 28818474SJose.Borrego@Sun.COM if ((handle = smb_shr_sa_enter()) == NULL) 28828474SJose.Borrego@Sun.COM return (NERR_InternalError); 28838474SJose.Borrego@Sun.COM 28848474SJose.Borrego@Sun.COM status = NERR_InternalError; 28858474SJose.Borrego@Sun.COM if ((resource = sa_find_resource(handle, sharename)) != NULL) { 28868474SJose.Borrego@Sun.COM if (sa_remove_resource(resource) == SA_OK) 28878474SJose.Borrego@Sun.COM status = NERR_Success; 28888474SJose.Borrego@Sun.COM } 28898474SJose.Borrego@Sun.COM 28908474SJose.Borrego@Sun.COM smb_shr_sa_exit(); 28918474SJose.Borrego@Sun.COM return (status); 28928474SJose.Borrego@Sun.COM } 28938474SJose.Borrego@Sun.COM 28949832Samw@Sun.COM /* 28959832Samw@Sun.COM * Update the share information. 28969832Samw@Sun.COM */ 28979832Samw@Sun.COM static uint32_t 28989832Samw@Sun.COM srvsvc_sa_modify(smb_share_t *si, srvsvc_netshare_setinfo_t *info) 28999832Samw@Sun.COM { 29009832Samw@Sun.COM sa_handle_t handle; 29019832Samw@Sun.COM sa_share_t share; 29029832Samw@Sun.COM sa_resource_t resource; 29039832Samw@Sun.COM boolean_t renamed = B_FALSE; 29049832Samw@Sun.COM uint32_t nerr = NERR_Success; 29059832Samw@Sun.COM 29069832Samw@Sun.COM if ((handle = smb_shr_sa_enter()) == NULL) 29079832Samw@Sun.COM return (NERR_InternalError); 29089832Samw@Sun.COM 29099832Samw@Sun.COM if ((share = sa_find_share(handle, si->shr_path)) == NULL) { 29109832Samw@Sun.COM smb_shr_sa_exit(); 29119832Samw@Sun.COM return (NERR_InternalError); 29129832Samw@Sun.COM } 29139832Samw@Sun.COM 29149832Samw@Sun.COM if ((resource = sa_get_share_resource(share, si->shr_name)) == NULL) { 29159832Samw@Sun.COM smb_shr_sa_exit(); 29169832Samw@Sun.COM return (NERR_InternalError); 29179832Samw@Sun.COM } 29189832Samw@Sun.COM 29199832Samw@Sun.COM if (info->nss_netname != NULL && info->nss_netname[0] != '\0' && 2920*10966SJordan.Brown@Sun.COM smb_strcasecmp(info->nss_netname, si->shr_name, 0) != 0) { 29219832Samw@Sun.COM (void) sa_set_resource_attr(resource, SHOPT_NAME, 29229832Samw@Sun.COM info->nss_netname); 29239832Samw@Sun.COM renamed = B_TRUE; 29249832Samw@Sun.COM } 29259832Samw@Sun.COM 29269832Samw@Sun.COM if ((info->nss_comment != NULL) && 29279832Samw@Sun.COM (strcmp(info->nss_comment, si->shr_cmnt) != 0)) { 29289832Samw@Sun.COM (void) sa_set_resource_description(resource, info->nss_comment); 29299832Samw@Sun.COM (void) strlcpy(si->shr_cmnt, info->nss_comment, 29309832Samw@Sun.COM SMB_SHARE_CMNT_MAX); 29319832Samw@Sun.COM } 29329832Samw@Sun.COM 29339832Samw@Sun.COM smb_shr_sa_exit(); 29349832Samw@Sun.COM 29359832Samw@Sun.COM if (renamed) { 29369832Samw@Sun.COM nerr = smb_shr_rename(si->shr_name, info->nss_netname); 29379832Samw@Sun.COM if (nerr != NERR_Success) 29389832Samw@Sun.COM return (nerr); 29399832Samw@Sun.COM 29409832Samw@Sun.COM (void) strlcpy(si->shr_name, info->nss_netname, MAXNAMELEN); 29419832Samw@Sun.COM } 29429832Samw@Sun.COM 29439832Samw@Sun.COM return (nerr); 29449832Samw@Sun.COM } 29459832Samw@Sun.COM 29469832Samw@Sun.COM /* 294710504SKeyur.Desai@Sun.COM * Update the share properties. 294810504SKeyur.Desai@Sun.COM * 294910504SKeyur.Desai@Sun.COM * Updates the optionset properties of the share resource. 295010504SKeyur.Desai@Sun.COM * The properties are given as a list of name-value pair. 295110504SKeyur.Desai@Sun.COM * The name argument should be the optionset property name and the value 295210504SKeyur.Desai@Sun.COM * should be a valid value for the specified property. 29539832Samw@Sun.COM */ 29549832Samw@Sun.COM static uint32_t 295510504SKeyur.Desai@Sun.COM srvsvc_sa_setprop(smb_share_t *si, nvlist_t *nvl) 29569832Samw@Sun.COM { 29579832Samw@Sun.COM sa_handle_t handle; 29589832Samw@Sun.COM sa_share_t share; 29599832Samw@Sun.COM sa_resource_t resource; 296010504SKeyur.Desai@Sun.COM sa_property_t prop; 296110504SKeyur.Desai@Sun.COM sa_optionset_t opts; 296210504SKeyur.Desai@Sun.COM uint32_t nerr = NERR_Success; 296310504SKeyur.Desai@Sun.COM nvpair_t *cur; 296410504SKeyur.Desai@Sun.COM int err = 0; 296510504SKeyur.Desai@Sun.COM char *name, *val; 29669832Samw@Sun.COM 29679832Samw@Sun.COM if ((handle = smb_shr_sa_enter()) == NULL) 29689832Samw@Sun.COM return (NERR_InternalError); 29699832Samw@Sun.COM 29709832Samw@Sun.COM if ((share = sa_find_share(handle, si->shr_path)) == NULL) { 29719832Samw@Sun.COM smb_shr_sa_exit(); 29729832Samw@Sun.COM return (NERR_InternalError); 29739832Samw@Sun.COM } 29749832Samw@Sun.COM 29759832Samw@Sun.COM if ((resource = sa_get_share_resource(share, si->shr_name)) == NULL) { 29769832Samw@Sun.COM smb_shr_sa_exit(); 29779832Samw@Sun.COM return (NERR_InternalError); 29789832Samw@Sun.COM } 29799832Samw@Sun.COM 298010504SKeyur.Desai@Sun.COM if ((opts = sa_get_optionset(resource, SMB_PROTOCOL_NAME)) == NULL) { 298110504SKeyur.Desai@Sun.COM opts = sa_create_optionset(resource, SMB_PROTOCOL_NAME); 298210504SKeyur.Desai@Sun.COM if (opts == NULL) { 298310504SKeyur.Desai@Sun.COM smb_shr_sa_exit(); 298410504SKeyur.Desai@Sun.COM return (NERR_InternalError); 298510504SKeyur.Desai@Sun.COM } 29869832Samw@Sun.COM } 29879832Samw@Sun.COM 298810504SKeyur.Desai@Sun.COM cur = nvlist_next_nvpair(nvl, NULL); 298910504SKeyur.Desai@Sun.COM while (cur != NULL) { 299010504SKeyur.Desai@Sun.COM name = nvpair_name(cur); 299110504SKeyur.Desai@Sun.COM err = nvpair_value_string(cur, &val); 299210504SKeyur.Desai@Sun.COM if ((err != 0) || (name == NULL) || (val == NULL)) { 299310504SKeyur.Desai@Sun.COM nerr = NERR_InternalError; 299410504SKeyur.Desai@Sun.COM break; 299510504SKeyur.Desai@Sun.COM } 299610504SKeyur.Desai@Sun.COM 299710504SKeyur.Desai@Sun.COM prop = NULL; 299810504SKeyur.Desai@Sun.COM if ((prop = sa_get_property(opts, name)) == NULL) { 299910504SKeyur.Desai@Sun.COM prop = sa_create_property(name, val); 300010504SKeyur.Desai@Sun.COM if (prop != NULL) { 300110504SKeyur.Desai@Sun.COM nerr = sa_valid_property(handle, opts, 300210504SKeyur.Desai@Sun.COM SMB_PROTOCOL_NAME, prop); 300310504SKeyur.Desai@Sun.COM if (nerr != NERR_Success) { 300410504SKeyur.Desai@Sun.COM (void) sa_remove_property(prop); 300510504SKeyur.Desai@Sun.COM break; 300610504SKeyur.Desai@Sun.COM } 300710504SKeyur.Desai@Sun.COM } 300810504SKeyur.Desai@Sun.COM nerr = sa_add_property(opts, prop); 300910504SKeyur.Desai@Sun.COM if (nerr != NERR_Success) 301010504SKeyur.Desai@Sun.COM break; 301110504SKeyur.Desai@Sun.COM } else { 301210504SKeyur.Desai@Sun.COM nerr = sa_update_property(prop, val); 301310504SKeyur.Desai@Sun.COM if (nerr != NERR_Success) 301410504SKeyur.Desai@Sun.COM break; 301510504SKeyur.Desai@Sun.COM } 301610504SKeyur.Desai@Sun.COM 301710504SKeyur.Desai@Sun.COM cur = nvlist_next_nvpair(nvl, cur); 301810504SKeyur.Desai@Sun.COM } 301910504SKeyur.Desai@Sun.COM 302010504SKeyur.Desai@Sun.COM if (nerr == NERR_Success) 302110504SKeyur.Desai@Sun.COM nerr = sa_commit_properties(opts, 0); 302210504SKeyur.Desai@Sun.COM 30239832Samw@Sun.COM smb_shr_sa_exit(); 302410504SKeyur.Desai@Sun.COM return (nerr); 30259832Samw@Sun.COM } 30269832Samw@Sun.COM 302710504SKeyur.Desai@Sun.COM 30288474SJose.Borrego@Sun.COM static ndr_stub_table_t srvsvc_stub_table[] = { 30298474SJose.Borrego@Sun.COM { srvsvc_s_NetConnectEnum, SRVSVC_OPNUM_NetConnectEnum }, 30308474SJose.Borrego@Sun.COM { srvsvc_s_NetFileEnum, SRVSVC_OPNUM_NetFileEnum }, 30318474SJose.Borrego@Sun.COM { srvsvc_s_NetFileClose, SRVSVC_OPNUM_NetFileClose }, 30328474SJose.Borrego@Sun.COM { srvsvc_s_NetShareGetInfo, SRVSVC_OPNUM_NetShareGetInfo }, 30338474SJose.Borrego@Sun.COM { srvsvc_s_NetShareSetInfo, SRVSVC_OPNUM_NetShareSetInfo }, 30348474SJose.Borrego@Sun.COM { srvsvc_s_NetSessionEnum, SRVSVC_OPNUM_NetSessionEnum }, 30358474SJose.Borrego@Sun.COM { srvsvc_s_NetSessionDel, SRVSVC_OPNUM_NetSessionDel }, 30368474SJose.Borrego@Sun.COM { srvsvc_s_NetServerGetInfo, SRVSVC_OPNUM_NetServerGetInfo }, 30378474SJose.Borrego@Sun.COM { srvsvc_s_NetRemoteTOD, SRVSVC_OPNUM_NetRemoteTOD }, 30388474SJose.Borrego@Sun.COM { srvsvc_s_NetNameValidate, SRVSVC_OPNUM_NetNameValidate }, 30398474SJose.Borrego@Sun.COM { srvsvc_s_NetShareAdd, SRVSVC_OPNUM_NetShareAdd }, 30408474SJose.Borrego@Sun.COM { srvsvc_s_NetShareDel, SRVSVC_OPNUM_NetShareDel }, 30418474SJose.Borrego@Sun.COM { srvsvc_s_NetShareEnum, SRVSVC_OPNUM_NetShareEnum }, 30428474SJose.Borrego@Sun.COM { srvsvc_s_NetShareEnumSticky, SRVSVC_OPNUM_NetShareEnumSticky }, 30439832Samw@Sun.COM { srvsvc_s_NetShareCheck, SRVSVC_OPNUM_NetShareCheck }, 30448474SJose.Borrego@Sun.COM { srvsvc_s_NetGetFileSecurity, SRVSVC_OPNUM_NetGetFileSecurity }, 30458474SJose.Borrego@Sun.COM { srvsvc_s_NetSetFileSecurity, SRVSVC_OPNUM_NetSetFileSecurity }, 30468474SJose.Borrego@Sun.COM {0} 30478474SJose.Borrego@Sun.COM }; 3048