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