r22669: fix uninitialized element which was causing a crash with 'net password set'
[Samba.git] / source / ntvfs / ntvfs_interface.c
blobfc8fccca3314b79a5830f305bc145c7b659a642c
1 /*
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.
22 #include "includes.h"
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
49 a async request */
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);
69 /* path operations */
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);
337 /* initial setup */
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,
358 void *private)
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,
420 union smb_mkdir *md)
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,
450 struct smb_copy *cp)
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,
460 union smb_open *oi)
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,
505 union smb_ioctl *io)
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,
515 union smb_read *io)
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,
525 union smb_write *io)
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,
535 union smb_seek *io)
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,
555 union smb_lock *lck)
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,
585 union smb_close *io)
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,
641 union smb_lpq *lpq)
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);
669 /* oplock helpers */
670 _PUBLIC_ NTSTATUS ntvfs_set_oplock_handler(struct ntvfs_context *ntvfs,
671 NTSTATUS (*handler)(void *private_data, struct ntvfs_handle *handle, uint8_t level),
672 void *private_data)
674 ntvfs->oplock.handler = handler;
675 ntvfs->oplock.private_data = private_data;
676 return NT_STATUS_OK;
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) {
683 return NT_STATUS_OK;
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),
693 void *private_data)
695 ntvfs->client.get_peer_addr = my_addr;
696 ntvfs->client.get_my_addr = peer_addr;
697 ntvfs->client.private_data = private_data;
698 return NT_STATUS_OK;
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) {
704 return NULL;
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) {
713 return NULL;
716 return ntvfs->ctx->client.get_peer_addr(ntvfs->ctx->client.private_data, mem_ctx);