1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 14 */ 15 16 /* 17 * Share enumeration using Remote Procedure Call (RPC) 18 */ 19 20 #include <sys/types.h> 21 22 #include <errno.h> 23 #include <stdio.h> 24 #include <stdlib.h> 25 #include <string.h> 26 27 #include <libmlrpc/libmlrpc.h> 28 #include <netsmb/smbfs_api.h> 29 #include "srvsvc1_clnt.h" 30 #include "common.h" 31 32 int 33 share_enum_rpc(struct smb_ctx *ctx, char *server) 34 { 35 mlrpc_handle_t handle; 36 ndr_service_t *svc; 37 union mslm_NetShareEnum_ru res; 38 struct mslm_NetShareInfo_1 *nsi1; 39 int err, i, count; 40 41 /* 42 * Create an RPC handle using the smb_ctx we already have. 43 * Just local allocation and initialization. 44 */ 45 srvsvc1_initialize(); 46 svc = ndr_svc_lookup_name("srvsvc"); 47 if (svc == NULL) 48 return (ENOENT); 49 50 err = mlrpc_clh_create(&handle, ctx); 51 if (err) 52 return (err); 53 54 /* 55 * Try to bind to the RPC service. If it fails, 56 * just return the error and the caller will 57 * fall back to RAP. 58 */ 59 err = mlrpc_clh_bind(&handle, svc); 60 if (err) 61 goto out; 62 63 err = srvsvc_net_share_enum(&handle, server, 1, &res); 64 if (err) 65 goto out; 66 67 /* Print the header line. */ 68 view_print_share(NULL, 0, NULL); 69 70 /* Print the share list. */ 71 count = res.bufptr1->entriesread; 72 i = 0, nsi1 = res.bufptr1->entries; 73 while (i < count) { 74 /* Convert UTF-8 to local code set? */ 75 view_print_share((char *)nsi1->shi1_netname, 76 nsi1->shi1_type, (char *)nsi1->shi1_comment); 77 i++, nsi1++; 78 } 79 80 out: 81 (void) mlrpc_clh_free(&handle); 82 return (err); 83 }