3694227079
boris popov, first ported to 1.4 branch by Christian Limpach <chris@nice.ch>.
446 lines
14 KiB
C
446 lines
14 KiB
C
/* $NetBSD: smb_conn.h,v 1.1 2000/12/07 03:48:10 deberg Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 2000, Boris Popov
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by Boris Popov.
|
|
* 4. Neither the name of the author nor the names of any co-contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _NETINET_IN_H_
|
|
#include <sys/socket.h>
|
|
#include <net/if.h>
|
|
#include <netinet/in.h>
|
|
#endif
|
|
|
|
/*
|
|
* Three levels of connection hierarchy
|
|
*/
|
|
#define SMBL_CONN 0
|
|
#define SMBL_VC 1
|
|
#define SMBL_SHARE 2
|
|
#define SMBL_NUM 3
|
|
#define SMBL_NONE (-1)
|
|
|
|
/*
|
|
* access modes
|
|
*/
|
|
#define SMBM_READ 0400 /* read conn attrs.(like list shares) */
|
|
#define SMBM_WRITE 0200 /* modify conn attrs */
|
|
#define SMBM_EXEC 0100 /* can send SMB requests */
|
|
#define SMBM_READGRP 0040
|
|
#define SMBM_WRITEGRP 0020
|
|
#define SMBM_EXECGRP 0010
|
|
#define SMBM_READOTH 0004
|
|
#define SMBM_WRITEOTH 0002
|
|
#define SMBM_EXECOTH 0001
|
|
#define SMBM_MASK 0777
|
|
#define SMBM_EXACT 010000 /* check for specified mode exactly */
|
|
#define SMBM_ALL (SMBM_READ | SMBM_WRITE | SMBM_EXEC)
|
|
#define SMBM_DEFAULT (SMBM_READ | SMBM_WRITE | SMBM_EXEC)
|
|
#define SMBM_ANY_OWNER ((uid_t)-1)
|
|
#define SMBM_ANY_GROUP ((gid_t)-1)
|
|
|
|
/*
|
|
* Connection flags
|
|
*/
|
|
#define SMBC_CREATE 0x0100 /* lookup for create opeartion */
|
|
|
|
|
|
/*
|
|
* VC flags
|
|
*/
|
|
#define SMBV_INVALID 0x0001
|
|
#define SMBV_PERMANENT 0x0002
|
|
#define SMBV_LONGNAMES 0x0004 /* connection is configured to use long names */
|
|
#define SMBV_ENCRYPT 0x0008 /* server asked for encrypted password */
|
|
#define SMBV_WIN95 0x0010 /* used to apply bugfixes for this OS */
|
|
#define SMBV_PRIVATE 0x0020 /* connection can be (re)used only by owner */
|
|
#define SMBV_RECONNECTING 0x0040 /* conn is in the process of reconnection */
|
|
#define SMBV_SINGLESHARE 0x0080 /* only one share connectin should be allowed */
|
|
|
|
#define SMBV_LOCK 0x0400
|
|
#define SMBV_WANT 0x0800
|
|
#define SMBV_SNDLOCK 0x1000
|
|
#define SMBV_SNDWANT 0x2000
|
|
#define SMBV_RCVLOCK 0x4000
|
|
#define SMBV_RCVWANT 0x8000
|
|
#define SMBV_MXLOCK 0x010000
|
|
#define SMBV_MXWANT 0x020000
|
|
#define SMBV_RQLISTLOCK 0x040000
|
|
#define SMBV_RQLISTWANT 0x080000
|
|
|
|
/*
|
|
* smb_share flags
|
|
*/
|
|
#define SMBS_PERMANENT 0x0001
|
|
|
|
/*
|
|
* share types
|
|
*/
|
|
#define SMB_ST_DISK 0x0 /* A: */
|
|
#define SMB_ST_PRINTER 0x1 /* LPT: */
|
|
#define SMB_ST_PIPE 0x2 /* IPC */
|
|
#define SMB_ST_COMM 0x3 /* COMM */
|
|
#define SMB_ST_ANY 0x4
|
|
#define SMB_ST_MAX 0x4
|
|
#define SMB_ST_NONE 0xff /* not a part of protocol */
|
|
|
|
/*
|
|
* Negotiated protocol parameters
|
|
*/
|
|
struct smb_sopt {
|
|
int sv_proto;
|
|
int16_t sv_tz; /* offset in min relative to UTC */
|
|
u_int32_t sv_maxtx; /* maximum transmit buf size */
|
|
u_char sv_sm; /* security mode */
|
|
u_int16_t sv_maxmux; /* max number of outstanding rq's */
|
|
u_int16_t sv_maxvcs; /* max number of VCs */
|
|
u_int16_t sv_rawmode;
|
|
u_int32_t sv_maxraw; /* maximum raw-buffer size */
|
|
u_int32_t sv_skey; /* session key */
|
|
u_int32_t sv_caps; /* capabilites SMB_CAP_ */
|
|
};
|
|
|
|
/*
|
|
* Info structures
|
|
*/
|
|
#define SMB_INFO_NONE 0
|
|
#define SMB_INFO_CONN 1
|
|
#define SMB_INFO_VC 2
|
|
#define SMB_INFO_SHARE 3
|
|
|
|
struct smb_conn_info {
|
|
int itype;
|
|
int usecount;
|
|
int flags;
|
|
char srvname[SMB_MAXSRVNAMELEN];
|
|
};
|
|
|
|
struct smb_vc_info {
|
|
int itype;
|
|
int usecount;
|
|
uid_t uid; /* user id of connection */
|
|
gid_t gid; /* group of connection */
|
|
mode_t mode; /* access mode */
|
|
int flags;
|
|
struct smb_sopt sopt;
|
|
char vcname[128];
|
|
};
|
|
|
|
struct smb_share_info {
|
|
int itype;
|
|
int usecount;
|
|
u_short id; /* TID */
|
|
int type; /* share type */
|
|
uid_t uid; /* user id of connection */
|
|
gid_t gid; /* group of connection */
|
|
mode_t mode; /* access mode */
|
|
int flags;
|
|
char sname[128];
|
|
};
|
|
|
|
#ifdef _KERNEL
|
|
|
|
#define CONNADDREQ(a1,a2) ((a1)->sa_len == (a2)->sa_len && \
|
|
bcmp(a1, a2, (a1)->sa_len) == 0)
|
|
|
|
struct smb_vc;
|
|
struct smb_share;
|
|
struct smb_cred;
|
|
struct smb_rq;
|
|
struct mbdata;
|
|
struct smbioc_oshare;
|
|
struct smbioc_ossn;
|
|
struct uio;
|
|
|
|
TAILQ_HEAD(smb_rqhead, smb_rq);
|
|
|
|
/*
|
|
* Node types for connection/share hierarchy
|
|
*/
|
|
#define TSMB_CE TTYPE1 /* list of connections to server */
|
|
#define TSMB_CONN TTYPE2 /* server connection */
|
|
#define TSMB_VC TTYPE3 /* user/VC connection */
|
|
#define TSMB_SHARE TTYPE4 /* share/tree connection */
|
|
|
|
/*
|
|
* smb_ce structure gathers all resources together (connection engine).
|
|
* It is possible to declare members of this structure as separate static
|
|
* variables, _but_ don't do that ! (I have some unimplemented ideas...)
|
|
*/
|
|
typedef struct smb_ce {
|
|
int ce_conncnt; /* number of active conns */
|
|
int ce_nextconn; /* next unique id */
|
|
struct tnode * ce_tnode; /* backlink */
|
|
} *smb_rc_t;
|
|
|
|
#define SMBSO_LOCK 1
|
|
#define SMBSO_UNLOCK 2
|
|
|
|
|
|
#define SMB_DEFRQTIMO 5
|
|
|
|
#define SMB_DIALECT(vcp) ((vcp)->vc_sopt.sv_proto)
|
|
|
|
struct smb_tran_desc;
|
|
|
|
/*
|
|
* smb_conn structure describes physical connection to an SMB server.
|
|
* There will be only one smb_conn structure per each server.
|
|
*/
|
|
struct smb_conn {
|
|
int sc_index; /* unique number of connection */
|
|
u_int sc_flags; /* SMBC_* */
|
|
int sc_vcnext; /* next VC number */
|
|
int sc_vcnt; /* number of active VCs */
|
|
int sc_maxvcs; /* maximum number of VC per connection */
|
|
u_int sc_timo; /* default request timeout */
|
|
struct sockaddr*sc_paddr; /* server addr */
|
|
struct sockaddr*sc_laddr; /* local addr, if any */
|
|
struct tnode * sc_tnode; /* backing object */
|
|
|
|
struct iconv_drv *sc_tolower; /* local charset */
|
|
struct iconv_drv *sc_toupper; /* local charset */
|
|
struct iconv_drv *sc_toserver; /* local charset to server one */
|
|
struct iconv_drv *sc_tolocal; /* server charset to local one */
|
|
};
|
|
|
|
#define sc_srvname sc_tnode->t_name
|
|
|
|
/*
|
|
* Virtual Circuit (session) to a server.
|
|
* This is the most (over)complicated part of SMB protocol.
|
|
* For the user security level (usl), each session with different remote
|
|
* user name has its own VC.
|
|
* It is unclear however, should share security level (ssl) allow additional
|
|
* VCs, because user name is not used and can be the same. On other hand,
|
|
* multiple VCs allows us to create separate sessions to server on a per
|
|
* user basis.
|
|
*/
|
|
struct smb_vc {
|
|
u_short vc_id; /* unique vc id (uid) started from zero */
|
|
int vc_number; /* number of this VC from the client side */
|
|
int vc_flags;
|
|
char * vc_domain; /* workgroup/primary domain */
|
|
char * vc_pass; /* password for usl case */
|
|
uid_t vc_uid; /* user id of connection */
|
|
gid_t vc_grp; /* group of connection */
|
|
mode_t vc_mode; /* access mode */
|
|
struct tnode * vc_tnode; /* backing object */
|
|
|
|
u_char vc_hflags; /* or'ed with flags in the smb header */
|
|
u_short vc_hflags2; /* or'ed with flags in the smb header */
|
|
void * vc_tdata; /* transport control block */
|
|
struct smb_tran_desc *vc_tdesc;
|
|
u_int vc_locks;
|
|
int vc_chlen; /* actual challenge length */
|
|
u_char vc_ch[SMB_MAXCHALLENGELEN];
|
|
u_short vc_mid; /* multiplex id */
|
|
struct smb_sopt vc_sopt; /* server options */
|
|
struct smb_rqhead vc_rqlist; /* list of outstanding requests */
|
|
struct smb_cred *vc_scred; /* used in reconnect procedure */
|
|
int vc_txmax; /* max tx/rx packet size */
|
|
int vc_muxcnt; /* number of active outstanding requests */
|
|
int vc_muxwant;
|
|
};
|
|
|
|
#define vc_user vc_tnode->t_name
|
|
#define vc_maxmux vc_sopt.sv_maxmux
|
|
|
|
|
|
/*
|
|
* smb_share structure describes connection to the given SMB share (tree).
|
|
* Connection to share is always built on top of the VC.
|
|
*/
|
|
struct smb_share {
|
|
u_short ss_id; /* TID */
|
|
int ss_type; /* share type */
|
|
uid_t ss_uid; /* user id of connection */
|
|
gid_t ss_grp; /* group of connection */
|
|
mode_t ss_mode; /* access mode */
|
|
u_int ss_flags;
|
|
char * ss_pass; /* password to a share, can be null */
|
|
struct tnode * ss_tnode; /* backing object */
|
|
};
|
|
|
|
#define ss_name ss_tnode->t_name
|
|
|
|
#define TNTOCE(tp) ((struct smb_ce*)(tp)->t_mdata->tm_data)
|
|
#define CETOTN(ce) ((cep)->ce_tnode)
|
|
#define TNTOCN(tp) ((struct smb_conn*)(tp)->t_mdata->tm_data)
|
|
#define CNTOTN(scp) ((scp)->sc_tnode)
|
|
#define TNTOVC(tp) ((struct smb_vc*)(tp)->t_mdata->tm_data)
|
|
#define VCTOTN(vcp) ((vcp)->vc_tnode)
|
|
#define TNTOSS(tp) ((struct smb_share*)(tp)->t_mdata->tm_data)
|
|
#define SSTOTN(ssp) ((ssp)->ss_tnode)
|
|
|
|
#define VCTOCN(vcp) TNTOCN(VCTOTN((vcp))->t_parent)
|
|
#define SSTOVC(ssp) TNTOVC(SSTOTN(ssp)->t_parent)
|
|
#define SSTOCN(ssp) VCTOCN(TNTOVC(SSTOTN(ssp)->t_parent))
|
|
|
|
struct smb_connspec {
|
|
char * name;
|
|
struct sockaddr*sap;
|
|
struct smb_vcspec*vcspec;
|
|
struct smb_vc * vcp; /* returned */
|
|
/*
|
|
* The rest is an internal data.
|
|
*/
|
|
struct smb_cred * scred;
|
|
};
|
|
|
|
struct smb_vcspec {
|
|
int flags;
|
|
char * user;
|
|
mode_t mode;
|
|
mode_t rights;
|
|
uid_t owner;
|
|
gid_t group;
|
|
struct smb_sharespec *shspec;
|
|
struct smb_share *ssp; /* returned */
|
|
/*
|
|
* The rest is an internal data
|
|
*/
|
|
struct smb_cred *scred;
|
|
};
|
|
|
|
struct smb_sharespec {
|
|
char * name;
|
|
mode_t mode;
|
|
mode_t rights;
|
|
uid_t owner;
|
|
gid_t group;
|
|
int stype;
|
|
/*
|
|
* The rest is an internal data
|
|
*/
|
|
struct smb_cred *scred;
|
|
};
|
|
|
|
/*
|
|
* Session level functions
|
|
*/
|
|
int smb_sm_init(void);
|
|
int smb_sm_done(void);
|
|
int smb_sm_lookup(struct smb_connspec *cnspec, struct smb_vcspec *vcspec,
|
|
struct smb_sharespec *shspec, struct smb_cred *scred,
|
|
struct smb_conn **scpp);
|
|
|
|
/*
|
|
* ce level functions
|
|
*/
|
|
int smb_ce_init(void);
|
|
int smb_ce_lock(smb_rc_t cep, int flags, struct proc *p);
|
|
void smb_ce_unlock(smb_rc_t cep, struct proc *p);
|
|
/*int smb_ce_addconn(smb_rc_t cep, struct smb_conn *scp, struct proc *p);*/
|
|
int smb_ce_createconn(struct smb_connspec *cnspec,
|
|
struct smb_cred *scred, struct smb_conn **scpp);
|
|
|
|
/*
|
|
* connection level functions
|
|
*/
|
|
/*int smb_conn_alloc(struct proc *p, struct ucred *cred, struct smb_conn **conn);*/
|
|
void smb_conn_rele(struct smb_conn *scp, struct smb_cred *scred);
|
|
int smb_conn_get(struct smb_conn *scp, struct smb_cred *scred);
|
|
void smb_conn_put(struct smb_conn *scp, struct smb_cred *scred);
|
|
int smb_conn_lookupvc(struct smb_conn *scp, struct smb_vcspec *vcspec,
|
|
struct smb_cred *scred, struct smb_vc **vcpp);
|
|
int smb_conn_lock(struct smb_conn *scp, struct proc *p);
|
|
int smb_conn_unlock(struct smb_conn *scp, struct proc *p);
|
|
|
|
/*
|
|
* session level functions
|
|
*/
|
|
int smb_vc_create(struct smb_vcspec *vcspec, char *pass,
|
|
const char *domain,
|
|
struct smb_conn *scp, struct smb_cred *scred, struct smb_vc **vcpp);
|
|
int smb_vc_connect(struct smb_vc *vcp, struct smb_cred *scred);
|
|
int smb_vc_disconnect(struct smb_vc *vcp, struct smb_cred *scred);
|
|
void smb_vc_invalidate(struct smb_vc *vcp);
|
|
int smb_vc_valid(struct smb_vc *vcp);
|
|
int smb_vc_reconnect(struct smb_vc *vcp);
|
|
int smb_vc_access(struct smb_vc *vcp, struct smb_cred *scred, mode_t mode);
|
|
int smb_vc_get(struct smb_vc *vcp, struct smb_cred *scred);
|
|
void smb_vc_put(struct smb_vc *vcp, struct smb_cred *scred);
|
|
void smb_vc_rele(struct smb_vc *vcp, struct smb_cred *scred);
|
|
void smb_vc_unlock(struct smb_vc *vcp, int flags, struct smb_cred *scred);
|
|
int smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *shspec,
|
|
struct smb_cred *scred, struct smb_share **sspp);
|
|
char*smb_vc_pass(struct smb_vc *vcp);
|
|
u_short smb_vc_nextmid(struct smb_vc *vcp);
|
|
int smb_vc_tranlock(struct smb_vc *vcp, struct proc *p);
|
|
int smb_vc_tranunlock(struct smb_vc *vcp, struct proc *p);
|
|
int smb_vc_rqlock(struct smb_vc *vcp, struct proc *p);
|
|
int smb_vc_rqunlock(struct smb_vc *vcp, struct proc *p);
|
|
|
|
/*
|
|
* share level functions
|
|
*/
|
|
int smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec,
|
|
struct smb_cred *scred, struct smb_share **sspp);
|
|
int smb_share_access(struct smb_share *ssp, struct smb_cred *scred, mode_t mode);
|
|
int smb_share_get(struct smb_share *ssp, struct smb_cred *scred);
|
|
void smb_share_put(struct smb_share *ssp, struct proc *p);
|
|
void smb_share_unlock(struct smb_share *ssp, int flags, struct smb_cred *scred);
|
|
void smb_share_rele(struct smb_share *ssp, struct smb_cred *scred);
|
|
int smb_share_connect(struct smb_share *ssp, struct smb_cred *scred);
|
|
int smb_share_detach(struct smb_share *ssp, struct smb_cred *scred);
|
|
void smb_share_invalidate(struct smb_share *ssp);
|
|
int smb_share_valid(struct smb_share *ssp);
|
|
char*smb_share_pass(struct smb_share *ssp);
|
|
|
|
/*
|
|
* Link (transport) level functions
|
|
*/
|
|
int smb_tran_open(struct smb_conn *scp, struct proc *p);
|
|
int smb_tran_close(struct smb_conn *scp, struct proc *p);
|
|
int smb_tran_bind(struct smb_conn *scp, struct sockaddr *sap, struct proc *p);
|
|
int smb_tran_connect(struct smb_conn *scp, struct sockaddr *sap, struct proc *p);
|
|
int smb_tran_disconnect(struct smb_conn *scp, struct proc *p);
|
|
int smb_tran_sndlock(struct smb_rq *rqp);
|
|
int smb_tran_sndunlock(struct smb_rq *rqp);
|
|
int smb_tran_send(struct smb_rq *rqp);
|
|
int smb_tran_receive(struct smb_rq *rqp, struct mbdata *mbp);
|
|
void smb_conn_timo(struct smb_conn *scp);
|
|
|
|
/*
|
|
* SMB protocol level functions
|
|
*/
|
|
int smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred);
|
|
int smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred);
|
|
int smb_smb_ssnclose(struct smb_vc *vcp, struct smb_cred *scred);
|
|
int smb_smb_treeconnect(struct smb_share *ssp, struct smb_cred *scred);
|
|
int smb_smb_treedisconnect(struct smb_share *ssp, struct smb_cred *scred);
|
|
int smb_read(struct smb_share *ssp, u_int16_t fid, struct uio *uio,
|
|
struct smb_cred *scred);
|
|
int smb_write(struct smb_share *ssp, u_int16_t fid, struct uio *uio,
|
|
struct smb_cred *scred);
|
|
|
|
#endif /* _KERNEL */
|