Home | History | Annotate | Download | only in netsmb
      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: smb_lib.h,v 1.21.82.2 2005/06/02 00:55:39 lindak Exp $
     33  */
     34 
     35 /*
     36  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     37  * Use is subject to license terms.
     38  */
     39 
     40 #ifndef _NETSMB_SMB_LIB_H_
     41 #define	_NETSMB_SMB_LIB_H_
     42 
     43 /*
     44  * Internal interface exported to our commands in:
     45  *	usr/src/cmd/fs.d/smbclnt/
     46  */
     47 
     48 #include <sys/types.h>
     49 #include <sys/socket.h>
     50 #include <netinet/in.h>
     51 #include <arpa/inet.h>
     52 #include <sys/byteorder.h>
     53 
     54 #include <netsmb/smbfs_api.h>
     55 #include <netsmb/smb_dev.h>
     56 
     57 extern const char smbutil_std_opts[];
     58 #define	STDPARAM_OPT	smbutil_std_opts
     59 
     60 /*
     61  * bits to indicate the source of error
     62  */
     63 #define	SMB_ERRTYPE_MASK	0xf0000
     64 #define	SMB_SYS_ERROR		0x00000
     65 #define	SMB_RAP_ERROR		0x10000
     66 #define	SMB_NB_ERROR		0x20000
     67 
     68 /*
     69  * Size of all LM/NTLM hashes (16 bytes).
     70  * The driver needs to know this, so it's
     71  * defined by smb_dev.h
     72  */
     73 #define	NTLM_HASH_SZ		SMBIOC_HASH_SZ
     74 #define	NTLM_CHAL_SZ		8	/* challenge size */
     75 
     76 /*
     77  * This is what goes across the door call to the IOD
     78  * when asking for a new connection.
     79  */
     80 struct smb_iod_ssn {
     81 	struct smbioc_ossn iod_ossn;
     82 	int		iod_authflags;	/* SMB_AT_x */
     83 	uchar_t		iod_nthash[NTLM_HASH_SZ];
     84 	uchar_t		iod_lmhash[NTLM_HASH_SZ];
     85 	/* Kerberos cred. cache res. name? */
     86 };
     87 typedef struct smb_iod_ssn smb_iod_ssn_t;
     88 
     89 
     90 /*
     91  * SMB work context. Used to store all values which are necessary
     92  * to establish connection to an SMB server.
     93  */
     94 struct smb_ctx {
     95 	int		ct_flags;	/* SMBCF_ */
     96 	int		ct_dev_fd;	/* device handle */
     97 	int		ct_door_fd;	/* to smbiod */
     98 	int		ct_parsedlevel;
     99 	int		ct_minlevel;
    100 	int		ct_maxlevel;
    101 	char		*ct_fullserver; /* orig. server name from cmd line */
    102 	char		*ct_srvaddr_s;	/* hostname or IP address of server */
    103 	struct addrinfo *ct_addrinfo;	/* IP addresses of the server */
    104 	struct nb_ctx	*ct_nb;		/* NetBIOS info. */
    105 	char		*ct_locname;	/* local (machine) name */
    106 	smb_iod_ssn_t	ct_iod_ssn;
    107 	/* smbioc_oshare_t	ct_sh; XXX */
    108 	int		ct_minauth;
    109 	int		ct_shtype_req;	/* share type wanted */
    110 	char		*ct_origshare;
    111 	char		*ct_home;
    112 
    113 	/* Connection setup SMB stuff. */
    114 	/* Strings from the SMB negotiate response. */
    115 	char		*ct_srv_OS;
    116 	char		*ct_srv_LM;
    117 
    118 	/* NTLM auth. stuff */
    119 	uchar_t		ct_clnonce[NTLM_CHAL_SZ];
    120 	uchar_t		ct_ntlm_chal[NTLM_CHAL_SZ];
    121 	char		ct_password[SMBIOC_MAX_NAME];
    122 
    123 	/* See ssp.c */
    124 	void		*ct_ssp_ctx;
    125 	smbioc_ssn_work_t ct_work;
    126 };
    127 
    128 
    129 /*
    130  * Short-hand for some of the substruct fields above
    131  */
    132 #define	ct_ssn		ct_iod_ssn.iod_ossn
    133 #define	ct_vopt		ct_iod_ssn.iod_ossn.ssn_vopt
    134 #define	ct_owner	ct_iod_ssn.iod_ossn.ssn_owner
    135 #define	ct_srvaddr	ct_iod_ssn.iod_ossn.ssn_srvaddr
    136 #define	ct_domain	ct_iod_ssn.iod_ossn.ssn_domain
    137 #define	ct_user 	ct_iod_ssn.iod_ossn.ssn_user
    138 #define	ct_srvname 	ct_iod_ssn.iod_ossn.ssn_srvname
    139 #define	ct_authflags	ct_iod_ssn.iod_authflags
    140 #define	ct_nthash	ct_iod_ssn.iod_nthash
    141 #define	ct_lmhash	ct_iod_ssn.iod_lmhash
    142 
    143 #define	ct_sopt		ct_work.wk_sopt
    144 #define	ct_iods		ct_work.wk_iods
    145 #define	ct_tran_fd	ct_work.wk_iods.is_tran_fd
    146 #define	ct_hflags	ct_work.wk_iods.is_hflags
    147 #define	ct_hflags2	ct_work.wk_iods.is_hflags2
    148 #define	ct_vcflags	ct_work.wk_iods.is_vcflags
    149 #define	ct_ssn_key	ct_work.wk_iods.is_ssn_key
    150 #define	ct_mac_seqno	ct_work.wk_iods.is_next_seq
    151 #define	ct_mackeylen	ct_work.wk_iods.is_u_maclen
    152 #define	ct_mackey	ct_work.wk_iods.is_u_mackey.lp_ptr
    153 
    154 
    155 /*
    156  * Bits in smb_ctx_t.ct_flags
    157  */
    158 #define	SMBCF_NOPWD		    0x0001 /* don't ask for a password */
    159 #define	SMBCF_SRIGHTS		    0x0002 /* share access rights supplied */
    160 #define	SMBCF_LOCALE		    0x0004 /* use current locale */
    161 #define	SMBCF_CMD_DOM		    0x0010 /* CMD specified domain */
    162 #define	SMBCF_CMD_USR		    0x0020 /* CMD specified user */
    163 #define	SMBCF_CMD_PW		    0x0040 /* CMD specified password */
    164 #define	SMBCF_RESOLVED		    0x8000 /* structure has been verified */
    165 #define	SMBCF_KCBAD		0x00080000 /* keychain password failed */
    166 #define	SMBCF_KCFOUND		0x00100000 /* password is from keychain */
    167 #define	SMBCF_BROWSEOK		0x00200000 /* browser dialogue may be used */
    168 #define	SMBCF_AUTHREQ		0x00400000 /* auth. dialog requested */
    169 #define	SMBCF_KCSAVE		0x00800000 /* add to keychain requested */
    170 #define	SMBCF_XXX		0x01000000 /* mount-all, a very bad thing */
    171 #define	SMBCF_SSNACTIVE		0x02000000 /* session setup succeeded */
    172 #define	SMBCF_KCDOMAIN		0x04000000 /* use domain in KC lookup */
    173 
    174 
    175 /*
    176  * Context management
    177  */
    178 
    179 int  smb_ctx_init(struct smb_ctx *);
    180 void smb_ctx_done(struct smb_ctx *);
    181 int  smb_open_driver(void);
    182 
    183 int  smb_ctx_gethandle(struct smb_ctx *);
    184 int  smb_ctx_findvc(struct smb_ctx *);
    185 int  smb_ctx_newvc(struct smb_ctx *);
    186 
    187 /*
    188  * I/O daemon stuff
    189  */
    190 
    191 int  smb_iod_cl_newvc(smb_ctx_t *ctx);
    192 char *smb_iod_door_path(void);
    193 int smb_iod_open_door(int *);
    194 int smb_iod_connect(struct smb_ctx *);
    195 int smb_iod_work(struct smb_ctx *);
    196 
    197 /*
    198  * Other stuff
    199  */
    200 
    201 int  smb_open_rcfile(char *);
    202 void smb_close_rcfile(void);
    203 
    204 void smb_simplecrypt(char *dst, const char *src);
    205 int  smb_simpledecrypt(char *dst, const char *src);
    206 
    207 int	nls_setrecode(const char *, const char *);
    208 int	nls_setlocale(const char *);
    209 char	*nls_str_toext(char *, const char *);
    210 char	*nls_str_toloc(char *, const char *);
    211 void	*nls_mem_toext(void *, const void *, int);
    212 void	*nls_mem_toloc(void *, const void *, int);
    213 char	*nls_str_upper(char *, const char *);
    214 char	*nls_str_lower(char *, const char *);
    215 
    216 char *smb_getprogname();
    217 #define	__progname smb_getprogname()
    218 
    219 #endif /* _NETSMB_SMB_LIB_H_ */
    220