[NFSD] Add a PCH.
[reactos.git] / base / services / nfsd / upcall.h
1 /* NFSv4.1 client for Windows
2 * Copyright © 2012 The Regents of the University of Michigan
3 *
4 * Olga Kornievskaia <aglo@umich.edu>
5 * Casey Bodley <cbodley@umich.edu>
6 *
7 * This library is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation; either version 2.1 of the License, or (at
10 * your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful, but
13 * without any warranty; without even the implied warranty of merchantability
14 * or fitness for a particular purpose. See the GNU Lesser General Public
15 * License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 */
21
22 #ifndef __NFS41_DAEMON_UPCALL_H__
23 #define __NFS41_DAEMON_UPCALL_H__
24
25 #include "nfs41_ops.h"
26 #include "from_kernel.h"
27
28 #define NFSD_VERSION_MISMATCH 116
29
30 /* structures for upcall arguments */
31 typedef struct __mount_upcall_args {
32 const char *hostname;
33 const char *path;
34 DWORD sec_flavor;
35 DWORD rsize;
36 DWORD wsize;
37 DWORD lease_time;
38 FILE_FS_ATTRIBUTE_INFORMATION FsAttrs;
39 } mount_upcall_args;
40
41 typedef struct __open_upcall_args {
42 nfs41_abs_path symlink;
43 FILE_BASIC_INFO basic_info;
44 FILE_STANDARD_INFO std_info;
45 const char *path;
46 ULONG access_mask;
47 ULONG access_mode;
48 ULONG file_attrs;
49 ULONG disposition;
50 ULONG create_opts;
51 LONG open_owner_id;
52 DWORD mode;
53 ULONGLONG changeattr;
54 HANDLE srv_open;
55 DWORD deleg_type;
56 PFILE_FULL_EA_INFORMATION ea;
57 BOOLEAN created;
58 BOOLEAN symlink_embedded;
59 } open_upcall_args;
60
61 typedef struct __close_upcall_args {
62 HANDLE srv_open;
63 const char *path;
64 BOOLEAN remove;
65 BOOLEAN renamed;
66 } close_upcall_args;
67
68 typedef struct __readwrite_upcall_args {
69 unsigned char *buffer;
70 ULONGLONG offset;
71 ULONG len;
72 ULONG out_len;
73 ULONGLONG ctime;
74 } readwrite_upcall_args;
75
76 typedef struct __lock_upcall_args {
77 uint64_t offset;
78 uint64_t length;
79 BOOLEAN exclusive;
80 BOOLEAN blocking;
81 BOOLEAN acquired;
82 } lock_upcall_args;
83
84 typedef struct __unlock_upcall_args {
85 uint32_t count;
86 unsigned char *buf;
87 uint32_t buf_len;
88 } unlock_upcall_args;
89
90 typedef struct __getattr_upcall_args {
91 FILE_BASIC_INFO basic_info;
92 FILE_STANDARD_INFO std_info;
93 FILE_ATTRIBUTE_TAG_INFO tag_info;
94 FILE_INTERNAL_INFORMATION intr_info;
95 FILE_NETWORK_OPEN_INFORMATION network_info;
96 int query_class;
97 int buf_len;
98 int query_reply_len;
99 ULONGLONG ctime;
100 } getattr_upcall_args;
101
102 typedef struct __setattr_upcall_args {
103 const char *path;
104 nfs41_root *root;
105 nfs41_open_state *state;
106 unsigned char *buf;
107 uint32_t buf_len;
108 int set_class;
109 ULONGLONG ctime;
110 } setattr_upcall_args;
111
112 typedef struct __getexattr_upcall_args {
113 const char *path;
114 unsigned char *buf;
115 uint32_t buf_len;
116 ULONG eaindex;
117 unsigned char *ealist;
118 uint32_t ealist_len;
119 uint32_t overflow;
120 BOOLEAN single;
121 BOOLEAN restart;
122 } getexattr_upcall_args;
123
124
125 typedef struct __setexattr_upcall_args {
126 const char *path;
127 unsigned char *buf;
128 uint32_t buf_len;
129 uint32_t mode;
130 ULONGLONG ctime;
131 } setexattr_upcall_args;
132
133 typedef struct __readdir_upcall_args {
134 const char *filter;
135 nfs41_root *root;
136 nfs41_open_state *state;
137 int buf_len;
138 int query_class;
139 int query_reply_len;
140 BOOLEAN initial;
141 BOOLEAN restart;
142 BOOLEAN single;
143 unsigned char *kbuf;
144 } readdir_upcall_args;
145
146 typedef struct __symlink_upcall_args {
147 nfs41_abs_path target_get;
148 char *target_set;
149 const char *path;
150 BOOLEAN set;
151 } symlink_upcall_args;
152
153 typedef struct __volume_upcall_args {
154 FS_INFORMATION_CLASS query;
155 int len;
156 union {
157 FILE_FS_SIZE_INFORMATION size;
158 FILE_FS_FULL_SIZE_INFORMATION fullsize;
159 FILE_FS_ATTRIBUTE_INFORMATION attribute;
160 } info;
161 } volume_upcall_args;
162
163 typedef struct __getacl_upcall_args {
164 SECURITY_INFORMATION query;
165 PSECURITY_DESCRIPTOR sec_desc;
166 DWORD sec_desc_len;
167 } getacl_upcall_args;
168
169 typedef struct __setacl_upcall_args {
170 SECURITY_INFORMATION query;
171 PSECURITY_DESCRIPTOR sec_desc;
172 ULONGLONG ctime;
173 } setacl_upcall_args;
174
175 typedef union __upcall_args {
176 mount_upcall_args mount;
177 open_upcall_args open;
178 close_upcall_args close;
179 readwrite_upcall_args rw;
180 lock_upcall_args lock;
181 unlock_upcall_args unlock;
182 getattr_upcall_args getattr;
183 getexattr_upcall_args getexattr;
184 setattr_upcall_args setattr;
185 setexattr_upcall_args setexattr;
186 readdir_upcall_args readdir;
187 symlink_upcall_args symlink;
188 volume_upcall_args volume;
189 getacl_upcall_args getacl;
190 setacl_upcall_args setacl;
191 } upcall_args;
192
193 typedef struct __nfs41_upcall {
194 uint64_t xid;
195 uint32_t opcode;
196 uint32_t status;
197 uint32_t last_error;
198 upcall_args args;
199
200 uid_t uid;
201 gid_t gid;
202
203 /* store referenced pointers with the upcall for
204 * automatic dereferencing on upcall_cleanup();
205 * see upcall_root_ref() and upcall_open_state_ref() */
206 nfs41_root *root_ref;
207 nfs41_open_state *state_ref;
208 } nfs41_upcall;
209
210
211 /* upcall operation interface */
212 typedef int (*upcall_parse_proc)(unsigned char*, uint32_t, nfs41_upcall*);
213 typedef int (*upcall_handle_proc)(nfs41_upcall*);
214 typedef int (*upcall_marshall_proc)(unsigned char*, uint32_t*, nfs41_upcall*);
215 typedef void (*upcall_cancel_proc)(nfs41_upcall*);
216 typedef void (*upcall_cleanup_proc)(nfs41_upcall*);
217
218 typedef struct __nfs41_upcall_op {
219 upcall_parse_proc parse;
220 upcall_handle_proc handle;
221 upcall_marshall_proc marshall;
222 upcall_cancel_proc cancel;
223 upcall_cleanup_proc cleanup;
224 } nfs41_upcall_op;
225
226
227 /* upcall.c */
228 int upcall_parse(
229 IN unsigned char *buffer,
230 IN uint32_t length,
231 OUT nfs41_upcall *upcall);
232
233 int upcall_handle(
234 IN nfs41_upcall *upcall);
235
236 void upcall_marshall(
237 IN nfs41_upcall *upcall,
238 OUT unsigned char *buffer,
239 IN uint32_t length,
240 OUT uint32_t *length_out);
241
242 void upcall_cancel(
243 IN nfs41_upcall *upcall);
244
245 void upcall_cleanup(
246 IN nfs41_upcall *upcall);
247
248 #endif /* !__NFS41_DAEMON_UPCALL_H__ */