1 /*
   2  * Copyright (c) 2000-2001, Boris Popov
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  * 1. Redistributions of source code must retain the above copyright
   9  *    notice, this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  * 3. All advertising materials mentioning features or use of this software
  14  *    must display the following acknowledgement:
  15  *    This product includes software developed by Boris Popov.
  16  * 4. Neither the name of the author nor the names of any co-contributors
  17  *    may be used to endorse or promote products derived from this software
  18  *    without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30  * SUCH DAMAGE.
  31  *
  32  * $Id: smbfs_subr.h,v 1.25 2005/03/17 01:23:40 lindak Exp $
  33  */
  34 
  35 /*
  36  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  37  * Use is subject to license terms.
  38  *
  39  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  40  */
  41 
  42 #ifndef _FS_SMBFS_SMBFS_SUBR_H_
  43 #define _FS_SMBFS_SMBFS_SUBR_H_
  44 
  45 #include <sys/cmn_err.h>
  46 #include <netsmb/mchain.h>
  47 #include <netsmb/smb_subr.h>
  48 #include <smbfs/smbfs_node.h>
  49 
  50 #if defined(DEBUG) || defined(lint)
  51 #define SMB_VNODE_DEBUG 1
  52 #endif
  53 
  54 #ifndef FALSE
  55 #define FALSE   (0)
  56 #endif
  57 
  58 #ifndef TRUE
  59 #define TRUE    (1)
  60 #endif
  61 
  62 /*
  63  * Let's use C99 standard variadic macros!
  64  * Also the C99 __func__ (function name) feature.
  65  */
  66 #define SMBFSERR(...) \
  67         smb_errmsg(CE_NOTE, __func__, __VA_ARGS__)
  68 #define SMBVDEBUG(...) \
  69         smb_errmsg(CE_CONT, __func__, __VA_ARGS__)
  70 
  71 /*
  72  * Possible lock commands
  73  */
  74 #define SMB_LOCK_EXCL           0
  75 #define SMB_LOCK_SHARED         1
  76 #define SMB_LOCK_RELEASE        2
  77 
  78 struct smb_cred;
  79 struct smb_vc;
  80 struct statvfs;
  81 struct timespec;
  82 
  83 /*
  84  * Types of find_first, find_next context objects
  85  */
  86 typedef enum {
  87         ft_LM1 = 1,
  88         ft_LM2,
  89         ft_SMB2,
  90         ft_XA
  91 } smbfs_fctx_type_t;
  92 
  93 /*
  94  * Context to perform findfirst/findnext/findclose operations
  95  */
  96 #define SMBFS_RDD_FINDFIRST     0x01
  97 #define SMBFS_RDD_EOF           0x02
  98 #define SMBFS_RDD_FINDSINGLE    0x04
  99 /* note SMBFS_RDD_USESEARCH     0x08 replaced by smbfs_fctx_type */
 100 #define SMBFS_RDD_NOCLOSE       0x10
 101 
 102 /*
 103  * Search context supplied by server
 104  */
 105 #define SMB_SKEYLEN             21                      /* search context */
 106 #define SMB_DENTRYLEN           (SMB_SKEYLEN + 22)      /* entire entry */
 107 
 108 struct smbfs_fctx {
 109         /*
 110          * Setable values
 111          */
 112         smbfs_fctx_type_t       f_type;
 113         int             f_flags;        /* SMBFS_RDD_ */
 114         /*
 115          * Return values
 116          */
 117         struct smbfattr f_attr;         /* current attributes */
 118         u_longlong_t    f_inum;         /* current I number */
 119         char            *f_name;        /* current file name */
 120         int             f_nmlen;        /* name len */
 121         int             f_namesz;       /* memory allocated */
 122         /*
 123          * Internal variables
 124          */
 125         uint16_t        f_infolevel;
 126         uint16_t        f_limit;        /* maximum number of entries */
 127         uint32_t        f_attrmask;     /* SMB_FA_ */
 128         int             f_wclen;
 129         const char      *f_wildcard;
 130         struct smbnode  *f_dnp;
 131         struct smb_cred *f_scred;
 132         struct smb_share        *f_ssp;
 133         struct smb_fh   *f_fhp;
 134         union {
 135                 struct smb_rq *uf_rq;
 136                 struct smb_t2rq *uf_t2;
 137         } f_urq;        // XXX remove and use...
 138         struct mdchain  f_mdchain;
 139         int             f_left;         /* entries left */
 140         int             f_ecnt;         /* entries left in current response */
 141         int             f_eofs;         /* entry offset in data block */
 142         uchar_t         f_skey[SMB_SKEYLEN]; /* server side search context */
 143         uchar_t         f_fname[8 + 1 + 3 + 1]; /* for 8.3 filenames */
 144         uint16_t        f_Sid;          /* Search handle (like a FID) */
 145         int             f_rnamelen;
 146         char            *f_rname;       /* resume name */
 147         int             f_rnameofs;
 148         int             f_otws;         /* # over-the-wire ops so far */
 149         char            *f_firstnm;     /* first filename we got back */
 150         int             f_firstnmlen;
 151         uint32_t        f_rkey;         /* resume key */
 152 };
 153 typedef struct smbfs_fctx smbfs_fctx_t;
 154 
 155 #define f_rq    f_urq.uf_rq
 156 #define f_t2    f_urq.uf_t2
 157 
 158 /*
 159  * Internal form of FileFsFullSizeInformation
 160  * [MS-FSCC] 2.5.4 FileFsFullSizeInformation
 161  * for the _statfs functions.
 162  */
 163 struct smb_fs_size_info {
 164         uint64_t total_units;
 165         uint64_t caller_avail;
 166         uint64_t actual_avail;
 167         uint32_t sect_per_unit;
 168         uint32_t bytes_per_sect;
 169 };
 170 
 171 /*
 172  * smb common functions (smbfs_smbx.c)
 173  */
 174 int  smbfs_smb_lock(struct smbnode *np, int op, caddr_t id,
 175         offset_t start, uint64_t len,   int largelock,
 176         struct smb_cred *scrp, uint32_t timeout);
 177 int  smbfs_smb_getfattr(struct smbnode *np, smb_fh_t *fhp,
 178         struct smbfattr *fap, struct smb_cred *scrp);
 179 int  smbfs_smb_getpattr(struct smbnode *np, struct smbfattr *fap,
 180         struct smb_cred *scrp);
 181 int  smbfs_smb_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 182         struct smb_cred *scrp);
 183 int  smbfs_smb_statfs(struct smb_share *ssp, statvfs64_t *sbp,
 184         struct smb_cred *scrp);
 185 int  smbfs_smb_setdisp(struct smb_share *ssp, smb_fh_t *fid, uint8_t newdisp,
 186         struct smb_cred *scrp);
 187 int  smbfs_smb_setfsize(struct smb_share *ssp, smb_fh_t *fid, uint64_t newsize,
 188         struct smb_cred *scrp);
 189 int  smbfs_smb_setfattr(struct smb_share *ssp, smb_fh_t *fid,
 190         uint32_t attr, struct timespec *mtime, struct timespec *atime,
 191         struct smb_cred *scrp);
 192 int  smbfs_smb_flush(struct smb_share *ssp, smb_fh_t *fid,
 193         struct smb_cred *scrp);
 194 
 195 int smbfs_smb_ntcreatex(
 196         struct smbnode *np, const char *name, int nmlen, int xattr,
 197         uint32_t req_acc, uint32_t efa, uint32_t share_acc,
 198         uint32_t disp, uint32_t createopt, struct smb_cred *scrp,
 199         smb_fh_t *fhpp, uint32_t *cr_act_p, struct smbfattr *fap);
 200 
 201 int  smbfs_smb_tmpopen(struct smbnode *np, uint32_t rights,
 202         struct smb_cred *scrp, smb_fh_t **fidpp);
 203 void smbfs_smb_tmpclose(struct smbnode *ssp, smb_fh_t *fid);
 204 int  smbfs_smb_open(struct smbnode *np, const char *name, int nmlen,
 205         int xattr, uint32_t rights, struct smb_cred *scrp,
 206         smb_fh_t **fidpp, struct smbfattr *fap);
 207 void smbfs_smb_close(smb_fh_t *fid);
 208 int  smbfs_smb_create(struct smbnode *dnp, const char *name, int nmlen,
 209         int xattr, uint32_t disp, struct smb_cred *scrp, smb_fh_t **fidpp);
 210 int  smbfs_smb_rename(struct smbnode *sdnp, struct smbnode *src,
 211         struct smbnode *tdnp, const char *tname, int tnmlen,
 212         smb_fh_t *fid, struct smb_cred *scrp);
 213 int  smbfs_smb_mkdir(struct smbnode *dnp, const char *name, int len,
 214         struct smb_cred *scrp);
 215 
 216 int  smbfs_smb_findopen(struct smbnode *dnp, const char *wildcard, int wclen,
 217         int attr, struct smb_cred *scrp, struct smbfs_fctx **ctxpp);
 218 int  smbfs_smb_findnext(struct smbfs_fctx *ctx, int limit,
 219         struct smb_cred *scrp);
 220 int  smbfs_smb_findclose(struct smbfs_fctx *ctx, struct smb_cred *scrp);
 221 
 222 int  smbfs_smb_lookup(struct smbnode *dnp, const char **namep, int *nmlenp,
 223         struct smbfattr *fap, struct smb_cred *scrp);
 224 
 225 /* get/set security descriptor */
 226 int  smbfs_smb_getsec(struct smb_share *ssp, smb_fh_t *fid,
 227         uint32_t selector, mblk_t **res, uint32_t *reslen,
 228         struct smb_cred *scrp);
 229 int  smbfs_smb_setsec(struct smb_share *ssp, smb_fh_t *fid,
 230         uint32_t selector, mblk_t **mp, struct smb_cred *scrp);
 231 
 232 /*
 233  * SMB1 functions
 234  */
 235 int smbfs_smb1_trans2_query(struct smbnode *np, uint16_t fid,
 236         struct smbfattr *fap, struct smb_cred *scrp);
 237 int smbfs_smb1_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 238         struct smb_cred *scrp);
 239 int smbfs_smb1_statfs(struct smb_share *ssp,
 240         struct smb_fs_size_info *info, struct smb_cred *scrp);
 241 int smbfs_smb1_seteof(struct smb_share *ssp, uint16_t fid, uint64_t newsize,
 242         struct smb_cred *scrp);
 243 int smbfs_smb1_setdisp(struct smb_share *ssp, uint16_t fid, uint8_t newdisp,
 244         struct smb_cred *scrp);
 245 int smbfs_smb1_setfattr(struct smb_share *ssp, uint16_t fid,
 246         struct mbchain *, struct smb_cred *);
 247 int smbfs_smb1_flush(struct smb_share *ssp, uint16_t fid,
 248         struct smb_cred *scrp);
 249 int smbfs_smb1_t2rename(struct smbnode *np, const char *tname, int tnmlen,
 250         uint16_t fid, struct smb_cred *scrp);
 251 int smbfs_smb1_oldrename(struct smbnode *src, struct smbnode *tdnp,
 252         const char *tname, int tnmlen, struct smb_cred *scrp);
 253 
 254 int smbfs_smb_findopenLM2(struct smbfs_fctx *ctx, struct smbnode *dnp,
 255     const char *wildcard, int wclen, uint32_t attr);
 256 int smbfs_smb_findnextLM2(struct smbfs_fctx *ctx, uint16_t limit);
 257 int smbfs_smb_findcloseLM2(struct smbfs_fctx *ctx);
 258 int smbfs_smb1_get_streaminfo(smbnode_t *np, struct mdchain *mdp,
 259         struct smb_cred *scrp);
 260 
 261 int smbfs_smb1_getsec(struct smb_share *ssp, uint16_t fid,
 262         uint32_t selector, mblk_t **res, uint32_t *reslen,
 263         struct smb_cred *scrp);
 264 int smbfs_smb1_setsec(struct smb_share *ssp, uint16_t fid,
 265         uint32_t selector, mblk_t **mp,
 266         struct smb_cred *scrp);
 267 
 268 /*
 269  * SMB2 functions
 270  */
 271 
 272 int smbfs_smb2_getpattr(struct smbnode *np, struct smbfattr *fap,
 273         struct smb_cred *scrp);
 274 int smbfs_smb2_qfileinfo(struct smb_share *ssp, smb2fid_t *fid,
 275         struct smbfattr *fap, struct smb_cred *scrp);
 276 int smbfs_smb2_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 277         struct smb_cred *scrp);
 278 int smbfs_smb2_statfs(struct smb_share *ssp,
 279         struct smb_fs_size_info *info, struct smb_cred *scrp);
 280 int smbfs_smb2_seteof(struct smb_share *ssp, smb2fid_t *fid, uint64_t newsize,
 281         struct smb_cred *scrp);
 282 int smbfs_smb2_setdisp(struct smb_share *ssp, smb2fid_t *fid, uint8_t newdisp,
 283         struct smb_cred *scrp);
 284 int smbfs_smb2_flush(struct smb_share *ssp, smb2fid_t *fid,
 285         struct smb_cred *scrp);
 286 int smbfs_smb2_setfattr(struct smb_share *ssp, smb2fid_t *fid,
 287         struct mbchain *, struct smb_cred *);
 288 int smbfs_smb2_rename(struct smbnode *np, struct smbnode *tdnp,
 289         const char *tname, int tnlen, int overwrite,
 290         smb2fid_t *fid, struct smb_cred *scrp);
 291 
 292 int smbfs_smb2_findopen(struct smbfs_fctx *ctx, struct smbnode *dnp,
 293     const char *wildcard, int wclen, uint32_t attr);
 294 int smbfs_smb2_findnext(struct smbfs_fctx *ctx, uint16_t limit);
 295 int smbfs_smb2_findclose(struct smbfs_fctx *ctx);
 296 int smbfs_smb2_get_streaminfo(smbnode_t *np, struct mdchain *mdp,
 297         struct smb_cred *scrp);
 298 
 299 int smbfs_smb2_getsec(struct smb_share *ssp, smb2fid_t *fid,
 300         uint32_t selector, mblk_t **res, uint32_t *reslen,
 301         struct smb_cred *scrp);
 302 int smbfs_smb2_setsec(struct smb_share *ssp, smb2fid_t *fid,
 303         uint32_t selector, mblk_t **mp,
 304         struct smb_cred *scrp);
 305 
 306 
 307 /* smbfs_subr.c */
 308 
 309 int  smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp,
 310         struct smbnode *dnp, const char *name, int nmlen, uint8_t sep);
 311 int smbfs_decode_dirent(struct smbfs_fctx *ctx);
 312 int smbfs_decode_file_all_info(struct smb_share *ssp,
 313         struct mdchain *mdp, struct smbfattr *fap);
 314 int smbfs_decode_fs_attr_info(struct smb_share *ssp,
 315         struct mdchain *mdp, struct smb_fs_attr_info *fsa);
 316 
 317 /*
 318  * VFS-level init, fini stuff
 319  */
 320 
 321 int smbfs_vfsinit(void);
 322 void smbfs_vfsfini(void);
 323 int smbfs_subrinit(void);
 324 void smbfs_subrfini(void);
 325 int smbfs_clntinit(void);
 326 void smbfs_clntfini(void);
 327 
 328 void smbfs_zonelist_add(smbmntinfo_t *smi);
 329 void smbfs_zonelist_remove(smbmntinfo_t *smi);
 330 
 331 int smbfs_check_table(struct vfs *vfsp, struct smbnode *srp);
 332 void smbfs_destroy_table(struct vfs *vfsp);
 333 void smbfs_rflush(struct vfs *vfsp, cred_t *cr);
 334 void smbfs_flushall(cred_t *cr);
 335 
 336 int smbfs_directio(vnode_t *vp, int cmd, cred_t *cr);
 337 
 338 uint32_t smbfs_newnum(void);
 339 int smbfs_newname(char *buf, size_t buflen);
 340 
 341 /*
 342  * Function definitions - those having to do with
 343  * smbfs nodes, vnodes, etc
 344  */
 345 
 346 void smbfs_attrcache_prune(struct smbnode *np);
 347 void smbfs_attrcache_remove(struct smbnode *np);
 348 void smbfs_attrcache_rm_locked(struct smbnode *np);
 349 #ifndef DEBUG
 350 #define smbfs_attrcache_rm_locked(np)   (np)->r_attrtime = gethrtime()
 351 #endif
 352 void smbfs_attr_touchdir(struct smbnode *dnp);
 353 void smbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap);
 354 
 355 int smbfs_validate_caches(struct vnode *vp, cred_t *cr);
 356 void smbfs_purge_caches(struct vnode *vp, cred_t *cr);
 357 
 358 void smbfs_addfree(struct smbnode *sp);
 359 void smbfs_rmhash(struct smbnode *);
 360 
 361 /* See avl_create in smbfs_vfsops.c */
 362 void smbfs_init_hash_avl(avl_tree_t *);
 363 
 364 uint32_t smbfs_gethash(const char *rpath, int prlen);
 365 uint32_t smbfs_getino(struct smbnode *dnp, const char *name, int nmlen);
 366 
 367 extern struct smbfattr smbfs_fattr0;
 368 smbnode_t *smbfs_node_findcreate(smbmntinfo_t *mi,
 369     const char *dir, int dirlen,
 370     const char *name, int nmlen,
 371     char sep, struct smbfattr *fap);
 372 
 373 int smbfs_nget(vnode_t *dvp, const char *name, int nmlen,
 374         struct smbfattr *fap, vnode_t **vpp);
 375 
 376 void smbfs_fname_tolocal(struct smbfs_fctx *ctx);
 377 char    *smbfs_name_alloc(const char *name, int nmlen);
 378 void    smbfs_name_free(const char *name, int nmlen);
 379 
 380 int smbfs_readvnode(vnode_t *, uio_t *, cred_t *, struct vattr *);
 381 int smbfs_writevnode(vnode_t *vp, uio_t *uiop, cred_t *cr,
 382                         int ioflag, int timo);
 383 int smbfsgetattr(vnode_t *vp, struct vattr *vap, cred_t *cr);
 384 
 385 void smbfs_invalidate_pages(vnode_t *vp, u_offset_t off, cred_t *cr);
 386 
 387 /* smbfs ACL support */
 388 int smbfs_acl_getids(vnode_t *, cred_t *);
 389 int smbfs_acl_setids(vnode_t *, vattr_t *, cred_t *);
 390 int smbfs_acl_getvsa(vnode_t *, vsecattr_t *, int, cred_t *);
 391 int smbfs_acl_setvsa(vnode_t *, vsecattr_t *, int, cred_t *);
 392 int smbfs_acl_iocget(vnode_t *, intptr_t, int, cred_t *);
 393 int smbfs_acl_iocset(vnode_t *, intptr_t, int, cred_t *);
 394 
 395 /* smbfs_xattr.c */
 396 int smbfs_get_xattrdir(vnode_t *dvp, vnode_t **vpp, cred_t *cr, int);
 397 int smbfs_xa_parent(vnode_t *vp, vnode_t **vpp);
 398 int smbfs_xa_exists(vnode_t *vp, cred_t *cr);
 399 int smbfs_xa_getfattr(struct smbnode *np, struct smbfattr *fap,
 400         struct smb_cred *scrp);
 401 int smbfs_xa_findopen(struct smbfs_fctx *ctx, struct smbnode *dnp,
 402         const char *name, int nmlen);
 403 int smbfs_xa_findnext(struct smbfs_fctx *ctx, uint16_t limit);
 404 int smbfs_xa_findclose(struct smbfs_fctx *ctx);
 405 
 406 /* For Solaris, interruptible rwlock */
 407 int smbfs_rw_enter_sig(smbfs_rwlock_t *l, krw_t rw, int intr);
 408 int smbfs_rw_tryenter(smbfs_rwlock_t *l, krw_t rw);
 409 void smbfs_rw_exit(smbfs_rwlock_t *l);
 410 int smbfs_rw_lock_held(smbfs_rwlock_t *l, krw_t rw);
 411 void smbfs_rw_init(smbfs_rwlock_t *l, char *name, krw_type_t type, void *arg);
 412 void smbfs_rw_destroy(smbfs_rwlock_t *l);
 413 
 414 #endif /* !_FS_SMBFS_SMBFS_SUBR_H_ */