smb_vops.h revision 7757:bf4a45ecb669
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _SMBSRV_SMB_VOPS_H
27#define	_SMBSRV_SMB_VOPS_H
28
29#pragma ident	"@(#)smb_vops.h	1.9	08/08/07 SMI"
30
31/*
32 * Common file system interfaces and definitions.
33 */
34
35#include <sys/types.h>
36#include <sys/param.h>
37#include <sys/file.h>
38#include <sys/time.h>
39#include <sys/mntent.h>
40#include <sys/uio.h>
41#include <sys/vnode.h>
42#include <sys/vfs.h>
43#include <sys/refstr.h>
44#include <sys/acl.h>
45#include <sys/fcntl.h>
46#include <smbsrv/smb_i18n.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52#define	ROOTVOL ""
53#define	XATTR_DIR "xattr_dir"
54
55#define	SMB_STREAM_PREFIX "SUNWsmb"
56#define	SMB_STREAM_PREFIX_LEN (sizeof (SMB_STREAM_PREFIX) - 1)
57
58#define	SMB_SHORTNAMELEN 14
59#define	SMB_EOF	0x7FFFFFFF
60
61/*
62 * SMB_MINLEN_RDDIR_BUF: minimum length of buffer server will provide to
63 *	VOP_READDIR.  Its value is the size of the maximum possible edirent_t
64 *	for solaris.  The EDIRENT_RECLEN macro returns the size of edirent_t
65 *	required for a given name length.  MAXNAMELEN is the maximum
66 *	filename length allowed in Solaris.  The first two EDIRENT_RECLEN()
67 *	macros are to allow for . and .. entries -- just a minor tweak to try
68 *	and guarantee that buffer we give to VOP_READDIR will be large enough
69 *	to hold ., .., and the largest possible solaris edirent_t.
70 *
71 *	This bufsize will also be used when reading dirent64_t entries.
72 */
73
74#define	SMB_MINLEN_RDDIR_BUF \
75	(EDIRENT_RECLEN(1) + EDIRENT_RECLEN(2) + EDIRENT_RECLEN(MAXNAMELEN))
76
77/*
78 * DP_TO_EDP
79 *
80 * Fill in an edirent_t structure with information from a dirent64_t.
81 * This allows the use of an edirent_t in code where both edirent_t's
82 * and dirent64_t's are manipulated.
83 */
84
85#define	DP_TO_EDP(dp, edp)						\
86{									\
87	ASSERT((dp));							\
88	ASSERT((edp));							\
89	(edp)->ed_ino = (dp)->d_ino;					\
90	(edp)->ed_off = (dp)->d_off;					\
91	(edp)->ed_eflags = 0;						\
92	(edp)->ed_reclen = (dp)->d_reclen;				\
93	(void) strlcpy((edp)->ed_name, (dp)->d_name, MAXNAMELEN);	\
94}
95
96/*
97 * DP_ADVANCE
98 *
99 * In readdir operations, advance to read the next entry in a buffer
100 * returned from VOP_READDIR.  The entries are of type dirent64_t.
101 */
102
103#define	DP_ADVANCE(dp, dirbuf, numbytes)				\
104{									\
105	ASSERT((dp));							\
106	if ((dp)->d_reclen == 0) {					\
107		(dp) = NULL;						\
108	} else {							\
109		(dp) = (dirent64_t *)((char *)(dp) + (dp)->d_reclen);	\
110		if ((dp) >= (dirent64_t *)((dirbuf) + (numbytes)))	\
111			(dp) = NULL;					\
112	}								\
113}
114
115/*
116 * EDP_ADVANCE
117 *
118 * In readdir operations, advance to read the next entry in a buffer
119 * returned from VOP_READDIR.  The entries are of type edirent_t.
120 */
121
122#define	EDP_ADVANCE(edp, dirbuf, numbytes)				\
123{									\
124	ASSERT((edp));							\
125	if ((edp)->ed_reclen == 0) {					\
126		(edp) = NULL;						\
127	} else {							\
128		(edp) = (edirent_t *)((char *)(edp) + (edp)->ed_reclen);\
129		if ((edp) >= (edirent_t *)((dirbuf) + (numbytes)))	\
130			(edp) = NULL;					\
131	}								\
132}
133
134struct smb_node;
135struct smb_request;
136
137/*
138 * Note: When specifying the mask for an smb_attr_t,
139 * the sa_mask, and not the sa_vattr.va_mask, should be
140 * filled in.  The #define's that should be used are those
141 * prefixed with SMB_AT_*.  Only FSIL routines should
142 * manipulate the sa_vattr.va_mask field.
143 */
144typedef struct smb_attr {
145	uint_t		sa_mask;	/* For both vattr and CIFS attr's */
146	vattr_t		sa_vattr;	/* Legacy vattr */
147	uint32_t	sa_dosattr;	/* DOS attributes */
148	timestruc_t	sa_crtime;	/* Creation time */
149} smb_attr_t;
150
151#define	SMB_AT_TYPE	0x00001
152#define	SMB_AT_MODE	0x00002
153#define	SMB_AT_UID	0x00004
154#define	SMB_AT_GID	0x00008
155#define	SMB_AT_FSID	0x00010
156#define	SMB_AT_NODEID	0x00020
157#define	SMB_AT_NLINK	0x00040
158#define	SMB_AT_SIZE	0x00080
159#define	SMB_AT_ATIME	0x00100
160#define	SMB_AT_MTIME	0x00200
161#define	SMB_AT_CTIME	0x00400
162#define	SMB_AT_RDEV	0x00800
163#define	SMB_AT_BLKSIZE	0x01000
164#define	SMB_AT_NBLOCKS	0x02000
165#define	SMB_AT_SEQ	0x08000
166
167#define	SMB_AT_DOSATTR	0x00100000
168#define	SMB_AT_CRTIME	0x00200000
169#define	SMB_AT_SMB	0x00300000
170
171#define	SMB_AT_ALL	(SMB_AT_TYPE|SMB_AT_MODE|SMB_AT_UID|SMB_AT_GID|\
172			SMB_AT_FSID|SMB_AT_NODEID|SMB_AT_NLINK|SMB_AT_SIZE|\
173			SMB_AT_ATIME|SMB_AT_MTIME|SMB_AT_CTIME|SMB_AT_RDEV|\
174			SMB_AT_BLKSIZE|SMB_AT_NBLOCKS|SMB_AT_SEQ|SMB_AT_SMB)
175
176struct fs_stream_info {
177	char name[MAXPATHLEN];
178	uint64_t size;
179};
180
181int fhopen(const struct smb_node *, int);
182
183int smb_vop_init(void);
184void smb_vop_fini(void);
185void smb_vop_start(void);
186int smb_vop_open(vnode_t **, int, cred_t *);
187void smb_vop_close(vnode_t *, int, cred_t *);
188int smb_vop_read(vnode_t *, uio_t *, cred_t *);
189int smb_vop_write(vnode_t *, uio_t *, int, uint32_t *, cred_t *);
190int smb_vop_getattr(vnode_t *, vnode_t *, smb_attr_t *, int, cred_t *);
191int smb_vop_setattr(vnode_t *, vnode_t *, smb_attr_t *, int, cred_t *);
192int smb_vop_access(vnode_t *, int, int, vnode_t *, cred_t *);
193void smb_vop_eaccess(vnode_t *, int *, int, vnode_t *, cred_t *);
194int smb_vop_lookup(vnode_t *, char *, vnode_t **, char *, int, vnode_t *,
195    cred_t *);
196int smb_vop_create(vnode_t *, char *, smb_attr_t *, vnode_t **, int, cred_t *,
197    vsecattr_t *);
198int smb_vop_remove(vnode_t *, char *, int, cred_t *);
199int smb_vop_rename(vnode_t *, char *, vnode_t *, char *, int, cred_t *);
200int smb_vop_mkdir(vnode_t *, char *, smb_attr_t *, vnode_t **, int, cred_t *,
201    vsecattr_t *);
202int smb_vop_rmdir(vnode_t *, char *, int, cred_t *);
203int smb_vop_readdir(vnode_t *, uint32_t *, char *, int *, ino64_t *, vnode_t **,
204    char *, int, cred_t *);
205int smb_vop_commit(vnode_t *, cred_t *);
206int smb_vop_getdents(struct smb_node *, uint32_t *, uint64_t *, int32_t *,
207    char *, char *, uint32_t, struct smb_request *, cred_t *);
208int smb_vop_statfs(vnode_t *, struct statvfs64 *, cred_t *);
209int smb_vop_stream_lookup(vnode_t *, char *, vnode_t **, char *, vnode_t **,
210    int, vnode_t *, cred_t *);
211int smb_vop_stream_create(vnode_t *, char *, smb_attr_t *, vnode_t **,
212    vnode_t **, int, cred_t *);
213int smb_vop_stream_remove(vnode_t *, char *, int, cred_t *);
214int smb_vop_stream_readdir(vnode_t *, uint32_t *, struct fs_stream_info *,
215    vnode_t **, vnode_t **, int, cred_t *);
216int smb_vop_lookup_xattrdir(vnode_t *, vnode_t **, int, cred_t *);
217int smb_vop_traverse_check(vnode_t **);
218
219int smb_vop_acl_read(vnode_t *, acl_t **, int, acl_type_t, cred_t *);
220int smb_vop_acl_write(vnode_t *, acl_t *, int, cred_t *);
221acl_type_t smb_vop_acl_type(vnode_t *);
222
223int smb_vop_shrlock(vnode_t *, uint32_t, uint32_t, uint32_t, cred_t *);
224int smb_vop_unshrlock(vnode_t *, uint32_t, cred_t *);
225
226int smb_vop_frlock(vnode_t *, cred_t *, int, flock64_t *);
227
228#ifdef __cplusplus
229}
230#endif
231
232#endif /* _SMBSRV_SMB_VOPS_H */
233