1*7052Samw /* 2*7052Samw * CDDL HEADER START 3*7052Samw * 4*7052Samw * The contents of this file are subject to the terms of the 5*7052Samw * Common Development and Distribution License (the "License"). 6*7052Samw * You may not use this file except in compliance with the License. 7*7052Samw * 8*7052Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*7052Samw * or http://www.opensolaris.org/os/licensing. 10*7052Samw * See the License for the specific language governing permissions 11*7052Samw * and limitations under the License. 12*7052Samw * 13*7052Samw * When distributing Covered Code, include this CDDL HEADER in each 14*7052Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*7052Samw * If applicable, add the following below this CDDL HEADER, with the 16*7052Samw * fields enclosed by brackets "[]" replaced with your own identifying 17*7052Samw * information: Portions Copyright [yyyy] [name of copyright owner] 18*7052Samw * 19*7052Samw * CDDL HEADER END 20*7052Samw */ 21*7052Samw /* 22*7052Samw * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23*7052Samw * Use is subject to license terms. 24*7052Samw */ 25*7052Samw 26*7052Samw #ifndef _SMB_SHARE_H 27*7052Samw #define _SMB_SHARE_H 28*7052Samw 29*7052Samw #pragma ident "%Z%%M% %I% %E% SMI" 30*7052Samw 31*7052Samw /* 32*7052Samw * This file defines the LanMan (CIFS/SMB) resource share interface. 33*7052Samw */ 34*7052Samw 35*7052Samw #include <sys/param.h> 36*7052Samw #include <smbsrv/string.h> 37*7052Samw #include <smbsrv/hash_table.h> 38*7052Samw #include <smbsrv/smb_fsd.h> 39*7052Samw #include <smbsrv/wintypes.h> 40*7052Samw #include <smbsrv/lmerr.h> 41*7052Samw #include <smbsrv/smb_common_door.h> 42*7052Samw 43*7052Samw #ifndef _KERNEL 44*7052Samw #include <libshare.h> 45*7052Samw #else 46*7052Samw #include <sys/door.h> 47*7052Samw #endif 48*7052Samw 49*7052Samw #ifdef __cplusplus 50*7052Samw extern "C" { 51*7052Samw #endif 52*7052Samw 53*7052Samw /* 54*7052Samw * The following 4 macros are mainly for sharemgr use 55*7052Samw */ 56*7052Samw #define SMB_SHROPT_AD_CONTAINER "ad-container" 57*7052Samw #define SMB_SHROPT_NAME "name" /* name is a pseudo property */ 58*7052Samw 59*7052Samw #define SMB_DEFAULT_SHARE_GROUP "smb" 60*7052Samw #define SMB_PROTOCOL_NAME "smb" 61*7052Samw 62*7052Samw /* 63*7052Samw * RAP protocol share related commands only understand 64*7052Samw * share names in OEM format and there is a 13 char size 65*7052Samw * limitation 66*7052Samw */ 67*7052Samw #define SMB_SHARE_OEMNAME_MAX 13 68*7052Samw #define SMB_SHARE_CMNT_MAX (64 * MTS_MB_CHAR_MAX) 69*7052Samw 70*7052Samw /* 71*7052Samw * struct SHARE_INFO_1 { 72*7052Samw * char shi1_netname[13] 73*7052Samw * char shi1_pad; 74*7052Samw * unsigned short shi1_type 75*7052Samw * char *shi1_remark; 76*7052Samw * } 77*7052Samw */ 78*7052Samw #define SHARE_INFO_1_SIZE (SMB_SHARE_OEMNAME_MAX + 1 + 2 + 4) 79*7052Samw 80*7052Samw /* 81*7052Samw * Share flags: 82*7052Samw * 83*7052Samw * SMB_SHRF_TRANS Transient share 84*7052Samw * SMB_SHRF_PERM Permanent share 85*7052Samw * SMB_SHRF_AUTOHOME Autohome share. 86*7052Samw * SMB_SHRF_LONGNAME Share name in OEM is longer than 13 chars 87*7052Samw * SMB_SHRF_ADMIN Admin share 88*7052Samw * 89*7052Samw * All autohome shares are transient but not all transient shares are autohome. 90*7052Samw * IPC$ and drive letter shares (e.g. d$, e$, etc) are transient but 91*7052Samw * not autohome. 92*7052Samw */ 93*7052Samw #define SMB_SHRF_TRANS 0x0001 94*7052Samw #define SMB_SHRF_PERM 0x0002 95*7052Samw #define SMB_SHRF_AUTOHOME 0x0004 96*7052Samw #define SMB_SHRF_LONGNAME 0x0008 97*7052Samw #define SMB_SHRF_ADMIN 0x0010 98*7052Samw #define SMB_SHRF_ALL (SMB_SHRF_TRANS | SMB_SHRF_PERM) 99*7052Samw 100*7052Samw /* 101*7052Samw * refcnt is currently only used for autohome. autohome needs a refcnt 102*7052Samw * because a user can map his autohome share from more than one client 103*7052Samw * at the same time and the share should only be removed when the last 104*7052Samw * one is disconnected 105*7052Samw */ 106*7052Samw typedef struct smb_share { 107*7052Samw char shr_name[MAXNAMELEN]; 108*7052Samw char shr_path[MAXPATHLEN]; 109*7052Samw char shr_cmnt[SMB_SHARE_CMNT_MAX]; 110*7052Samw char shr_container[MAXPATHLEN]; 111*7052Samw char shr_oemname[SMB_SHARE_OEMNAME_MAX]; 112*7052Samw uint32_t shr_flags; 113*7052Samw uint32_t shr_type; 114*7052Samw uint32_t shr_refcnt; 115*7052Samw } smb_share_t; 116*7052Samw 117*7052Samw typedef struct smb_shriter { 118*7052Samw smb_share_t si_share; 119*7052Samw HT_ITERATOR si_hashiter; 120*7052Samw uint32_t si_counter; 121*7052Samw uint32_t si_mode; 122*7052Samw } smb_shriter_t; 123*7052Samw 124*7052Samw #define LMSHARES_PER_REQUEST 10 125*7052Samw typedef struct smb_shrlist { 126*7052Samw int no; 127*7052Samw smb_share_t smbshr[LMSHARES_PER_REQUEST]; 128*7052Samw } smb_shrlist_t; 129*7052Samw 130*7052Samw /* 131*7052Samw * This structure is a helper for building NetShareEnum response 132*7052Samw * in user space and send it back down to kernel. 133*7052Samw * 134*7052Samw * es_username name of the user requesting the shares list which 135*7052Samw * is used to detect if the user has any autohome 136*7052Samw * es_bufsize size of the response buffer 137*7052Samw * es_buf pointer to the response buffer 138*7052Samw * es_ntotal total number of shares exported by server which 139*7052Samw * their OEM names is less then 13 chars 140*7052Samw * es_nsent number of shares that can fit in the specified buffer 141*7052Samw * es_datasize actual data size (share's data) which was encoded 142*7052Samw * in the response buffer 143*7052Samw */ 144*7052Samw typedef struct smb_enumshare_info { 145*7052Samw char *es_username; 146*7052Samw uint16_t es_bufsize; 147*7052Samw char *es_buf; 148*7052Samw uint16_t es_ntotal; 149*7052Samw uint16_t es_nsent; 150*7052Samw uint16_t es_datasize; 151*7052Samw } smb_enumshare_info_t; 152*7052Samw 153*7052Samw /* 154*7052Samw * LanMan share API (for both SMB kernel module and GUI/CLI sub-system) 155*7052Samw * 156*7052Samw * NOTE: If any error is encounted by either the door server or client, 157*7052Samw * NERR_InternalError will be returned by most functions, smb_share_count 158*7052Samw * will return -1. 159*7052Samw */ 160*7052Samw 161*7052Samw #ifndef _KERNEL 162*7052Samw 163*7052Samw /* 164*7052Samw * CIFS share management functions in libmlsvc 165*7052Samw */ 166*7052Samw int smb_shr_start(void); 167*7052Samw void smb_shr_stop(void); 168*7052Samw void smb_shr_iterinit(smb_shriter_t *, uint32_t); 169*7052Samw smb_share_t *smb_shr_iterate(smb_shriter_t *iterator); 170*7052Samw void smb_shr_list(int offset, smb_shrlist_t *list); 171*7052Samw int smb_shr_count(void); 172*7052Samw uint32_t smb_shr_add(smb_share_t *si, int); 173*7052Samw uint32_t smb_shr_del(char *share_name, int); 174*7052Samw uint32_t smb_shr_ren(char *from, char *to, int); 175*7052Samw uint32_t smb_shr_get(char *share_name, smb_share_t *si); 176*7052Samw uint32_t smb_shr_set(smb_share_t *si, int); 177*7052Samw uint32_t smb_shr_get_realpath(const char *srcbuf, char *dstbuf, int maxlen); 178*7052Samw 179*7052Samw int smb_shr_exists(char *share_name); 180*7052Samw int smb_shr_is_special(char *share_name); 181*7052Samw int smb_shr_is_restricted(char *share_name); 182*7052Samw int smb_shr_is_admin(char *share_name); 183*7052Samw int smb_shr_is_valid(char *share_name); 184*7052Samw int smb_shr_is_dir(char *path); 185*7052Samw uint32_t smb_shr_add_adminshare(char *volname, unsigned char drive); 186*7052Samw 187*7052Samw sa_group_t smb_get_smb_share_group(sa_handle_t); 188*7052Samw void smb_build_lmshare_info(char *, char *, sa_resource_t, smb_share_t *); 189*7052Samw 190*7052Samw /* 191*7052Samw * CIFS share management API exported for other processes 192*7052Samw */ 193*7052Samw uint32_t smb_share_list(int offset, smb_shrlist_t *list); 194*7052Samw int smb_share_count(void); 195*7052Samw uint32_t smb_share_get(char *, smb_share_t *); 196*7052Samw uint32_t smb_share_del(char *); 197*7052Samw uint32_t smb_share_ren(char *, char *); 198*7052Samw uint32_t smb_share_add(smb_share_t *); 199*7052Samw uint32_t smb_share_set(smb_share_t *); 200*7052Samw 201*7052Samw #else 202*7052Samw 203*7052Samw door_handle_t smb_kshare_init(int); 204*7052Samw void smb_kshare_fini(door_handle_t); 205*7052Samw uint32_t smb_kshare_getinfo(door_handle_t, char *, smb_share_t *); 206*7052Samw int smb_kshare_upcall(door_handle_t, void *, boolean_t); 207*7052Samw uint32_t smb_kshare_enum(door_handle_t, smb_enumshare_info_t *); 208*7052Samw 209*7052Samw #endif 210*7052Samw 211*7052Samw #define SMB_SHARE_DNAME "/var/run/smb_lmshare_door" 212*7052Samw #define SMB_SHARE_DSIZE (65 * 1024) 213*7052Samw 214*7052Samw /* 215*7052Samw * Door interface 216*7052Samw * 217*7052Samw * Define door operations 218*7052Samw */ 219*7052Samw #define SMB_SHROP_NUM_SHARES 1 220*7052Samw #define SMB_SHROP_DELETE 2 221*7052Samw #define SMB_SHROP_RENAME 3 222*7052Samw #define SMB_SHROP_GETINFO 4 223*7052Samw #define SMB_SHROP_ADD 5 224*7052Samw #define SMB_SHROP_SETINFO 6 225*7052Samw #define SMB_SHROP_LIST 7 226*7052Samw #define SMB_SHROP_ENUM 8 227*7052Samw 228*7052Samw /* 229*7052Samw * Door server status 230*7052Samw * 231*7052Samw * SMB_SHARE_DERROR is returned by the door server if there is problem 232*7052Samw * with marshalling/unmarshalling. Otherwise, SMB_SHARE_DSUCCESS is 233*7052Samw * returned. 234*7052Samw * 235*7052Samw */ 236*7052Samw #define SMB_SHARE_DSUCCESS 0 237*7052Samw #define SMB_SHARE_DERROR -1 238*7052Samw 239*7052Samw void smb_dr_get_share(smb_dr_ctx_t *, smb_share_t *); 240*7052Samw void smb_dr_put_share(smb_dr_ctx_t *, smb_share_t *); 241*7052Samw 242*7052Samw void smb_dr_get_shrlist(smb_dr_ctx_t *, smb_shrlist_t *); 243*7052Samw void smb_dr_put_shrlist(smb_dr_ctx_t *, smb_shrlist_t *); 244*7052Samw 245*7052Samw void smb_share_dclose(void); 246*7052Samw 247*7052Samw #ifdef __cplusplus 248*7052Samw } 249*7052Samw #endif 250*7052Samw 251*7052Samw #endif /* _SMB_SHARE_H */ 252