2 Unix SMB/CIFS implementation.
3 NTVFS interface functions
5 Copyright (C) Stefan (metze) Metzmacher 2004
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "ntvfs/ntvfs.h"
25 /* connect/disconnect */
26 _PUBLIC_ NTSTATUS
ntvfs_connect(struct ntvfs_request
*req
, const char *sharename
)
28 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
29 if (!ntvfs
->ops
->connect
) {
30 return NT_STATUS_NOT_IMPLEMENTED
;
32 return ntvfs
->ops
->connect(ntvfs
, req
, sharename
);
35 _PUBLIC_ NTSTATUS
ntvfs_disconnect(struct ntvfs_context
*ntvfs_ctx
)
37 struct ntvfs_module_context
*ntvfs
;
38 if (ntvfs_ctx
== NULL
) {
39 return NT_STATUS_INVALID_CONNECTION
;
41 ntvfs
= ntvfs_ctx
->modules
;
42 if (!ntvfs
->ops
->disconnect
) {
43 return NT_STATUS_NOT_IMPLEMENTED
;
45 return ntvfs
->ops
->disconnect(ntvfs
);
48 /* async setup - called by a backend that wants to setup any state for
50 _PUBLIC_ NTSTATUS
ntvfs_async_setup(struct ntvfs_request
*req
, void *private)
52 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
53 if (!ntvfs
->ops
->async_setup
) {
54 return NT_STATUS_NOT_IMPLEMENTED
;
56 return ntvfs
->ops
->async_setup(ntvfs
, req
, private);
59 /* filesystem operations */
60 _PUBLIC_ NTSTATUS
ntvfs_fsinfo(struct ntvfs_request
*req
, union smb_fsinfo
*fs
)
62 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
63 if (!ntvfs
->ops
->fsinfo
) {
64 return NT_STATUS_NOT_IMPLEMENTED
;
66 return ntvfs
->ops
->fsinfo(ntvfs
, req
, fs
);
70 _PUBLIC_ NTSTATUS
ntvfs_unlink(struct ntvfs_request
*req
, union smb_unlink
*unl
)
72 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
73 if (!ntvfs
->ops
->unlink
) {
74 return NT_STATUS_NOT_IMPLEMENTED
;
76 return ntvfs
->ops
->unlink(ntvfs
, req
, unl
);
79 _PUBLIC_ NTSTATUS
ntvfs_chkpath(struct ntvfs_request
*req
, union smb_chkpath
*cp
)
81 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
82 if (!ntvfs
->ops
->chkpath
) {
83 return NT_STATUS_NOT_IMPLEMENTED
;
85 return ntvfs
->ops
->chkpath(ntvfs
, req
, cp
);
88 _PUBLIC_ NTSTATUS
ntvfs_qpathinfo(struct ntvfs_request
*req
, union smb_fileinfo
*st
)
90 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
91 if (!ntvfs
->ops
->qpathinfo
) {
92 return NT_STATUS_NOT_IMPLEMENTED
;
94 return ntvfs
->ops
->qpathinfo(ntvfs
, req
, st
);
97 _PUBLIC_ NTSTATUS
ntvfs_setpathinfo(struct ntvfs_request
*req
, union smb_setfileinfo
*st
)
99 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
100 if (!ntvfs
->ops
->setpathinfo
) {
101 return NT_STATUS_NOT_IMPLEMENTED
;
103 return ntvfs
->ops
->setpathinfo(ntvfs
, req
, st
);
106 _PUBLIC_ NTSTATUS
ntvfs_open(struct ntvfs_request
*req
, union smb_open
*oi
)
108 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
109 if (!ntvfs
->ops
->open
) {
110 return NT_STATUS_NOT_IMPLEMENTED
;
112 return ntvfs
->ops
->open(ntvfs
, req
, oi
);
115 _PUBLIC_ NTSTATUS
ntvfs_mkdir(struct ntvfs_request
*req
, union smb_mkdir
*md
)
117 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
118 if (!ntvfs
->ops
->mkdir
) {
119 return NT_STATUS_NOT_IMPLEMENTED
;
121 return ntvfs
->ops
->mkdir(ntvfs
, req
, md
);
124 _PUBLIC_ NTSTATUS
ntvfs_rmdir(struct ntvfs_request
*req
, struct smb_rmdir
*rd
)
126 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
127 if (!ntvfs
->ops
->rmdir
) {
128 return NT_STATUS_NOT_IMPLEMENTED
;
130 return ntvfs
->ops
->rmdir(ntvfs
, req
, rd
);
133 _PUBLIC_ NTSTATUS
ntvfs_rename(struct ntvfs_request
*req
, union smb_rename
*ren
)
135 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
136 if (!ntvfs
->ops
->rename
) {
137 return NT_STATUS_NOT_IMPLEMENTED
;
139 return ntvfs
->ops
->rename(ntvfs
, req
, ren
);
142 _PUBLIC_ NTSTATUS
ntvfs_copy(struct ntvfs_request
*req
, struct smb_copy
*cp
)
144 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
145 if (!ntvfs
->ops
->copy
) {
146 return NT_STATUS_NOT_IMPLEMENTED
;
148 return ntvfs
->ops
->copy(ntvfs
, req
, cp
);
151 /* directory search */
152 _PUBLIC_ NTSTATUS
ntvfs_search_first(struct ntvfs_request
*req
, union smb_search_first
*io
, void *private,
153 BOOL
ntvfs_callback(void *private, union smb_search_data
*file
))
155 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
156 if (!ntvfs
->ops
->search_first
) {
157 return NT_STATUS_NOT_IMPLEMENTED
;
159 return ntvfs
->ops
->search_first(ntvfs
, req
, io
, private, ntvfs_callback
);
162 _PUBLIC_ NTSTATUS
ntvfs_search_next(struct ntvfs_request
*req
, union smb_search_next
*io
, void *private,
163 BOOL
ntvfs_callback(void *private, union smb_search_data
*file
))
165 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
166 if (!ntvfs
->ops
->search_next
) {
167 return NT_STATUS_NOT_IMPLEMENTED
;
169 return ntvfs
->ops
->search_next(ntvfs
, req
, io
, private, ntvfs_callback
);
172 _PUBLIC_ NTSTATUS
ntvfs_search_close(struct ntvfs_request
*req
, union smb_search_close
*io
)
174 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
175 if (!ntvfs
->ops
->search_close
) {
176 return NT_STATUS_NOT_IMPLEMENTED
;
178 return ntvfs
->ops
->search_close(ntvfs
, req
, io
);
181 /* operations on open files */
182 _PUBLIC_ NTSTATUS
ntvfs_ioctl(struct ntvfs_request
*req
, union smb_ioctl
*io
)
184 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
185 if (!ntvfs
->ops
->ioctl
) {
186 return NT_STATUS_NOT_IMPLEMENTED
;
188 return ntvfs
->ops
->ioctl(ntvfs
, req
, io
);
191 _PUBLIC_ NTSTATUS
ntvfs_read(struct ntvfs_request
*req
, union smb_read
*io
)
193 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
194 if (!ntvfs
->ops
->read
) {
195 return NT_STATUS_NOT_IMPLEMENTED
;
197 return ntvfs
->ops
->read(ntvfs
, req
, io
);
200 _PUBLIC_ NTSTATUS
ntvfs_write(struct ntvfs_request
*req
, union smb_write
*io
)
202 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
203 if (!ntvfs
->ops
->write
) {
204 return NT_STATUS_NOT_IMPLEMENTED
;
206 return ntvfs
->ops
->write(ntvfs
, req
, io
);
209 _PUBLIC_ NTSTATUS
ntvfs_seek(struct ntvfs_request
*req
, union smb_seek
*io
)
211 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
212 if (!ntvfs
->ops
->seek
) {
213 return NT_STATUS_NOT_IMPLEMENTED
;
215 return ntvfs
->ops
->seek(ntvfs
, req
, io
);
218 _PUBLIC_ NTSTATUS
ntvfs_flush(struct ntvfs_request
*req
,
219 union smb_flush
*flush
)
221 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
222 if (!ntvfs
->ops
->flush
) {
223 return NT_STATUS_NOT_IMPLEMENTED
;
225 return ntvfs
->ops
->flush(ntvfs
, req
, flush
);
228 _PUBLIC_ NTSTATUS
ntvfs_lock(struct ntvfs_request
*req
, union smb_lock
*lck
)
230 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
231 if (!ntvfs
->ops
->lock
) {
232 return NT_STATUS_NOT_IMPLEMENTED
;
234 return ntvfs
->ops
->lock(ntvfs
, req
, lck
);
237 _PUBLIC_ NTSTATUS
ntvfs_qfileinfo(struct ntvfs_request
*req
, union smb_fileinfo
*info
)
239 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
240 if (!ntvfs
->ops
->qfileinfo
) {
241 return NT_STATUS_NOT_IMPLEMENTED
;
243 return ntvfs
->ops
->qfileinfo(ntvfs
, req
, info
);
246 _PUBLIC_ NTSTATUS
ntvfs_setfileinfo(struct ntvfs_request
*req
, union smb_setfileinfo
*info
)
248 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
249 if (!ntvfs
->ops
->setfileinfo
) {
250 return NT_STATUS_NOT_IMPLEMENTED
;
252 return ntvfs
->ops
->setfileinfo(ntvfs
, req
, info
);
255 _PUBLIC_ NTSTATUS
ntvfs_close(struct ntvfs_request
*req
, union smb_close
*io
)
257 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
258 if (!ntvfs
->ops
->close
) {
259 return NT_STATUS_NOT_IMPLEMENTED
;
261 return ntvfs
->ops
->close(ntvfs
, req
, io
);
264 /* trans interface - used by IPC backend for pipes and RAP calls */
265 _PUBLIC_ NTSTATUS
ntvfs_trans(struct ntvfs_request
*req
, struct smb_trans2
*trans
)
267 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
268 if (!ntvfs
->ops
->trans
) {
269 return NT_STATUS_NOT_IMPLEMENTED
;
271 return ntvfs
->ops
->trans(ntvfs
, req
, trans
);
274 /* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
275 _PUBLIC_ NTSTATUS
ntvfs_trans2(struct ntvfs_request
*req
, struct smb_trans2
*trans2
)
277 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
278 if (!ntvfs
->ops
->trans2
) {
279 return NT_STATUS_NOT_IMPLEMENTED
;
281 return ntvfs
->ops
->trans2(ntvfs
, req
, trans2
);
284 /* printing specific operations */
285 _PUBLIC_ NTSTATUS
ntvfs_lpq(struct ntvfs_request
*req
, union smb_lpq
*lpq
)
287 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
288 if (!ntvfs
->ops
->lpq
) {
289 return NT_STATUS_NOT_IMPLEMENTED
;
291 return ntvfs
->ops
->lpq(ntvfs
, req
, lpq
);
294 /* logoff - called when a vuid is closed */
295 _PUBLIC_ NTSTATUS
ntvfs_logoff(struct ntvfs_request
*req
)
297 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
298 if (!ntvfs
->ops
->logoff
) {
299 return NT_STATUS_NOT_IMPLEMENTED
;
301 return ntvfs
->ops
->logoff(ntvfs
, req
);
304 _PUBLIC_ NTSTATUS
ntvfs_exit(struct ntvfs_request
*req
)
306 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
307 if (!ntvfs
->ops
->exit
) {
308 return NT_STATUS_NOT_IMPLEMENTED
;
310 return ntvfs
->ops
->exit(ntvfs
, req
);
314 change notify request
316 _PUBLIC_ NTSTATUS
ntvfs_notify(struct ntvfs_request
*req
, union smb_notify
*info
)
318 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
319 if (!ntvfs
->ops
->notify
) {
320 return NT_STATUS_NOT_IMPLEMENTED
;
322 return ntvfs
->ops
->notify(ntvfs
, req
, info
);
326 cancel an outstanding async request
328 _PUBLIC_ NTSTATUS
ntvfs_cancel(struct ntvfs_request
*req
)
330 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
331 if (!ntvfs
->ops
->cancel
) {
332 return NT_STATUS_NOT_IMPLEMENTED
;
334 return ntvfs
->ops
->cancel(ntvfs
, req
);
338 _PUBLIC_ NTSTATUS
ntvfs_next_connect(struct ntvfs_module_context
*ntvfs
,
339 struct ntvfs_request
*req
, const char *sharename
)
341 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->connect
) {
342 return NT_STATUS_NOT_IMPLEMENTED
;
344 return ntvfs
->next
->ops
->connect(ntvfs
->next
, req
, sharename
);
347 _PUBLIC_ NTSTATUS
ntvfs_next_disconnect(struct ntvfs_module_context
*ntvfs
)
349 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->disconnect
) {
350 return NT_STATUS_NOT_IMPLEMENTED
;
352 return ntvfs
->next
->ops
->disconnect(ntvfs
->next
);
355 /* async_setup - called when setting up for a async request */
356 _PUBLIC_ NTSTATUS
ntvfs_next_async_setup(struct ntvfs_module_context
*ntvfs
,
357 struct ntvfs_request
*req
,
360 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->async_setup
) {
361 return NT_STATUS_NOT_IMPLEMENTED
;
363 return ntvfs
->next
->ops
->async_setup(ntvfs
->next
, req
, private);
366 /* filesystem operations */
367 _PUBLIC_ NTSTATUS
ntvfs_next_fsinfo(struct ntvfs_module_context
*ntvfs
,
368 struct ntvfs_request
*req
,
369 union smb_fsinfo
*fs
)
371 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->fsinfo
) {
372 return NT_STATUS_NOT_IMPLEMENTED
;
374 return ntvfs
->next
->ops
->fsinfo(ntvfs
->next
, req
, fs
);
377 /* path operations */
378 _PUBLIC_ NTSTATUS
ntvfs_next_unlink(struct ntvfs_module_context
*ntvfs
,
379 struct ntvfs_request
*req
,
380 union smb_unlink
*unl
)
382 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->unlink
) {
383 return NT_STATUS_NOT_IMPLEMENTED
;
385 return ntvfs
->next
->ops
->unlink(ntvfs
->next
, req
, unl
);
388 _PUBLIC_ NTSTATUS
ntvfs_next_chkpath(struct ntvfs_module_context
*ntvfs
,
389 struct ntvfs_request
*req
,
390 union smb_chkpath
*cp
)
392 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->chkpath
) {
393 return NT_STATUS_NOT_IMPLEMENTED
;
395 return ntvfs
->next
->ops
->chkpath(ntvfs
->next
, req
, cp
);
398 _PUBLIC_ NTSTATUS
ntvfs_next_qpathinfo(struct ntvfs_module_context
*ntvfs
,
399 struct ntvfs_request
*req
,
400 union smb_fileinfo
*st
)
402 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->qpathinfo
) {
403 return NT_STATUS_NOT_IMPLEMENTED
;
405 return ntvfs
->next
->ops
->qpathinfo(ntvfs
->next
, req
, st
);
408 _PUBLIC_ NTSTATUS
ntvfs_next_setpathinfo(struct ntvfs_module_context
*ntvfs
,
409 struct ntvfs_request
*req
,
410 union smb_setfileinfo
*st
)
412 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->setpathinfo
) {
413 return NT_STATUS_NOT_IMPLEMENTED
;
415 return ntvfs
->next
->ops
->setpathinfo(ntvfs
->next
, req
, st
);
418 _PUBLIC_ NTSTATUS
ntvfs_next_mkdir(struct ntvfs_module_context
*ntvfs
,
419 struct ntvfs_request
*req
,
422 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->mkdir
) {
423 return NT_STATUS_NOT_IMPLEMENTED
;
425 return ntvfs
->next
->ops
->mkdir(ntvfs
->next
, req
, md
);
428 _PUBLIC_ NTSTATUS
ntvfs_next_rmdir(struct ntvfs_module_context
*ntvfs
,
429 struct ntvfs_request
*req
,
430 struct smb_rmdir
*rd
)
432 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->rmdir
) {
433 return NT_STATUS_NOT_IMPLEMENTED
;
435 return ntvfs
->next
->ops
->rmdir(ntvfs
->next
, req
, rd
);
438 _PUBLIC_ NTSTATUS
ntvfs_next_rename(struct ntvfs_module_context
*ntvfs
,
439 struct ntvfs_request
*req
,
440 union smb_rename
*ren
)
442 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->rename
) {
443 return NT_STATUS_NOT_IMPLEMENTED
;
445 return ntvfs
->next
->ops
->rename(ntvfs
->next
, req
, ren
);
448 _PUBLIC_ NTSTATUS
ntvfs_next_copy(struct ntvfs_module_context
*ntvfs
,
449 struct ntvfs_request
*req
,
452 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->copy
) {
453 return NT_STATUS_NOT_IMPLEMENTED
;
455 return ntvfs
->next
->ops
->copy(ntvfs
->next
, req
, cp
);
458 _PUBLIC_ NTSTATUS
ntvfs_next_open(struct ntvfs_module_context
*ntvfs
,
459 struct ntvfs_request
*req
,
462 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->open
) {
463 return NT_STATUS_NOT_IMPLEMENTED
;
465 return ntvfs
->next
->ops
->open(ntvfs
->next
, req
, oi
);
469 /* directory search */
470 _PUBLIC_ NTSTATUS
ntvfs_next_search_first(struct ntvfs_module_context
*ntvfs
,
471 struct ntvfs_request
*req
,
472 union smb_search_first
*io
, void *private,
473 BOOL (*callback
)(void *private, union smb_search_data
*file
))
475 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->search_first
) {
476 return NT_STATUS_NOT_IMPLEMENTED
;
478 return ntvfs
->next
->ops
->search_first(ntvfs
->next
, req
, io
, private, callback
);
481 _PUBLIC_ NTSTATUS
ntvfs_next_search_next(struct ntvfs_module_context
*ntvfs
,
482 struct ntvfs_request
*req
,
483 union smb_search_next
*io
, void *private,
484 BOOL (*callback
)(void *private, union smb_search_data
*file
))
486 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->search_next
) {
487 return NT_STATUS_NOT_IMPLEMENTED
;
489 return ntvfs
->next
->ops
->search_next(ntvfs
->next
, req
, io
, private, callback
);
492 _PUBLIC_ NTSTATUS
ntvfs_next_search_close(struct ntvfs_module_context
*ntvfs
,
493 struct ntvfs_request
*req
,
494 union smb_search_close
*io
)
496 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->search_close
) {
497 return NT_STATUS_NOT_IMPLEMENTED
;
499 return ntvfs
->next
->ops
->search_close(ntvfs
->next
, req
, io
);
502 /* operations on open files */
503 _PUBLIC_ NTSTATUS
ntvfs_next_ioctl(struct ntvfs_module_context
*ntvfs
,
504 struct ntvfs_request
*req
,
507 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->ioctl
) {
508 return NT_STATUS_NOT_IMPLEMENTED
;
510 return ntvfs
->next
->ops
->ioctl(ntvfs
->next
, req
, io
);
513 _PUBLIC_ NTSTATUS
ntvfs_next_read(struct ntvfs_module_context
*ntvfs
,
514 struct ntvfs_request
*req
,
517 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->read
) {
518 return NT_STATUS_NOT_IMPLEMENTED
;
520 return ntvfs
->next
->ops
->read(ntvfs
->next
, req
, io
);
523 _PUBLIC_ NTSTATUS
ntvfs_next_write(struct ntvfs_module_context
*ntvfs
,
524 struct ntvfs_request
*req
,
527 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->write
) {
528 return NT_STATUS_NOT_IMPLEMENTED
;
530 return ntvfs
->next
->ops
->write(ntvfs
->next
, req
, io
);
533 _PUBLIC_ NTSTATUS
ntvfs_next_seek(struct ntvfs_module_context
*ntvfs
,
534 struct ntvfs_request
*req
,
537 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->seek
) {
538 return NT_STATUS_NOT_IMPLEMENTED
;
540 return ntvfs
->next
->ops
->seek(ntvfs
->next
, req
, io
);
543 _PUBLIC_ NTSTATUS
ntvfs_next_flush(struct ntvfs_module_context
*ntvfs
,
544 struct ntvfs_request
*req
,
545 union smb_flush
*flush
)
547 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->flush
) {
548 return NT_STATUS_NOT_IMPLEMENTED
;
550 return ntvfs
->next
->ops
->flush(ntvfs
->next
, req
, flush
);
553 _PUBLIC_ NTSTATUS
ntvfs_next_lock(struct ntvfs_module_context
*ntvfs
,
554 struct ntvfs_request
*req
,
557 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->lock
) {
558 return NT_STATUS_NOT_IMPLEMENTED
;
560 return ntvfs
->next
->ops
->lock(ntvfs
->next
, req
, lck
);
563 _PUBLIC_ NTSTATUS
ntvfs_next_qfileinfo(struct ntvfs_module_context
*ntvfs
,
564 struct ntvfs_request
*req
,
565 union smb_fileinfo
*info
)
567 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->qfileinfo
) {
568 return NT_STATUS_NOT_IMPLEMENTED
;
570 return ntvfs
->next
->ops
->qfileinfo(ntvfs
->next
, req
, info
);
573 _PUBLIC_ NTSTATUS
ntvfs_next_setfileinfo(struct ntvfs_module_context
*ntvfs
,
574 struct ntvfs_request
*req
,
575 union smb_setfileinfo
*info
)
577 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->setfileinfo
) {
578 return NT_STATUS_NOT_IMPLEMENTED
;
580 return ntvfs
->next
->ops
->setfileinfo(ntvfs
->next
, req
, info
);
583 _PUBLIC_ NTSTATUS
ntvfs_next_close(struct ntvfs_module_context
*ntvfs
,
584 struct ntvfs_request
*req
,
587 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->close
) {
588 return NT_STATUS_NOT_IMPLEMENTED
;
590 return ntvfs
->next
->ops
->close(ntvfs
->next
, req
, io
);
593 /* trans interface - used by IPC backend for pipes and RAP calls */
594 _PUBLIC_ NTSTATUS
ntvfs_next_trans(struct ntvfs_module_context
*ntvfs
,
595 struct ntvfs_request
*req
,
596 struct smb_trans2
*trans
)
598 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->trans
) {
599 return NT_STATUS_NOT_IMPLEMENTED
;
601 return ntvfs
->next
->ops
->trans(ntvfs
->next
, req
, trans
);
604 /* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
605 _PUBLIC_ NTSTATUS
ntvfs_next_trans2(struct ntvfs_module_context
*ntvfs
,
606 struct ntvfs_request
*req
,
607 struct smb_trans2
*trans2
)
609 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->trans2
) {
610 return NT_STATUS_NOT_IMPLEMENTED
;
612 return ntvfs
->next
->ops
->trans2(ntvfs
->next
, req
, trans2
);
616 change notify request
618 _PUBLIC_ NTSTATUS
ntvfs_next_notify(struct ntvfs_module_context
*ntvfs
,
619 struct ntvfs_request
*req
,
620 union smb_notify
*info
)
622 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->notify
) {
623 return NT_STATUS_NOT_IMPLEMENTED
;
625 return ntvfs
->next
->ops
->notify(ntvfs
->next
, req
, info
);
628 /* cancel - called to cancel an outstanding async request */
629 _PUBLIC_ NTSTATUS
ntvfs_next_cancel(struct ntvfs_module_context
*ntvfs
,
630 struct ntvfs_request
*req
)
632 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->cancel
) {
633 return NT_STATUS_NOT_IMPLEMENTED
;
635 return ntvfs
->next
->ops
->cancel(ntvfs
->next
, req
);
638 /* printing specific operations */
639 _PUBLIC_ NTSTATUS
ntvfs_next_lpq(struct ntvfs_module_context
*ntvfs
,
640 struct ntvfs_request
*req
,
643 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->lpq
) {
644 return NT_STATUS_NOT_IMPLEMENTED
;
646 return ntvfs
->next
->ops
->lpq(ntvfs
->next
, req
, lpq
);
650 /* logoff - called when a vuid is closed */
651 _PUBLIC_ NTSTATUS
ntvfs_next_logoff(struct ntvfs_module_context
*ntvfs
,
652 struct ntvfs_request
*req
)
654 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->logoff
) {
655 return NT_STATUS_NOT_IMPLEMENTED
;
657 return ntvfs
->next
->ops
->logoff(ntvfs
->next
, req
);
660 _PUBLIC_ NTSTATUS
ntvfs_next_exit(struct ntvfs_module_context
*ntvfs
,
661 struct ntvfs_request
*req
)
663 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->exit
) {
664 return NT_STATUS_NOT_IMPLEMENTED
;
666 return ntvfs
->next
->ops
->exit(ntvfs
->next
, req
);
670 _PUBLIC_ NTSTATUS
ntvfs_set_oplock_handler(struct ntvfs_context
*ntvfs
,
671 NTSTATUS (*handler
)(void *private_data
, struct ntvfs_handle
*handle
, uint8_t level
),
674 ntvfs
->oplock
.handler
= handler
;
675 ntvfs
->oplock
.private_data
= private_data
;
679 _PUBLIC_ NTSTATUS
ntvfs_send_oplock_break(struct ntvfs_module_context
*ntvfs
,
680 struct ntvfs_handle
*handle
, uint8_t level
)
682 if (!ntvfs
->ctx
->oplock
.handler
) {
686 return ntvfs
->ctx
->oplock
.handler(ntvfs
->ctx
->oplock
.private_data
, handle
, level
);
689 /* client connection callback */
690 _PUBLIC_ NTSTATUS
ntvfs_set_addr_callbacks(struct ntvfs_context
*ntvfs
,
691 struct socket_address
*(*my_addr
)(void *private_data
, TALLOC_CTX
*mem_ctx
),
692 struct socket_address
*(*peer_addr
)(void *private_data
, TALLOC_CTX
*mem_ctx
),
695 ntvfs
->client
.get_peer_addr
= my_addr
;
696 ntvfs
->client
.get_my_addr
= peer_addr
;
697 ntvfs
->client
.private_data
= private_data
;
701 _PUBLIC_
struct socket_address
*ntvfs_get_my_addr(struct ntvfs_module_context
*ntvfs
, TALLOC_CTX
*mem_ctx
)
703 if (!ntvfs
->ctx
->client
.get_my_addr
) {
707 return ntvfs
->ctx
->client
.get_my_addr(ntvfs
->ctx
->client
.private_data
, mem_ctx
);
710 _PUBLIC_
struct socket_address
*ntvfs_get_peer_addr(struct ntvfs_module_context
*ntvfs
, TALLOC_CTX
*mem_ctx
)
712 if (!ntvfs
->ctx
->client
.get_peer_addr
) {
716 return ntvfs
->ctx
->client
.get_peer_addr(ntvfs
->ctx
->client
.private_data
, mem_ctx
);