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 3 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, see <http://www.gnu.org/licenses/>.
22 #include "ntvfs/ntvfs.h"
24 /* connect/disconnect */
25 NTSTATUS
ntvfs_connect(struct ntvfs_request
*req
, const char *sharename
)
27 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
28 if (!ntvfs
->ops
->connect
) {
29 return NT_STATUS_NOT_IMPLEMENTED
;
31 return ntvfs
->ops
->connect(ntvfs
, req
, sharename
);
34 NTSTATUS
ntvfs_disconnect(struct ntvfs_context
*ntvfs_ctx
)
36 struct ntvfs_module_context
*ntvfs
;
37 if (ntvfs_ctx
== NULL
) {
38 return NT_STATUS_INVALID_CONNECTION
;
40 ntvfs
= ntvfs_ctx
->modules
;
41 if (!ntvfs
->ops
->disconnect
) {
42 return NT_STATUS_NOT_IMPLEMENTED
;
44 return ntvfs
->ops
->disconnect(ntvfs
);
47 /* async setup - called by a backend that wants to setup any state for
49 NTSTATUS
ntvfs_async_setup(struct ntvfs_request
*req
, void *private_data
)
51 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
52 if (!ntvfs
->ops
->async_setup
) {
53 return NT_STATUS_NOT_IMPLEMENTED
;
55 return ntvfs
->ops
->async_setup(ntvfs
, req
, private_data
);
58 /* filesystem operations */
59 NTSTATUS
ntvfs_fsinfo(struct ntvfs_request
*req
, union smb_fsinfo
*fs
)
61 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
62 if (!ntvfs
->ops
->fsinfo
) {
63 return NT_STATUS_NOT_IMPLEMENTED
;
65 return ntvfs
->ops
->fsinfo(ntvfs
, req
, fs
);
69 NTSTATUS
ntvfs_unlink(struct ntvfs_request
*req
, union smb_unlink
*unl
)
71 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
72 if (!ntvfs
->ops
->unlink
) {
73 return NT_STATUS_NOT_IMPLEMENTED
;
75 return ntvfs
->ops
->unlink(ntvfs
, req
, unl
);
78 NTSTATUS
ntvfs_chkpath(struct ntvfs_request
*req
, union smb_chkpath
*cp
)
80 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
81 if (!ntvfs
->ops
->chkpath
) {
82 return NT_STATUS_NOT_IMPLEMENTED
;
84 return ntvfs
->ops
->chkpath(ntvfs
, req
, cp
);
87 NTSTATUS
ntvfs_qpathinfo(struct ntvfs_request
*req
, union smb_fileinfo
*st
)
89 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
90 if (!ntvfs
->ops
->qpathinfo
) {
91 return NT_STATUS_NOT_IMPLEMENTED
;
93 return ntvfs
->ops
->qpathinfo(ntvfs
, req
, st
);
96 NTSTATUS
ntvfs_setpathinfo(struct ntvfs_request
*req
, union smb_setfileinfo
*st
)
98 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
99 if (!ntvfs
->ops
->setpathinfo
) {
100 return NT_STATUS_NOT_IMPLEMENTED
;
102 return ntvfs
->ops
->setpathinfo(ntvfs
, req
, st
);
105 NTSTATUS
ntvfs_open(struct ntvfs_request
*req
, union smb_open
*oi
)
107 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
108 if (!ntvfs
->ops
->open
) {
109 return NT_STATUS_NOT_IMPLEMENTED
;
111 return ntvfs
->ops
->open(ntvfs
, req
, oi
);
114 NTSTATUS
ntvfs_mkdir(struct ntvfs_request
*req
, union smb_mkdir
*md
)
116 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
117 if (!ntvfs
->ops
->mkdir
) {
118 return NT_STATUS_NOT_IMPLEMENTED
;
120 return ntvfs
->ops
->mkdir(ntvfs
, req
, md
);
123 NTSTATUS
ntvfs_rmdir(struct ntvfs_request
*req
, struct smb_rmdir
*rd
)
125 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
126 if (!ntvfs
->ops
->rmdir
) {
127 return NT_STATUS_NOT_IMPLEMENTED
;
129 return ntvfs
->ops
->rmdir(ntvfs
, req
, rd
);
132 NTSTATUS
ntvfs_rename(struct ntvfs_request
*req
, union smb_rename
*ren
)
134 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
135 if (!ntvfs
->ops
->rename
) {
136 return NT_STATUS_NOT_IMPLEMENTED
;
138 return ntvfs
->ops
->rename(ntvfs
, req
, ren
);
141 NTSTATUS
ntvfs_copy(struct ntvfs_request
*req
, struct smb_copy
*cp
)
143 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
144 if (!ntvfs
->ops
->copy
) {
145 return NT_STATUS_NOT_IMPLEMENTED
;
147 return ntvfs
->ops
->copy(ntvfs
, req
, cp
);
150 /* directory search */
151 NTSTATUS
ntvfs_search_first(struct ntvfs_request
*req
, union smb_search_first
*io
, void *private_data
,
152 bool ntvfs_callback(void *private_data
, const union smb_search_data
*file
))
154 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
155 if (!ntvfs
->ops
->search_first
) {
156 return NT_STATUS_NOT_IMPLEMENTED
;
158 return ntvfs
->ops
->search_first(ntvfs
, req
, io
, private_data
, ntvfs_callback
);
161 NTSTATUS
ntvfs_search_next(struct ntvfs_request
*req
, union smb_search_next
*io
, void *private_data
,
162 bool ntvfs_callback(void *private_data
, const union smb_search_data
*file
))
164 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
165 if (!ntvfs
->ops
->search_next
) {
166 return NT_STATUS_NOT_IMPLEMENTED
;
168 return ntvfs
->ops
->search_next(ntvfs
, req
, io
, private_data
, ntvfs_callback
);
171 NTSTATUS
ntvfs_search_close(struct ntvfs_request
*req
, union smb_search_close
*io
)
173 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
174 if (!ntvfs
->ops
->search_close
) {
175 return NT_STATUS_NOT_IMPLEMENTED
;
177 return ntvfs
->ops
->search_close(ntvfs
, req
, io
);
180 /* operations on open files */
181 NTSTATUS
ntvfs_ioctl(struct ntvfs_request
*req
, union smb_ioctl
*io
)
183 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
184 if (!ntvfs
->ops
->ioctl
) {
185 return NT_STATUS_NOT_IMPLEMENTED
;
187 return ntvfs
->ops
->ioctl(ntvfs
, req
, io
);
190 NTSTATUS
ntvfs_read(struct ntvfs_request
*req
, union smb_read
*io
)
192 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
193 if (!ntvfs
->ops
->read
) {
194 return NT_STATUS_NOT_IMPLEMENTED
;
196 return ntvfs
->ops
->read(ntvfs
, req
, io
);
199 NTSTATUS
ntvfs_write(struct ntvfs_request
*req
, union smb_write
*io
)
201 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
202 if (!ntvfs
->ops
->write
) {
203 return NT_STATUS_NOT_IMPLEMENTED
;
205 return ntvfs
->ops
->write(ntvfs
, req
, io
);
208 NTSTATUS
ntvfs_seek(struct ntvfs_request
*req
, union smb_seek
*io
)
210 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
211 if (!ntvfs
->ops
->seek
) {
212 return NT_STATUS_NOT_IMPLEMENTED
;
214 return ntvfs
->ops
->seek(ntvfs
, req
, io
);
217 NTSTATUS
ntvfs_flush(struct ntvfs_request
*req
,
218 union smb_flush
*flush
)
220 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
221 if (!ntvfs
->ops
->flush
) {
222 return NT_STATUS_NOT_IMPLEMENTED
;
224 return ntvfs
->ops
->flush(ntvfs
, req
, flush
);
227 NTSTATUS
ntvfs_lock(struct ntvfs_request
*req
, union smb_lock
*lck
)
229 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
230 if (!ntvfs
->ops
->lock
) {
231 return NT_STATUS_NOT_IMPLEMENTED
;
233 return ntvfs
->ops
->lock(ntvfs
, req
, lck
);
236 NTSTATUS
ntvfs_qfileinfo(struct ntvfs_request
*req
, union smb_fileinfo
*info
)
238 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
239 if (!ntvfs
->ops
->qfileinfo
) {
240 return NT_STATUS_NOT_IMPLEMENTED
;
242 return ntvfs
->ops
->qfileinfo(ntvfs
, req
, info
);
245 NTSTATUS
ntvfs_setfileinfo(struct ntvfs_request
*req
, union smb_setfileinfo
*info
)
247 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
248 if (!ntvfs
->ops
->setfileinfo
) {
249 return NT_STATUS_NOT_IMPLEMENTED
;
251 return ntvfs
->ops
->setfileinfo(ntvfs
, req
, info
);
254 NTSTATUS
ntvfs_close(struct ntvfs_request
*req
, union smb_close
*io
)
256 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
257 if (!ntvfs
->ops
->close
) {
258 return NT_STATUS_NOT_IMPLEMENTED
;
260 return ntvfs
->ops
->close(ntvfs
, req
, io
);
263 /* trans interface - used by IPC backend for pipes and RAP calls */
264 NTSTATUS
ntvfs_trans(struct ntvfs_request
*req
, struct smb_trans2
*trans
)
266 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
267 if (!ntvfs
->ops
->trans
) {
268 return NT_STATUS_NOT_IMPLEMENTED
;
270 return ntvfs
->ops
->trans(ntvfs
, req
, trans
);
273 /* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
274 NTSTATUS
ntvfs_trans2(struct ntvfs_request
*req
, struct smb_trans2
*trans2
)
276 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
277 if (!ntvfs
->ops
->trans2
) {
278 return NT_STATUS_NOT_IMPLEMENTED
;
280 return ntvfs
->ops
->trans2(ntvfs
, req
, trans2
);
283 /* printing specific operations */
284 NTSTATUS
ntvfs_lpq(struct ntvfs_request
*req
, union smb_lpq
*lpq
)
286 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
287 if (!ntvfs
->ops
->lpq
) {
288 return NT_STATUS_NOT_IMPLEMENTED
;
290 return ntvfs
->ops
->lpq(ntvfs
, req
, lpq
);
293 /* logoff - called when a vuid is closed */
294 NTSTATUS
ntvfs_logoff(struct ntvfs_request
*req
)
296 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
297 if (!ntvfs
->ops
->logoff
) {
298 return NT_STATUS_NOT_IMPLEMENTED
;
300 return ntvfs
->ops
->logoff(ntvfs
, req
);
303 NTSTATUS
ntvfs_exit(struct ntvfs_request
*req
)
305 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
306 if (!ntvfs
->ops
->exit
) {
307 return NT_STATUS_NOT_IMPLEMENTED
;
309 return ntvfs
->ops
->exit(ntvfs
, req
);
313 change notify request
315 NTSTATUS
ntvfs_notify(struct ntvfs_request
*req
, union smb_notify
*info
)
317 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
318 if (!ntvfs
->ops
->notify
) {
319 return NT_STATUS_NOT_IMPLEMENTED
;
321 return ntvfs
->ops
->notify(ntvfs
, req
, info
);
325 cancel an outstanding async request
327 NTSTATUS
ntvfs_cancel(struct ntvfs_request
*req
)
329 struct ntvfs_module_context
*ntvfs
= req
->ctx
->modules
;
330 if (!ntvfs
->ops
->cancel
) {
331 return NT_STATUS_NOT_IMPLEMENTED
;
333 return ntvfs
->ops
->cancel(ntvfs
, req
);
337 NTSTATUS
ntvfs_next_connect(struct ntvfs_module_context
*ntvfs
,
338 struct ntvfs_request
*req
, const char *sharename
)
340 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->connect
) {
341 return NT_STATUS_NOT_IMPLEMENTED
;
343 return ntvfs
->next
->ops
->connect(ntvfs
->next
, req
, sharename
);
346 NTSTATUS
ntvfs_next_disconnect(struct ntvfs_module_context
*ntvfs
)
348 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->disconnect
) {
349 return NT_STATUS_NOT_IMPLEMENTED
;
351 return ntvfs
->next
->ops
->disconnect(ntvfs
->next
);
354 /* async_setup - called when setting up for a async request */
355 NTSTATUS
ntvfs_next_async_setup(struct ntvfs_module_context
*ntvfs
,
356 struct ntvfs_request
*req
,
359 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->async_setup
) {
360 return NT_STATUS_NOT_IMPLEMENTED
;
362 return ntvfs
->next
->ops
->async_setup(ntvfs
->next
, req
, private_data
);
365 /* filesystem operations */
366 NTSTATUS
ntvfs_next_fsinfo(struct ntvfs_module_context
*ntvfs
,
367 struct ntvfs_request
*req
,
368 union smb_fsinfo
*fs
)
370 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->fsinfo
) {
371 return NT_STATUS_NOT_IMPLEMENTED
;
373 return ntvfs
->next
->ops
->fsinfo(ntvfs
->next
, req
, fs
);
376 /* path operations */
377 NTSTATUS
ntvfs_next_unlink(struct ntvfs_module_context
*ntvfs
,
378 struct ntvfs_request
*req
,
379 union smb_unlink
*unl
)
381 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->unlink
) {
382 return NT_STATUS_NOT_IMPLEMENTED
;
384 return ntvfs
->next
->ops
->unlink(ntvfs
->next
, req
, unl
);
387 NTSTATUS
ntvfs_next_chkpath(struct ntvfs_module_context
*ntvfs
,
388 struct ntvfs_request
*req
,
389 union smb_chkpath
*cp
)
391 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->chkpath
) {
392 return NT_STATUS_NOT_IMPLEMENTED
;
394 return ntvfs
->next
->ops
->chkpath(ntvfs
->next
, req
, cp
);
397 NTSTATUS
ntvfs_next_qpathinfo(struct ntvfs_module_context
*ntvfs
,
398 struct ntvfs_request
*req
,
399 union smb_fileinfo
*st
)
401 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->qpathinfo
) {
402 return NT_STATUS_NOT_IMPLEMENTED
;
404 return ntvfs
->next
->ops
->qpathinfo(ntvfs
->next
, req
, st
);
407 NTSTATUS
ntvfs_next_setpathinfo(struct ntvfs_module_context
*ntvfs
,
408 struct ntvfs_request
*req
,
409 union smb_setfileinfo
*st
)
411 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->setpathinfo
) {
412 return NT_STATUS_NOT_IMPLEMENTED
;
414 return ntvfs
->next
->ops
->setpathinfo(ntvfs
->next
, req
, st
);
417 NTSTATUS
ntvfs_next_mkdir(struct ntvfs_module_context
*ntvfs
,
418 struct ntvfs_request
*req
,
421 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->mkdir
) {
422 return NT_STATUS_NOT_IMPLEMENTED
;
424 return ntvfs
->next
->ops
->mkdir(ntvfs
->next
, req
, md
);
427 NTSTATUS
ntvfs_next_rmdir(struct ntvfs_module_context
*ntvfs
,
428 struct ntvfs_request
*req
,
429 struct smb_rmdir
*rd
)
431 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->rmdir
) {
432 return NT_STATUS_NOT_IMPLEMENTED
;
434 return ntvfs
->next
->ops
->rmdir(ntvfs
->next
, req
, rd
);
437 NTSTATUS
ntvfs_next_rename(struct ntvfs_module_context
*ntvfs
,
438 struct ntvfs_request
*req
,
439 union smb_rename
*ren
)
441 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->rename
) {
442 return NT_STATUS_NOT_IMPLEMENTED
;
444 return ntvfs
->next
->ops
->rename(ntvfs
->next
, req
, ren
);
447 NTSTATUS
ntvfs_next_copy(struct ntvfs_module_context
*ntvfs
,
448 struct ntvfs_request
*req
,
451 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->copy
) {
452 return NT_STATUS_NOT_IMPLEMENTED
;
454 return ntvfs
->next
->ops
->copy(ntvfs
->next
, req
, cp
);
457 NTSTATUS
ntvfs_next_open(struct ntvfs_module_context
*ntvfs
,
458 struct ntvfs_request
*req
,
461 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->open
) {
462 return NT_STATUS_NOT_IMPLEMENTED
;
464 return ntvfs
->next
->ops
->open(ntvfs
->next
, req
, oi
);
468 /* directory search */
469 NTSTATUS
ntvfs_next_search_first(struct ntvfs_module_context
*ntvfs
,
470 struct ntvfs_request
*req
,
471 union smb_search_first
*io
, void *private_data
,
472 bool (*callback
)(void *private_data
, const union smb_search_data
*file
))
474 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->search_first
) {
475 return NT_STATUS_NOT_IMPLEMENTED
;
477 return ntvfs
->next
->ops
->search_first(ntvfs
->next
, req
, io
, private_data
, callback
);
480 NTSTATUS
ntvfs_next_search_next(struct ntvfs_module_context
*ntvfs
,
481 struct ntvfs_request
*req
,
482 union smb_search_next
*io
, void *private_data
,
483 bool (*callback
)(void *private_data
, const union smb_search_data
*file
))
485 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->search_next
) {
486 return NT_STATUS_NOT_IMPLEMENTED
;
488 return ntvfs
->next
->ops
->search_next(ntvfs
->next
, req
, io
, private_data
, callback
);
491 NTSTATUS
ntvfs_next_search_close(struct ntvfs_module_context
*ntvfs
,
492 struct ntvfs_request
*req
,
493 union smb_search_close
*io
)
495 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->search_close
) {
496 return NT_STATUS_NOT_IMPLEMENTED
;
498 return ntvfs
->next
->ops
->search_close(ntvfs
->next
, req
, io
);
501 /* operations on open files */
502 NTSTATUS
ntvfs_next_ioctl(struct ntvfs_module_context
*ntvfs
,
503 struct ntvfs_request
*req
,
506 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->ioctl
) {
507 return NT_STATUS_NOT_IMPLEMENTED
;
509 return ntvfs
->next
->ops
->ioctl(ntvfs
->next
, req
, io
);
512 NTSTATUS
ntvfs_next_read(struct ntvfs_module_context
*ntvfs
,
513 struct ntvfs_request
*req
,
516 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->read
) {
517 return NT_STATUS_NOT_IMPLEMENTED
;
519 return ntvfs
->next
->ops
->read(ntvfs
->next
, req
, io
);
522 NTSTATUS
ntvfs_next_write(struct ntvfs_module_context
*ntvfs
,
523 struct ntvfs_request
*req
,
526 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->write
) {
527 return NT_STATUS_NOT_IMPLEMENTED
;
529 return ntvfs
->next
->ops
->write(ntvfs
->next
, req
, io
);
532 NTSTATUS
ntvfs_next_seek(struct ntvfs_module_context
*ntvfs
,
533 struct ntvfs_request
*req
,
536 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->seek
) {
537 return NT_STATUS_NOT_IMPLEMENTED
;
539 return ntvfs
->next
->ops
->seek(ntvfs
->next
, req
, io
);
542 NTSTATUS
ntvfs_next_flush(struct ntvfs_module_context
*ntvfs
,
543 struct ntvfs_request
*req
,
544 union smb_flush
*flush
)
546 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->flush
) {
547 return NT_STATUS_NOT_IMPLEMENTED
;
549 return ntvfs
->next
->ops
->flush(ntvfs
->next
, req
, flush
);
552 NTSTATUS
ntvfs_next_lock(struct ntvfs_module_context
*ntvfs
,
553 struct ntvfs_request
*req
,
556 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->lock
) {
557 return NT_STATUS_NOT_IMPLEMENTED
;
559 return ntvfs
->next
->ops
->lock(ntvfs
->next
, req
, lck
);
562 NTSTATUS
ntvfs_next_qfileinfo(struct ntvfs_module_context
*ntvfs
,
563 struct ntvfs_request
*req
,
564 union smb_fileinfo
*info
)
566 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->qfileinfo
) {
567 return NT_STATUS_NOT_IMPLEMENTED
;
569 return ntvfs
->next
->ops
->qfileinfo(ntvfs
->next
, req
, info
);
572 NTSTATUS
ntvfs_next_setfileinfo(struct ntvfs_module_context
*ntvfs
,
573 struct ntvfs_request
*req
,
574 union smb_setfileinfo
*info
)
576 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->setfileinfo
) {
577 return NT_STATUS_NOT_IMPLEMENTED
;
579 return ntvfs
->next
->ops
->setfileinfo(ntvfs
->next
, req
, info
);
582 NTSTATUS
ntvfs_next_close(struct ntvfs_module_context
*ntvfs
,
583 struct ntvfs_request
*req
,
586 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->close
) {
587 return NT_STATUS_NOT_IMPLEMENTED
;
589 return ntvfs
->next
->ops
->close(ntvfs
->next
, req
, io
);
592 /* trans interface - used by IPC backend for pipes and RAP calls */
593 NTSTATUS
ntvfs_next_trans(struct ntvfs_module_context
*ntvfs
,
594 struct ntvfs_request
*req
,
595 struct smb_trans2
*trans
)
597 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->trans
) {
598 return NT_STATUS_NOT_IMPLEMENTED
;
600 return ntvfs
->next
->ops
->trans(ntvfs
->next
, req
, trans
);
603 /* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
604 NTSTATUS
ntvfs_next_trans2(struct ntvfs_module_context
*ntvfs
,
605 struct ntvfs_request
*req
,
606 struct smb_trans2
*trans2
)
608 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->trans2
) {
609 return NT_STATUS_NOT_IMPLEMENTED
;
611 return ntvfs
->next
->ops
->trans2(ntvfs
->next
, req
, trans2
);
615 change notify request
617 NTSTATUS
ntvfs_next_notify(struct ntvfs_module_context
*ntvfs
,
618 struct ntvfs_request
*req
,
619 union smb_notify
*info
)
621 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->notify
) {
622 return NT_STATUS_NOT_IMPLEMENTED
;
624 return ntvfs
->next
->ops
->notify(ntvfs
->next
, req
, info
);
627 /* cancel - called to cancel an outstanding async request */
628 NTSTATUS
ntvfs_next_cancel(struct ntvfs_module_context
*ntvfs
,
629 struct ntvfs_request
*req
)
631 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->cancel
) {
632 return NT_STATUS_NOT_IMPLEMENTED
;
634 return ntvfs
->next
->ops
->cancel(ntvfs
->next
, req
);
637 /* printing specific operations */
638 NTSTATUS
ntvfs_next_lpq(struct ntvfs_module_context
*ntvfs
,
639 struct ntvfs_request
*req
,
642 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->lpq
) {
643 return NT_STATUS_NOT_IMPLEMENTED
;
645 return ntvfs
->next
->ops
->lpq(ntvfs
->next
, req
, lpq
);
649 /* logoff - called when a vuid is closed */
650 NTSTATUS
ntvfs_next_logoff(struct ntvfs_module_context
*ntvfs
,
651 struct ntvfs_request
*req
)
653 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->logoff
) {
654 return NT_STATUS_NOT_IMPLEMENTED
;
656 return ntvfs
->next
->ops
->logoff(ntvfs
->next
, req
);
659 NTSTATUS
ntvfs_next_exit(struct ntvfs_module_context
*ntvfs
,
660 struct ntvfs_request
*req
)
662 if (!ntvfs
->next
|| !ntvfs
->next
->ops
->exit
) {
663 return NT_STATUS_NOT_IMPLEMENTED
;
665 return ntvfs
->next
->ops
->exit(ntvfs
->next
, req
);
669 NTSTATUS
ntvfs_set_oplock_handler(struct ntvfs_context
*ntvfs
,
670 NTSTATUS (*handler
)(void *private_data
, struct ntvfs_handle
*handle
, uint8_t level
),
673 ntvfs
->oplock
.handler
= handler
;
674 ntvfs
->oplock
.private_data
= private_data
;
678 NTSTATUS
ntvfs_send_oplock_break(struct ntvfs_module_context
*ntvfs
,
679 struct ntvfs_handle
*handle
, uint8_t level
)
681 if (!ntvfs
->ctx
->oplock
.handler
) {
685 return ntvfs
->ctx
->oplock
.handler(ntvfs
->ctx
->oplock
.private_data
, handle
, level
);
688 /* client connection callback */
689 NTSTATUS
ntvfs_set_addr_callbacks(struct ntvfs_context
*ntvfs
,
690 struct socket_address
*(*my_addr
)(void *private_data
, TALLOC_CTX
*mem_ctx
),
691 struct socket_address
*(*peer_addr
)(void *private_data
, TALLOC_CTX
*mem_ctx
),
694 ntvfs
->client
.get_peer_addr
= my_addr
;
695 ntvfs
->client
.get_my_addr
= peer_addr
;
696 ntvfs
->client
.private_data
= private_data
;
700 struct socket_address
*ntvfs_get_my_addr(struct ntvfs_module_context
*ntvfs
, TALLOC_CTX
*mem_ctx
)
702 if (!ntvfs
->ctx
->client
.get_my_addr
) {
706 return ntvfs
->ctx
->client
.get_my_addr(ntvfs
->ctx
->client
.private_data
, mem_ctx
);
709 struct socket_address
*ntvfs_get_peer_addr(struct ntvfs_module_context
*ntvfs
, TALLOC_CTX
*mem_ctx
)
711 if (!ntvfs
->ctx
->client
.get_peer_addr
) {
715 return ntvfs
->ctx
->client
.get_peer_addr(ntvfs
->ctx
->client
.private_data
, mem_ctx
);