1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
27  */
28 
29 /*
30  * A few excerpts from lib/smbsrv/libmlsvc
31  * See longer comment in srvsvc1.ndl
32  */
33 
34 #include <sys/errno.h>
35 #include <stdio.h>
36 #include <time.h>
37 #include <strings.h>
38 #include <time.h>
39 
40 #include <libmlrpc/libmlrpc.h>
41 #include "srvsvc1_clnt.h"
42 
43 static ndr_service_t srvsvc_service = {
44 	"SRVSVC",			/* name */
45 	"Server services",		/* desc */
46 	"\\srvsvc",			/* endpoint */
47 	"\\PIPE\\ntsvcs",		/* sec_addr_port */
48 	"4b324fc8-1670-01d3-1278-5a47bf6ee188", 3,	/* abstract */
49 	NDR_TRANSFER_SYNTAX_UUID,		2,	/* transfer */
50 	0,				/* no bind_instance_size */
51 	0,				/* no bind_req() */
52 	0,				/* no unbind_and_close() */
53 	0,				/* use generic_call_stub() */
54 	&TYPEINFO(srvsvc_interface),	/* interface_ti */
55 	NULL				/* stub_table */
56 };
57 
58 /*
59  * srvsvc_initialize
60  *
61  * This function registers the SRVSVC RPC interface with the RPC runtime
62  * library. It must be called in order to use either the client side
63  * or the server side functions.
64  */
65 void
srvsvc1_initialize(void)66 srvsvc1_initialize(void)
67 {
68 	static int init_done;
69 	if (init_done)
70 		return;
71 	init_done = 1;
72 	(void) ndr_svc_register(&srvsvc_service);
73 }
74 
75 /*
76  * Client-side stub for NetServerGetInfo
77  */
78 int
srvsvc_net_server_getinfo(mlrpc_handle_t * handle,char * server,int level,union mslm_NetServerGetInfo_ru * resp)79 srvsvc_net_server_getinfo(mlrpc_handle_t *handle, char *server,
80 	int level, union mslm_NetServerGetInfo_ru *resp)
81 {
82 	struct mslm_NetServerGetInfo arg;
83 	int len, opnum, rc;
84 
85 	opnum = SRVSVC_OPNUM_NetServerGetInfo;
86 	bzero(&arg, sizeof (arg));
87 
88 	len = strlen(server) + 4;
89 	arg.servername = ndr_rpc_malloc(handle, len);
90 	if (arg.servername == NULL)
91 		return (ENOMEM);
92 
93 	(void) snprintf((char *)arg.servername, len, "\\\\%s", server);
94 	arg.level = level;
95 
96 	rc = ndr_rpc_call(handle, opnum, &arg);
97 	if ((rc != 0) || (arg.status != 0))
98 		return (EIO);
99 
100 	*resp = arg.result.ru;
101 	return (0);
102 }
103 
104 /*
105  * Client-side stub for NetShareEnum
106  */
107 int
srvsvc_net_share_enum(mlrpc_handle_t * handle,char * server,int level,union mslm_NetShareEnum_ru * resp)108 srvsvc_net_share_enum(mlrpc_handle_t *handle, char *server,
109 	int level, union mslm_NetShareEnum_ru *resp)
110 {
111 	/* Any enum result type is OK for nres. */
112 	struct mslm_NetShareInfo_0_result nres;
113 	struct mslm_NetShareEnum arg;
114 	int len, opnum, rc;
115 
116 	opnum = SRVSVC_OPNUM_NetShareEnum;
117 	bzero(&nres, sizeof (nres));
118 	bzero(&arg, sizeof (arg));
119 
120 	len = strlen(server) + 4;
121 	arg.servername = ndr_rpc_malloc(handle, len);
122 	if (arg.servername == NULL)
123 		return (ENOMEM);
124 
125 	(void) snprintf((char *)arg.servername, len, "\\\\%s", server);
126 	arg.level = level;
127 	arg.result.level = level;
128 	arg.result.ru.bufptr0 = &nres;
129 	arg.prefmaxlen = 0xFFFFFFFF;
130 	arg.resume_handle = NULL;
131 
132 	rc = ndr_rpc_call(handle, opnum, &arg);
133 	if ((rc != 0) || (arg.status != 0))
134 		return (EIO);
135 
136 	*resp = arg.result.ru;
137 	return (0);
138 }
139