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