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