14bff34e3Sthurlow /* 24bff34e3Sthurlow * Copyright (c) 2000-2001, Boris Popov 34bff34e3Sthurlow * All rights reserved. 44bff34e3Sthurlow * 54bff34e3Sthurlow * Redistribution and use in source and binary forms, with or without 64bff34e3Sthurlow * modification, are permitted provided that the following conditions 74bff34e3Sthurlow * are met: 84bff34e3Sthurlow * 1. Redistributions of source code must retain the above copyright 94bff34e3Sthurlow * notice, this list of conditions and the following disclaimer. 104bff34e3Sthurlow * 2. Redistributions in binary form must reproduce the above copyright 114bff34e3Sthurlow * notice, this list of conditions and the following disclaimer in the 124bff34e3Sthurlow * documentation and/or other materials provided with the distribution. 134bff34e3Sthurlow * 3. All advertising materials mentioning features or use of this software 144bff34e3Sthurlow * must display the following acknowledgement: 154bff34e3Sthurlow * This product includes software developed by Boris Popov. 164bff34e3Sthurlow * 4. Neither the name of the author nor the names of any co-contributors 174bff34e3Sthurlow * may be used to endorse or promote products derived from this software 184bff34e3Sthurlow * without specific prior written permission. 194bff34e3Sthurlow * 204bff34e3Sthurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 214bff34e3Sthurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 224bff34e3Sthurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 234bff34e3Sthurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 244bff34e3Sthurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 254bff34e3Sthurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 264bff34e3Sthurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 274bff34e3Sthurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 284bff34e3Sthurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 294bff34e3Sthurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 304bff34e3Sthurlow * SUCH DAMAGE. 314bff34e3Sthurlow * 324bff34e3Sthurlow * $Id: smb_subr.h,v 1.13 2004/09/14 22:59:08 lindak Exp $ 334bff34e3Sthurlow */ 344bff34e3Sthurlow 354bff34e3Sthurlow /* 36148c5f43SAlan Wright * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 3740c0e231SGordon Ross * Copyright 2018 Nexenta Systems, Inc. All rights reserved. 384bff34e3Sthurlow */ 394bff34e3Sthurlow 404bff34e3Sthurlow #ifndef _NETSMB_SMB_SUBR_H_ 414bff34e3Sthurlow #define _NETSMB_SMB_SUBR_H_ 424bff34e3Sthurlow 434bff34e3Sthurlow #include <sys/cmn_err.h> 444bff34e3Sthurlow #include <sys/lock.h> 454bff34e3Sthurlow #include <sys/note.h> 46*adee6784SGordon Ross #include <netsmb/mchain.h> 47430b4c46SGordon Ross #include <netsmb/smb_conn.h> 484bff34e3Sthurlow 49*adee6784SGordon Ross /* 50*adee6784SGordon Ross * Possible lock commands 51*adee6784SGordon Ross */ 52*adee6784SGordon Ross #define SMB_LOCK_EXCL 0 53*adee6784SGordon Ross #define SMB_LOCK_SHARED 1 54*adee6784SGordon Ross #define SMB_LOCK_RELEASE 2 55*adee6784SGordon Ross 5633697085SGordon Ross struct msgb; /* avoiding sys/stream.h here */ 5733697085SGordon Ross 584bff34e3Sthurlow /* Helper function for SMBERROR */ 594bff34e3Sthurlow /*PRINTFLIKE3*/ 604bff34e3Sthurlow extern void smb_errmsg(int, const char *, const char *, ...) 614bff34e3Sthurlow __KPRINTFLIKE(3); 6233697085SGordon Ross void m_dumpm(struct msgb *); 634bff34e3Sthurlow 644bff34e3Sthurlow /* 654bff34e3Sthurlow * Let's use C99 standard variadic macros! 664bff34e3Sthurlow * Also the C99 __func__ (function name) feature. 674bff34e3Sthurlow */ 684bff34e3Sthurlow #define SMBERROR(...) \ 694bff34e3Sthurlow smb_errmsg(CE_NOTE, __func__, __VA_ARGS__) 704bff34e3Sthurlow #define SMBPANIC(...) \ 714bff34e3Sthurlow smb_errmsg(CE_PANIC, __func__, __VA_ARGS__) 724bff34e3Sthurlow #define SMBSDEBUG(...) \ 734bff34e3Sthurlow smb_errmsg(CE_CONT, __func__, __VA_ARGS__) 744bff34e3Sthurlow #define SMBIODEBUG(...) \ 754bff34e3Sthurlow smb_errmsg(CE_CONT, __func__, __VA_ARGS__) 764bff34e3Sthurlow #define NBDEBUG(...) \ 774bff34e3Sthurlow smb_errmsg(CE_CONT, __func__, __VA_ARGS__) 784bff34e3Sthurlow 794bff34e3Sthurlow #if defined(DEBUG) || defined(lint) 804bff34e3Sthurlow 814bff34e3Sthurlow #define DEBUG_ENTER(str) debug_enter(str) 824bff34e3Sthurlow 834bff34e3Sthurlow #else /* DEBUG or lint */ 844bff34e3Sthurlow 854bff34e3Sthurlow #define DEBUG_ENTER(str) ((void)0) 864bff34e3Sthurlow 874bff34e3Sthurlow #endif /* DEBUG or lint */ 884bff34e3Sthurlow 894bff34e3Sthurlow typedef uint16_t smb_unichar; 904bff34e3Sthurlow typedef smb_unichar *smb_uniptr; 914bff34e3Sthurlow 924bff34e3Sthurlow extern smb_unichar smb_unieol; 934bff34e3Sthurlow 944bff34e3Sthurlow struct mbchain; 954bff34e3Sthurlow struct smb_rq; 964bff34e3Sthurlow struct smb_vc; 974bff34e3Sthurlow 98430b4c46SGordon Ross /* 99430b4c46SGordon Ross * These are the attributes we can get from the server via 100430b4c46SGordon Ross * SMB commands such as TRANS2_QUERY_FILE_INFORMATION 101430b4c46SGordon Ross * with info level SMB_QFILEINFO_ALL_INFO, and directory 102430b4c46SGordon Ross * FindFirst/FindNext info. levels FIND_DIRECTORY_INFO 103430b4c46SGordon Ross * and FIND_BOTH_DIRECTORY_INFO, etc. 104430b4c46SGordon Ross * 105430b4c46SGordon Ross * Values in this struct are always native endian, 106430b4c46SGordon Ross * and times are converted converted to Unix form. 107430b4c46SGordon Ross * Note: zero in any of the times means "unknown". 108430b4c46SGordon Ross */ 109430b4c46SGordon Ross typedef struct smbfattr { 110430b4c46SGordon Ross timespec_t fa_createtime; /* Note, != ctime */ 111430b4c46SGordon Ross timespec_t fa_atime; /* these 3 are like unix */ 112430b4c46SGordon Ross timespec_t fa_mtime; 113430b4c46SGordon Ross timespec_t fa_ctime; 114430b4c46SGordon Ross u_offset_t fa_size; /* EOF position */ 115430b4c46SGordon Ross u_offset_t fa_allocsz; /* Allocated size. */ 116430b4c46SGordon Ross uint32_t fa_attr; /* Ext. file (DOS) attr */ 117430b4c46SGordon Ross } smbfattr_t; 118430b4c46SGordon Ross 1194bff34e3Sthurlow /* 1204bff34e3Sthurlow * Tunable timeout values. See: smb_smb.c 1214bff34e3Sthurlow */ 1224bff34e3Sthurlow extern int smb_timo_notice; 1234bff34e3Sthurlow extern int smb_timo_default; 1244bff34e3Sthurlow extern int smb_timo_open; 1254bff34e3Sthurlow extern int smb_timo_read; 1264bff34e3Sthurlow extern int smb_timo_write; 1274bff34e3Sthurlow extern int smb_timo_append; 12840c0e231SGordon Ross extern dev_t nsmb_dev_tcp; 12940c0e231SGordon Ross extern dev_t nsmb_dev_tcp6; 1304bff34e3Sthurlow 131*adee6784SGordon Ross /* 132*adee6784SGordon Ross * Tunable timeout values. See: smb2_smb.c 133*adee6784SGordon Ross */ 134*adee6784SGordon Ross extern int smb2_timo_notice; 135*adee6784SGordon Ross extern int smb2_timo_default; 136*adee6784SGordon Ross extern int smb2_timo_open; 137*adee6784SGordon Ross extern int smb2_timo_read; 138*adee6784SGordon Ross extern int smb2_timo_write; 139*adee6784SGordon Ross extern int smb2_timo_append; 1404bff34e3Sthurlow 141613a2f6bSGordon Ross void smb_credinit(struct smb_cred *scred, cred_t *cr); 1424bff34e3Sthurlow void smb_credrele(struct smb_cred *scred); 1434bff34e3Sthurlow 1444bff34e3Sthurlow int smb_maperror(int eclass, int eno); 145148c5f43SAlan Wright int smb_maperr32(uint32_t eno); 14640c0e231SGordon Ross uint_t smb_doserr2status(int, int); 147*adee6784SGordon Ross int smb_get_dstring(struct mdchain *mdc, struct smb_vc *vcp, 148*adee6784SGordon Ross char *outbuf, size_t *outlen, int inlen); 1494bff34e3Sthurlow int smb_put_dmem(struct mbchain *mbp, struct smb_vc *vcp, 1504bff34e3Sthurlow const char *src, int len, int caseopt, int *lenp); 1514bff34e3Sthurlow int smb_put_dstring(struct mbchain *mbp, struct smb_vc *vcp, 1524bff34e3Sthurlow const char *src, int caseopt); 1534bff34e3Sthurlow int smb_put_string(struct smb_rq *rqp, const char *src); 1544bff34e3Sthurlow int smb_put_asunistring(struct smb_rq *rqp, const char *src); 155*adee6784SGordon Ross 156*adee6784SGordon Ross int smb_smb_ntcreate(struct smb_share *ssp, struct mbchain *name_mb, 157*adee6784SGordon Ross uint32_t crflag, uint32_t req_acc, uint32_t efa, uint32_t sh_acc, 158*adee6784SGordon Ross uint32_t disp, uint32_t createopt, uint32_t impersonate, 159*adee6784SGordon Ross struct smb_cred *scrp, smb_fh_t *fhp, 160*adee6784SGordon Ross uint32_t *cr_act_p, struct smbfattr *fap); 161*adee6784SGordon Ross 162*adee6784SGordon Ross int smb_smb_close(struct smb_share *ssp, smb_fh_t *fhp, 163*adee6784SGordon Ross struct smb_cred *scrp); 164*adee6784SGordon Ross 165*adee6784SGordon Ross int smb_rwuio(smb_fh_t *fhp, uio_rw_t rw, 166*adee6784SGordon Ross uio_t *uiop, smb_cred_t *scred, int timo); 1674bff34e3Sthurlow 1684bff34e3Sthurlow int smb_cmp_sockaddr(struct sockaddr *, struct sockaddr *); 1694bff34e3Sthurlow struct sockaddr *smb_dup_sockaddr(struct sockaddr *sa); 1704bff34e3Sthurlow void smb_free_sockaddr(struct sockaddr *sa); 1714bff34e3Sthurlow 17240c0e231SGordon Ross int smb_sign_init(struct smb_vc *); 17302d09e03SGordon Ross void smb_rq_sign(struct smb_rq *); 1749c9af259SGordon Ross int smb_rq_verify(struct smb_rq *); 1759c9af259SGordon Ross int smb_calcv2mackey(struct smb_vc *, const uchar_t *, 1769c9af259SGordon Ross const uchar_t *, size_t); 1779c9af259SGordon Ross int smb_calcmackey(struct smb_vc *, const uchar_t *, 1789c9af259SGordon Ross const uchar_t *, size_t); 1799c9af259SGordon Ross 180*adee6784SGordon Ross int smb2_sign_init(struct smb_vc *); 181*adee6784SGordon Ross void smb2_rq_sign(struct smb_rq *); 182*adee6784SGordon Ross int smb2_rq_verify(struct smb_rq *); 183430b4c46SGordon Ross 184430b4c46SGordon Ross /* 185430b4c46SGordon Ross * SMB protocol level functions 186430b4c46SGordon Ross */ 18740c0e231SGordon Ross int smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred); 18840c0e231SGordon Ross int smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred); 189*adee6784SGordon Ross int smb_smb_logoff(struct smb_vc *vcp, struct smb_cred *scred); 190430b4c46SGordon Ross int smb_smb_echo(smb_vc_t *vcp, smb_cred_t *scred, int timo); 191430b4c46SGordon Ross int smb_smb_treeconnect(smb_share_t *ssp, smb_cred_t *scred); 192430b4c46SGordon Ross int smb_smb_treedisconnect(smb_share_t *ssp, smb_cred_t *scred); 193430b4c46SGordon Ross 194*adee6784SGordon Ross int smb1_smb_ntcreate(struct smb_share *ssp, struct mbchain *name_mb, 195430b4c46SGordon Ross uint32_t crflag, uint32_t req_acc, uint32_t efa, uint32_t sh_acc, 196430b4c46SGordon Ross uint32_t disp, uint32_t createopt, uint32_t impersonate, 197430b4c46SGordon Ross struct smb_cred *scrp, uint16_t *fidp, 198430b4c46SGordon Ross uint32_t *cr_act_p, struct smbfattr *fap); 199430b4c46SGordon Ross 200*adee6784SGordon Ross int smb1_smb_close(struct smb_share *ssp, uint16_t fid, 201430b4c46SGordon Ross struct timespec *mtime, struct smb_cred *scrp); 202430b4c46SGordon Ross 203*adee6784SGordon Ross int smb_smb_open_prjob(struct smb_share *ssp, char *title, 204430b4c46SGordon Ross uint16_t setuplen, uint16_t mode, 205430b4c46SGordon Ross struct smb_cred *scrp, uint16_t *fidp); 206430b4c46SGordon Ross 207430b4c46SGordon Ross int smb_smb_close_prjob(struct smb_share *ssp, uint16_t fid, 208430b4c46SGordon Ross struct smb_cred *scrp); 209430b4c46SGordon Ross 210*adee6784SGordon Ross int smb_smb_readx(smb_fh_t *fhp, uint32_t *lenp, 211*adee6784SGordon Ross uio_t *uiop, smb_cred_t *scred, int timo); 212*adee6784SGordon Ross int smb_smb_writex(smb_fh_t *fhp, uint32_t *lenp, 213430b4c46SGordon Ross uio_t *uiop, smb_cred_t *scred, int timo); 214430b4c46SGordon Ross 215430b4c46SGordon Ross /* 216*adee6784SGordon Ross * SMB2 protocol level functions 217430b4c46SGordon Ross */ 218*adee6784SGordon Ross int smb2_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred); 219*adee6784SGordon Ross int smb2_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred); 220*adee6784SGordon Ross int smb2_smb_logoff(struct smb_vc *vcp, struct smb_cred *scred); 221*adee6784SGordon Ross int smb2_smb_echo(smb_vc_t *vcp, smb_cred_t *scred, int timo); 222*adee6784SGordon Ross int smb2_smb_treeconnect(smb_share_t *ssp, smb_cred_t *scred); 223*adee6784SGordon Ross int smb2_smb_treedisconnect(smb_share_t *ssp, smb_cred_t *scred); 224*adee6784SGordon Ross 225*adee6784SGordon Ross int 226*adee6784SGordon Ross smb2_smb_ntcreate(struct smb_share *ssp, struct mbchain *name_mb, 227*adee6784SGordon Ross struct mbchain *cctx_in, struct mdchain *cctx_out, 228*adee6784SGordon Ross uint32_t crflag, uint32_t req_acc, uint32_t efa, uint32_t sh_acc, 229*adee6784SGordon Ross uint32_t disp, uint32_t createopt, uint32_t impersonate, 230*adee6784SGordon Ross struct smb_cred *scrp, smb2fid_t *fidp, 231*adee6784SGordon Ross uint32_t *cr_act_p, struct smbfattr *fap); 232*adee6784SGordon Ross 233*adee6784SGordon Ross int smb2_smb_close(struct smb_share *ssp, smb2fid_t *fid, 234*adee6784SGordon Ross struct smb_cred *scrp); 235*adee6784SGordon Ross 236*adee6784SGordon Ross int smb2_smb_ioctl(struct smb_share *ssp, smb2fid_t *fid, 237*adee6784SGordon Ross struct mbchain *data_in, struct mdchain *data_out, 238*adee6784SGordon Ross uint32_t *data_out_sz, /* max / returned */ 239*adee6784SGordon Ross uint32_t ctl_code, struct smb_cred *scrp); 240*adee6784SGordon Ross 241*adee6784SGordon Ross int smb2_smb_read(smb_fh_t *fhp, uint32_t *lenp, 242*adee6784SGordon Ross uio_t *uiop, smb_cred_t *scred, int timo); 243*adee6784SGordon Ross int smb2_smb_write(smb_fh_t *fhp, uint32_t *lenp, 244*adee6784SGordon Ross uio_t *uiop, smb_cred_t *scred, int timo); 245430b4c46SGordon Ross 246*adee6784SGordon Ross /* 247*adee6784SGordon Ross * time conversions 248*adee6784SGordon Ross */ 24902d09e03SGordon Ross 25002d09e03SGordon Ross void smb_time_local2server(struct timespec *tsp, int tzoff, long *seconds); 25102d09e03SGordon Ross void smb_time_server2local(ulong_t seconds, int tzoff, struct timespec *tsp); 25202d09e03SGordon Ross void smb_time_NT2local(uint64_t nsec, struct timespec *tsp); 25302d09e03SGordon Ross void smb_time_local2NT(struct timespec *tsp, uint64_t *nsec); 25402d09e03SGordon Ross 2554bff34e3Sthurlow #endif /* !_NETSMB_SMB_SUBR_H_ */ 256