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 2008 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 #include <sys/types.h> 44 #include <sys/socket.h> 45 #include <netinet/in.h> 46 #include <arpa/inet.h> 47 #include <sys/byteorder.h> 48 49 #include <netsmb/smb.h> 50 #include <netsmb/smb_dev.h> 51 52 #define SMB_CFG_FILE "/etc/nsmb.conf" 53 #define OLD_SMB_CFG_FILE "/usr/local/etc/nsmb.conf" 54 55 #define STDPARAM_ARGS \ 56 'A':case 'B':case 'C':case 'E':case 'I':case 'L':case \ 57 'M':case 'N':case 'U':case 'R':case 'S':case 'T':case \ 58 'W':case 'O':case 'P' 59 60 #define STDPARAM_OPT "ABCE:I:L:M:NO:P:U:R:S:T:W:" 61 62 /* 63 * bits to indicate the source of error 64 */ 65 #define SMB_ERRTYPE_MASK 0xf0000 66 #define SMB_SYS_ERROR 0x00000 67 #define SMB_RAP_ERROR 0x10000 68 #define SMB_NB_ERROR 0x20000 69 70 /* 71 * SMB work context. Used to store all values which are necessary 72 * to establish connection to an SMB server. 73 */ 74 struct smb_ctx { 75 int ct_flags; /* SMBCF_ */ 76 int ct_fd; /* handle of connection */ 77 int ct_parsedlevel; 78 int ct_minlevel; 79 int ct_maxlevel; 80 char *ct_fullserver; /* original server name from cmd line */ 81 char *ct_srvaddr; /* hostname or IP address of server */ 82 struct sockaddr_in ct_srvinaddr; /* IP address of server */ 83 char ct_locname[SMB_MAXUSERNAMELEN + 1]; 84 struct nb_ctx *ct_nb; 85 struct smbioc_ossn ct_ssn; 86 struct smbioc_oshare ct_sh; 87 char *ct_origshare; 88 char *ct_home; 89 void *ct_secblob; 90 int ct_secbloblen; 91 /* krb5 stuff: all anonymous struct pointers here. */ 92 struct _krb5_context *ct_krb5ctx; 93 struct _krb5_ccache *ct_krb5cc; /* credentials cache */ 94 struct krb5_principal_data *ct_krb5cp; /* client principal */ 95 }; 96 typedef struct smb_ctx smb_ctx_t; 97 98 #define SMBCF_NOPWD 0x0001 /* don't ask for a password */ 99 #define SMBCF_SRIGHTS 0x0002 /* share access rights supplied */ 100 #define SMBCF_LOCALE 0x0004 /* use current locale */ 101 #define SMBCF_CMD_DOM 0x0010 /* CMD specified domain */ 102 #define SMBCF_CMD_USR 0x0020 /* CMD specified user */ 103 #define SMBCF_CMD_PW 0x0040 /* CMD specified password */ 104 #define SMBCF_RESOLVED 0x8000 /* structure has been verified */ 105 #define SMBCF_KCBAD 0x00080000 /* keychain password failed */ 106 #define SMBCF_KCFOUND 0x00100000 /* password is from keychain */ 107 #define SMBCF_BROWSEOK 0x00200000 /* browser dialogue may be used */ 108 #define SMBCF_AUTHREQ 0x00400000 /* auth. dialog requested */ 109 #define SMBCF_KCSAVE 0x00800000 /* add to keychain requested */ 110 #define SMBCF_XXX 0x01000000 /* mount-all, a very bad thing */ 111 #define SMBCF_SSNACTIVE 0x02000000 /* session setup succeeded */ 112 #define SMBCF_KCDOMAIN 0x04000000 /* use domain in KC lookup */ 113 114 /* 115 * access modes (see also smb_dev.h) 116 */ 117 #define SMBM_READ S_IRUSR /* read conn attrs. (like list shares) */ 118 #define SMBM_WRITE S_IWUSR /* modify conn attrs */ 119 #define SMBM_EXEC S_IXUSR /* can send SMB requests */ 120 #define SMBM_READGRP S_IRGRP 121 #define SMBM_WRITEGRP S_IWGRP 122 #define SMBM_EXECGRP S_IXGRP 123 #define SMBM_READOTH S_IROTH 124 #define SMBM_WRITEOTH S_IWOTH 125 #define SMBM_EXECOTH S_IXOTH 126 #define SMBM_ALL S_IRWXU 127 #define SMBM_DEFAULT S_IRWXU 128 129 130 /* 131 * Share type for smb_ctx_init 132 */ 133 #define SMB_ST_DISK STYPE_DISKTREE 134 #define SMB_ST_PRINTER STYPE_PRINTQ 135 #define SMB_ST_COMM STYPE_DEVICE 136 #define SMB_ST_PIPE STYPE_IPC 137 #define SMB_ST_ANY STYPE_UNKNOWN 138 #define SMB_ST_MAX STYPE_UNKNOWN 139 #define SMB_ST_NONE 0xff /* not a part of protocol */ 140 141 struct mbdata { 142 struct mbuf *mb_top; 143 struct mbuf *mb_cur; 144 char *mb_pos; 145 int mb_count; 146 }; 147 typedef struct mbdata mbdata_t; 148 149 struct smb_bitname { 150 uint_t bn_bit; 151 char *bn_name; 152 }; 153 typedef struct smb_bitname smb_bitname_t; 154 155 extern int smb_debug, smb_verbose; 156 extern struct rcfile *smb_rc; 157 158 #ifdef __cplusplus 159 extern "C" { 160 #endif 161 162 int smb_lib_init(void); 163 int smb_open_driver(void); 164 int smb_open_rcfile(struct smb_ctx *ctx); 165 void smb_error(const char *, int, ...); 166 char *smb_printb(char *, int, const struct smb_bitname *); 167 168 /* 169 * Context management 170 */ 171 int smb_ctx_init(struct smb_ctx *, int, char *[], int, int, int); 172 void smb_ctx_done(struct smb_ctx *); 173 int smb_ctx_parseunc(struct smb_ctx *, const char *, int, const char **); 174 int smb_ctx_setcharset(struct smb_ctx *, const char *); 175 int smb_ctx_setfullserver(struct smb_ctx *, const char *); 176 void smb_ctx_setserver(struct smb_ctx *, const char *); 177 int smb_ctx_setuser(struct smb_ctx *, const char *, int); 178 int smb_ctx_setshare(struct smb_ctx *, const char *, int); 179 int smb_ctx_setscope(struct smb_ctx *, const char *); 180 int smb_ctx_setworkgroup(struct smb_ctx *, const char *, int); 181 int smb_ctx_setpassword(struct smb_ctx *, const char *, int); 182 int smb_ctx_setsrvaddr(struct smb_ctx *, const char *); 183 int smb_ctx_opt(struct smb_ctx *, int, const char *); 184 int smb_ctx_findvc(struct smb_ctx *, int, int); 185 int smb_ctx_negotiate(struct smb_ctx *, int, int, char *); 186 int smb_ctx_tdis(struct smb_ctx *ctx); 187 int smb_ctx_lookup(struct smb_ctx *, int, int); 188 int smb_ctx_login(struct smb_ctx *); 189 int smb_ctx_readrc(struct smb_ctx *); 190 int smb_ctx_resolve(struct smb_ctx *); 191 int smb_ctx_setflags(struct smb_ctx *, int, int, int); 192 int smb_ctx_flags2(struct smb_ctx *); 193 194 int smb_smb_open_print_file(struct smb_ctx *, int, int, const char *, smbfh*); 195 int smb_smb_close_print_file(struct smb_ctx *, smbfh); 196 197 typedef void (*smb_ctx_close_hook_t)(struct smb_ctx *); 198 void smb_ctx_set_close_hook(smb_ctx_close_hook_t); 199 int smb_fh_close(struct smb_ctx *ctx, smbfh fh); 200 int smb_fh_open(struct smb_ctx *ctx, const char *, int, smbfh *); 201 int smb_fh_read(struct smb_ctx *, smbfh, off_t, size_t, char *); 202 int smb_fh_write(struct smb_ctx *, smbfh, off_t, size_t, const char *); 203 int smb_fh_xactnp(struct smb_ctx *, smbfh, int, const char *, 204 int *, char *, int *); 205 206 int smb_t2_request(struct smb_ctx *, int, uint16_t *, const char *, 207 int, void *, int, void *, int *, void *, int *, void *, int *); 208 209 void smb_simplecrypt(char *dst, const char *src); 210 int smb_simpledecrypt(char *dst, const char *src); 211 212 int nls_setrecode(const char *, const char *); 213 int nls_setlocale(const char *); 214 char *nls_str_toext(char *, const char *); 215 char *nls_str_toloc(char *, const char *); 216 void *nls_mem_toext(void *, const void *, int); 217 void *nls_mem_toloc(void *, const void *, int); 218 char *nls_str_upper(char *, const char *); 219 char *nls_str_lower(char *, const char *); 220 221 int smb_get_authentication(char *, size_t, char *, size_t, char *, size_t, 222 const char *, struct smb_ctx *); 223 int smb_browse(struct smb_ctx *, int); 224 void smb_save2keychain(struct smb_ctx *); 225 #define smb_autherr(e) ((e) == EAUTH || (e) == EACCES || (e) == EPERM) 226 char *smb_strerror(int); 227 char *smb_getprogname(); 228 #define __progname smb_getprogname() 229 230 extern char *unpercent(char *component); 231 232 #ifdef __cplusplus 233 } 234 #endif 235 236 #endif /* _NETSMB_SMB_LIB_H_ */ 237