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 2013 Nexenta Systems, Inc.  All rights reserved.
  24  */
  25 
  26 /*
  27  * SRVSVC - Server Service (partial)
  28  *
  29  * This module needs only NetShareEnum (levels 0, 1)
  30  * and NetServerGetInfo (levels 100, 101)
  31  */
  32 
  33 #include <libmlrpc/ndrtypes.ndl>
  34 
  35 /*
  36  * SRVSVC - Server Service
  37  */
  38 
  39 #define SRVSVC_OPNUM_NetShareEnum                0x0f
  40 #define SRVSVC_OPNUM_NetServerGetInfo            0x15
  41 
  42 /*
  43  * SRVSVC NetShareEnum (
  44  *      IN  LPTSTR      servername,
  45  *      IN  DWORD       level;
  46  *      OUT union switch(level) {
  47  *              case 0: struct {
  48  *                              DWORD entriesread;
  49  *                           [size_is(entriesread)]
  50  *                              _SHARE_INFO_0 *entries;
  51  *                      } *bufptr0;
  52  *              case 1: struct {
  53  *                              DWORD entriesread;
  54  *                           [size_is(entriesread)]
  55  *                              _SHARE_INFO_1 *entries;
  56  *                      } *bufptr1;
  57  *              ...
  58  *          }           bufptr,
  59  *      IN  DWORD       prefmaxlen,
  60  *      OUT DWORD       totalentries,
  61  *      IN OUT DWORD ?* resume_handle,
  62  *      OUT DWORD       status
  63  *      )
  64  */
  65 
  66 struct mslm_NetShareInfo_0 {
  67         LPTSTR shi0_netname;
  68 };
  69 struct mslm_NetShareInfo_0_result {
  70         DWORD   entriesread;
  71         SIZE_IS(entriesread)
  72         struct mslm_NetShareInfo_0 *entries;
  73 };
  74 
  75 struct mslm_NetShareInfo_1 {
  76         LPTSTR  shi1_netname;
  77         DWORD   shi1_type; /* type of resource such as IPC$ */
  78         LPTSTR  shi1_comment;
  79 };
  80 struct mslm_NetShareInfo_1_result {
  81         DWORD   entriesread;
  82         SIZE_IS(entriesread)
  83         struct mslm_NetShareInfo_1 *entries;
  84 };
  85 
  86 union mslm_NetShareEnum_ru {
  87         CASE(0)         struct mslm_NetShareInfo_0_result *bufptr0;
  88         CASE(1)         struct mslm_NetShareInfo_1_result *bufptr1;
  89         DEFAULT         char *nullptr;
  90 };
  91 struct mslm_NetShareEnum_result {
  92         DWORD   level;
  93         SWITCH(level)
  94         union mslm_NetShareEnum_ru ru;
  95 };
  96 
  97 
  98 OPERATION(SRVSVC_OPNUM_NetShareEnum)
  99 struct mslm_NetShareEnum {
 100         IN              LPTSTR  servername;
 101         INOUT           DWORD   level;
 102         INOUT           struct mslm_NetShareEnum_result result;
 103         IN              DWORD   prefmaxlen;
 104         OUT             DWORD   totalentries;
 105         INOUT           DWORD   *resume_handle;
 106         OUT             DWORD   status;
 107 };
 108 
 109 
 110 /*
 111  * SRVSVC NetServerGetInfo (
 112  *      IN LPTSTR       servername,
 113  *      IN DWORD        level,
 114  *      OUT union switch(level) {
 115  *              case 100: _SERVER_INFO_100 *    p100;
 116  *              case 101: _SERVER_INFO_101 *    p101;
 117  *              case 102: _SERVER_INFO_102 *    p102;
 118  *          }           bufptr,
 119  *      OUT DWORD       status
 120  *      )
 121  */
 122 
 123 /* for svX_platform (note: decimal!) */
 124 #define SV_PLATFORM_ID_DOS      300
 125 #define SV_PLATFORM_ID_OS2      400
 126 #define SV_PLATFORM_ID_NT       500
 127 #define SV_PLATFORM_ID_OSF      600
 128 #define SV_PLATFORM_ID_VMS      700
 129 
 130 struct mslm_SERVER_INFO_100 {
 131         DWORD           sv100_platform_id;
 132         LPTSTR          sv100_name;
 133 };
 134 
 135 struct mslm_SERVER_INFO_101 {
 136         DWORD           sv101_platform_id;
 137         LPTSTR          sv101_name;
 138         DWORD           sv101_version_major;
 139         DWORD           sv101_version_minor;
 140         DWORD           sv101_type;
 141         LPTSTR          sv101_comment;
 142 };
 143 
 144 union mslm_NetServerGetInfo_ru {
 145         CASE(100)       struct mslm_SERVER_INFO_100 *info100;
 146         CASE(101)       struct mslm_SERVER_INFO_101 *info101;
 147         DEFAULT         char *nullptr;
 148 };
 149 
 150 struct mslm_NetServerGetInfo_result {
 151         DWORD level;
 152         SWITCH(level)
 153         union mslm_NetServerGetInfo_ru ru;
 154 };
 155 
 156 
 157 OPERATION(SRVSVC_OPNUM_NetServerGetInfo)
 158 struct mslm_NetServerGetInfo {
 159         IN  LPTSTR      servername;
 160         IN  DWORD       level;
 161         OUT struct mslm_NetServerGetInfo_result result;
 162         OUT DWORD       status;
 163 };
 164 
 165 
 166 /*
 167  * The SRVSVC interface
 168  */
 169 INTERFACE(0)
 170 union srvsvc_interface {
 171         CASE(SRVSVC_OPNUM_NetShareEnum)
 172                 struct mslm_NetShareEnum        NetShareEnum;
 173         CASE(SRVSVC_OPNUM_NetServerGetInfo)
 174                 struct mslm_NetServerGetInfo    NetServerGetInfo;
 175 };
 176 typedef union srvsvc_interface  srvsvc_interface_t;
 177 EXTERNTYPEINFO(srvsvc_interface)