s4:ntvfs/nbench: s/private/nprivates
[Samba/gbeck.git] / source4 / ntvfs / nbench / vfs_nbench.c
blob7ba2e7c649cfd9efb5ff6cef8da948024d4010ab
1 /*
2 Unix SMB/CIFS implementation.
4 a pass-thru NTVFS module to record a NBENCH load file
6 Copyright (C) Andrew Tridgell 2004
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 "passthru" in this module refers to the next level of NTVFS being used
26 #include "includes.h"
27 #include "ntvfs/ntvfs.h"
28 #include "system/filesys.h"
30 /* this is stored in ntvfs_private */
31 struct nbench_private {
32 int log_fd;
36 log one request to the nbench log
38 static void nbench_log(struct ntvfs_request *req,
39 const char *format, ...) PRINTF_ATTRIBUTE(2, 3);
41 static void nbench_log(struct ntvfs_request *req,
42 const char *format, ...)
44 struct nbench_private *nprivates = req->async_states->ntvfs->private_data;
45 va_list ap;
46 char *s = NULL;
48 va_start(ap, format);
49 vasprintf(&s, format, ap);
50 va_end(ap);
52 write(nprivates->log_fd, s, strlen(s));
53 free(s);
56 static char *nbench_ntvfs_handle_string(struct ntvfs_request *req, struct ntvfs_handle *h)
58 DATA_BLOB key;
59 uint16_t fnum = 0;
61 key = ntvfs_handle_get_wire_key(h, req);
63 switch (key.length) {
64 case 2: /* SMB fnum */
65 fnum = SVAL(key.data, 0);
66 break;
67 default:
68 DEBUG(0,("%s: invalid wire handle size: %u\n",
69 __FUNCTION__, (unsigned)key.length));
70 break;
73 return talloc_asprintf(req, "%u", fnum);
77 this pass through macro operates on request contexts, and disables
78 async calls.
80 async calls are a pain for the nbench module as it makes pulling the
81 status code and any result parameters much harder.
83 #define PASS_THRU_REQ_PRE_ASYNC(ntvfs, req, op, par1) do { \
84 status = ntvfs_async_state_push(ntvfs, req, par1, nbench_##op##_send); \
85 if (!NT_STATUS_IS_OK(status)) { \
86 return status; \
87 } \
88 } while (0)
90 #define PASS_THRU_REQ_POST_ASYNC(req) do { \
91 req->async_states->status = status; \
92 if (!(req->async_states->state & NTVFS_ASYNC_STATE_ASYNC)) { \
93 req->async_states->send_fn(req); \
94 } \
95 } while (0)
97 #define PASS_THRU_REQ(ntvfs, req, op, par1, args) do { \
98 PASS_THRU_REQ_PRE_ASYNC(ntvfs, req, op, par1); \
99 status = ntvfs_next_##op args; \
100 PASS_THRU_REQ_POST_ASYNC(req); \
101 } while (0)
103 #define PASS_THRU_REP_POST(req) do { \
104 ntvfs_async_state_pop(req); \
105 if (req->async_states->state & NTVFS_ASYNC_STATE_ASYNC) { \
106 req->async_states->send_fn(req); \
108 } while (0)
111 connect to a share - used when a tree_connect operation comes in.
113 static NTSTATUS nbench_connect(struct ntvfs_module_context *ntvfs,
114 struct ntvfs_request *req, const char *sharename)
116 struct nbench_private *nprivates;
117 NTSTATUS status;
118 char *logname = NULL;
120 nprivates = talloc(ntvfs, struct nbench_private);
121 if (!nprivates) {
122 return NT_STATUS_NO_MEMORY;
125 asprintf(&logname, "/tmp/nbenchlog%d.%u", ntvfs->depth, getpid());
126 nprivates->log_fd = open(logname, O_WRONLY|O_CREAT|O_APPEND, 0644);
127 free(logname);
129 if (nprivates->log_fd == -1) {
130 DEBUG(0,("Failed to open nbench log\n"));
131 return NT_STATUS_UNSUCCESSFUL;
134 ntvfs->private_data = nprivates;
136 status = ntvfs_next_connect(ntvfs, req, sharename);
138 return status;
142 disconnect from a share
144 static NTSTATUS nbench_disconnect(struct ntvfs_module_context *ntvfs)
146 struct nbench_private *nprivates = ntvfs->private_data;
147 NTSTATUS status;
149 close(nprivates->log_fd);
151 status = ntvfs_next_disconnect(ntvfs);
153 return status;
157 delete a file - the dirtype specifies the file types to include in the search.
158 The name can contain CIFS wildcards, but rarely does (except with OS/2 clients)
160 static void nbench_unlink_send(struct ntvfs_request *req)
162 union smb_unlink *unl = req->async_states->private_data;
164 nbench_log(req, "Unlink \"%s\" 0x%x %s\n",
165 unl->unlink.in.pattern, unl->unlink.in.attrib,
166 get_nt_error_c_code(req->async_states->status));
168 PASS_THRU_REP_POST(req);
171 static NTSTATUS nbench_unlink(struct ntvfs_module_context *ntvfs,
172 struct ntvfs_request *req,
173 union smb_unlink *unl)
175 NTSTATUS status;
177 PASS_THRU_REQ(ntvfs, req, unlink, unl, (ntvfs, req, unl));
179 return status;
183 ioctl interface
185 static void nbench_ioctl_send(struct ntvfs_request *req)
187 nbench_log(req, "Ioctl - NOT HANDLED\n");
189 PASS_THRU_REP_POST(req);
192 static NTSTATUS nbench_ioctl(struct ntvfs_module_context *ntvfs,
193 struct ntvfs_request *req, union smb_ioctl *io)
195 NTSTATUS status;
197 PASS_THRU_REQ(ntvfs, req, ioctl, io, (ntvfs, req, io));
199 return status;
203 check if a directory exists
205 static void nbench_chkpath_send(struct ntvfs_request *req)
207 union smb_chkpath *cp = req->async_states->private_data;
209 nbench_log(req, "Chkpath \"%s\" %s\n",
210 cp->chkpath.in.path,
211 get_nt_error_c_code(req->async_states->status));
213 PASS_THRU_REP_POST(req);
216 static NTSTATUS nbench_chkpath(struct ntvfs_module_context *ntvfs,
217 struct ntvfs_request *req,
218 union smb_chkpath *cp)
220 NTSTATUS status;
222 PASS_THRU_REQ(ntvfs, req, chkpath, cp, (ntvfs, req, cp));
224 return status;
228 return info on a pathname
230 static void nbench_qpathinfo_send(struct ntvfs_request *req)
232 union smb_fileinfo *info = req->async_states->private_data;
234 nbench_log(req, "QUERY_PATH_INFORMATION \"%s\" %d %s\n",
235 info->generic.in.file.path,
236 info->generic.level,
237 get_nt_error_c_code(req->async_states->status));
239 PASS_THRU_REP_POST(req);
242 static NTSTATUS nbench_qpathinfo(struct ntvfs_module_context *ntvfs,
243 struct ntvfs_request *req, union smb_fileinfo *info)
245 NTSTATUS status;
247 PASS_THRU_REQ(ntvfs, req, qpathinfo, info, (ntvfs, req, info));
249 return status;
253 query info on a open file
255 static void nbench_qfileinfo_send(struct ntvfs_request *req)
257 union smb_fileinfo *info = req->async_states->private_data;
259 nbench_log(req, "QUERY_FILE_INFORMATION %s %d %s\n",
260 nbench_ntvfs_handle_string(req, info->generic.in.file.ntvfs),
261 info->generic.level,
262 get_nt_error_c_code(req->async_states->status));
264 PASS_THRU_REP_POST(req);
267 static NTSTATUS nbench_qfileinfo(struct ntvfs_module_context *ntvfs,
268 struct ntvfs_request *req, union smb_fileinfo *info)
270 NTSTATUS status;
272 PASS_THRU_REQ(ntvfs, req, qfileinfo, info, (ntvfs, req, info));
274 return status;
278 set info on a pathname
280 static void nbench_setpathinfo_send(struct ntvfs_request *req)
282 union smb_setfileinfo *st = req->async_states->private_data;
284 nbench_log(req, "SET_PATH_INFORMATION \"%s\" %d %s\n",
285 st->generic.in.file.path,
286 st->generic.level,
287 get_nt_error_c_code(req->async_states->status));
289 PASS_THRU_REP_POST(req);
292 static NTSTATUS nbench_setpathinfo(struct ntvfs_module_context *ntvfs,
293 struct ntvfs_request *req, union smb_setfileinfo *st)
295 NTSTATUS status;
297 PASS_THRU_REQ(ntvfs, req, setpathinfo, st, (ntvfs, req, st));
299 return status;
303 open a file
305 static void nbench_open_send(struct ntvfs_request *req)
307 union smb_open *io = req->async_states->private_data;
309 switch (io->generic.level) {
310 case RAW_OPEN_NTCREATEX:
311 if (!NT_STATUS_IS_OK(req->async_states->status)) {
312 ZERO_STRUCT(io->ntcreatex.out);
314 nbench_log(req, "NTCreateX \"%s\" 0x%x 0x%x %s %s\n",
315 io->ntcreatex.in.fname,
316 io->ntcreatex.in.create_options,
317 io->ntcreatex.in.open_disposition,
318 nbench_ntvfs_handle_string(req, io->ntcreatex.out.file.ntvfs),
319 get_nt_error_c_code(req->async_states->status));
320 break;
322 default:
323 nbench_log(req, "Open-%d - NOT HANDLED\n",
324 io->generic.level);
325 break;
328 PASS_THRU_REP_POST(req);
331 static NTSTATUS nbench_open(struct ntvfs_module_context *ntvfs,
332 struct ntvfs_request *req, union smb_open *io)
334 NTSTATUS status;
336 #undef open /* AIX defines open to be open64 */
337 PASS_THRU_REQ(ntvfs, req, open, io, (ntvfs, req, io));
339 return status;
343 create a directory
345 static void nbench_mkdir_send(struct ntvfs_request *req)
347 nbench_log(req, "Mkdir - NOT HANDLED\n");
349 PASS_THRU_REP_POST(req);
352 static NTSTATUS nbench_mkdir(struct ntvfs_module_context *ntvfs,
353 struct ntvfs_request *req, union smb_mkdir *md)
355 NTSTATUS status;
357 PASS_THRU_REQ(ntvfs, req, mkdir, md, (ntvfs, req, md));
359 return status;
363 remove a directory
365 static void nbench_rmdir_send(struct ntvfs_request *req)
367 struct smb_rmdir *rd = req->async_states->private_data;
369 nbench_log(req, "Rmdir \"%s\" %s\n",
370 rd->in.path,
371 get_nt_error_c_code(req->async_states->status));
373 PASS_THRU_REP_POST(req);
376 static NTSTATUS nbench_rmdir(struct ntvfs_module_context *ntvfs,
377 struct ntvfs_request *req, struct smb_rmdir *rd)
379 NTSTATUS status;
381 PASS_THRU_REQ(ntvfs, req, rmdir, rd, (ntvfs, req, rd));
383 return status;
387 rename a set of files
389 static void nbench_rename_send(struct ntvfs_request *req)
391 union smb_rename *ren = req->async_states->private_data;
393 switch (ren->generic.level) {
394 case RAW_RENAME_RENAME:
395 nbench_log(req, "Rename \"%s\" \"%s\" %s\n",
396 ren->rename.in.pattern1,
397 ren->rename.in.pattern2,
398 get_nt_error_c_code(req->async_states->status));
399 break;
401 default:
402 nbench_log(req, "Rename-%d - NOT HANDLED\n",
403 ren->generic.level);
404 break;
407 PASS_THRU_REP_POST(req);
410 static NTSTATUS nbench_rename(struct ntvfs_module_context *ntvfs,
411 struct ntvfs_request *req, union smb_rename *ren)
413 NTSTATUS status;
415 PASS_THRU_REQ(ntvfs, req, rename, ren, (ntvfs, req, ren));
417 return status;
421 copy a set of files
423 static void nbench_copy_send(struct ntvfs_request *req)
425 nbench_log(req, "Copy - NOT HANDLED\n");
427 PASS_THRU_REP_POST(req);
430 static NTSTATUS nbench_copy(struct ntvfs_module_context *ntvfs,
431 struct ntvfs_request *req, struct smb_copy *cp)
433 NTSTATUS status;
435 PASS_THRU_REQ(ntvfs, req, copy, cp, (ntvfs, req, cp));
437 return status;
441 read from a file
443 static void nbench_read_send(struct ntvfs_request *req)
445 union smb_read *rd = req->async_states->private_data;
447 switch (rd->generic.level) {
448 case RAW_READ_READX:
449 if (!NT_STATUS_IS_OK(req->async_states->status)) {
450 ZERO_STRUCT(rd->readx.out);
452 nbench_log(req, "ReadX %s %d %d %d %s\n",
453 nbench_ntvfs_handle_string(req, rd->readx.in.file.ntvfs),
454 (int)rd->readx.in.offset,
455 rd->readx.in.maxcnt,
456 rd->readx.out.nread,
457 get_nt_error_c_code(req->async_states->status));
458 break;
459 default:
460 nbench_log(req, "Read-%d - NOT HANDLED\n",
461 rd->generic.level);
462 break;
465 PASS_THRU_REP_POST(req);
468 static NTSTATUS nbench_read(struct ntvfs_module_context *ntvfs,
469 struct ntvfs_request *req, union smb_read *rd)
471 NTSTATUS status;
473 PASS_THRU_REQ(ntvfs, req, read, rd, (ntvfs, req, rd));
475 return status;
479 write to a file
481 static void nbench_write_send(struct ntvfs_request *req)
483 union smb_write *wr = req->async_states->private_data;
485 switch (wr->generic.level) {
486 case RAW_WRITE_WRITEX:
487 if (!NT_STATUS_IS_OK(req->async_states->status)) {
488 ZERO_STRUCT(wr->writex.out);
490 nbench_log(req, "WriteX %s %d %d %d %s\n",
491 nbench_ntvfs_handle_string(req, wr->writex.in.file.ntvfs),
492 (int)wr->writex.in.offset,
493 wr->writex.in.count,
494 wr->writex.out.nwritten,
495 get_nt_error_c_code(req->async_states->status));
496 break;
498 case RAW_WRITE_WRITE:
499 if (!NT_STATUS_IS_OK(req->async_states->status)) {
500 ZERO_STRUCT(wr->write.out);
502 nbench_log(req, "Write %s %d %d %d %s\n",
503 nbench_ntvfs_handle_string(req, wr->write.in.file.ntvfs),
504 wr->write.in.offset,
505 wr->write.in.count,
506 wr->write.out.nwritten,
507 get_nt_error_c_code(req->async_states->status));
508 break;
510 default:
511 nbench_log(req, "Write-%d - NOT HANDLED\n",
512 wr->generic.level);
513 break;
516 PASS_THRU_REP_POST(req);
519 static NTSTATUS nbench_write(struct ntvfs_module_context *ntvfs,
520 struct ntvfs_request *req, union smb_write *wr)
522 NTSTATUS status;
524 PASS_THRU_REQ(ntvfs, req, write, wr, (ntvfs, req, wr));
526 return status;
530 seek in a file
532 static void nbench_seek_send(struct ntvfs_request *req)
534 nbench_log(req, "Seek - NOT HANDLED\n");
536 PASS_THRU_REP_POST(req);
539 static NTSTATUS nbench_seek(struct ntvfs_module_context *ntvfs,
540 struct ntvfs_request *req,
541 union smb_seek *io)
543 NTSTATUS status;
545 PASS_THRU_REQ(ntvfs, req, seek, io, (ntvfs, req, io));
547 return status;
551 flush a file
553 static void nbench_flush_send(struct ntvfs_request *req)
555 union smb_flush *io = req->async_states->private_data;
557 switch (io->generic.level) {
558 case RAW_FLUSH_FLUSH:
559 nbench_log(req, "Flush %s %s\n",
560 nbench_ntvfs_handle_string(req, io->flush.in.file.ntvfs),
561 get_nt_error_c_code(req->async_states->status));
562 break;
563 case RAW_FLUSH_ALL:
564 nbench_log(req, "Flush %d %s\n",
565 0xFFFF,
566 get_nt_error_c_code(req->async_states->status));
567 break;
568 default:
569 nbench_log(req, "Flush-%d - NOT HANDLED\n",
570 io->generic.level);
571 break;
574 PASS_THRU_REP_POST(req);
577 static NTSTATUS nbench_flush(struct ntvfs_module_context *ntvfs,
578 struct ntvfs_request *req,
579 union smb_flush *io)
581 NTSTATUS status;
583 PASS_THRU_REQ(ntvfs, req, flush, io, (ntvfs, req, io));
585 return status;
589 close a file
591 static void nbench_close_send(struct ntvfs_request *req)
593 union smb_close *io = req->async_states->private_data;
595 switch (io->generic.level) {
596 case RAW_CLOSE_CLOSE:
597 nbench_log(req, "Close %s %s\n",
598 nbench_ntvfs_handle_string(req, io->close.in.file.ntvfs),
599 get_nt_error_c_code(req->async_states->status));
600 break;
602 default:
603 nbench_log(req, "Close-%d - NOT HANDLED\n",
604 io->generic.level);
605 break;
608 PASS_THRU_REP_POST(req);
611 static NTSTATUS nbench_close(struct ntvfs_module_context *ntvfs,
612 struct ntvfs_request *req, union smb_close *io)
614 NTSTATUS status;
616 PASS_THRU_REQ(ntvfs, req, close, io, (ntvfs, req, io));
618 return status;
622 exit - closing files
624 static void nbench_exit_send(struct ntvfs_request *req)
626 nbench_log(req, "Exit - NOT HANDLED\n");
628 PASS_THRU_REP_POST(req);
631 static NTSTATUS nbench_exit(struct ntvfs_module_context *ntvfs,
632 struct ntvfs_request *req)
634 NTSTATUS status;
636 PASS_THRU_REQ(ntvfs, req, exit, NULL, (ntvfs, req));
638 return status;
642 logoff - closing files
644 static void nbench_logoff_send(struct ntvfs_request *req)
646 nbench_log(req, "Logoff - NOT HANDLED\n");
648 PASS_THRU_REP_POST(req);
651 static NTSTATUS nbench_logoff(struct ntvfs_module_context *ntvfs,
652 struct ntvfs_request *req)
654 NTSTATUS status;
656 PASS_THRU_REQ(ntvfs, req, logoff, NULL, (ntvfs, req));
658 return status;
662 async_setup - send fn
664 static void nbench_async_setup_send(struct ntvfs_request *req)
666 PASS_THRU_REP_POST(req);
670 async setup
672 static NTSTATUS nbench_async_setup(struct ntvfs_module_context *ntvfs,
673 struct ntvfs_request *req,
674 void *private_data)
676 NTSTATUS status;
678 PASS_THRU_REQ(ntvfs, req, async_setup, NULL, (ntvfs, req, private_data));
680 return status;
684 static void nbench_cancel_send(struct ntvfs_request *req)
686 PASS_THRU_REP_POST(req);
690 cancel an existing async request
692 static NTSTATUS nbench_cancel(struct ntvfs_module_context *ntvfs,
693 struct ntvfs_request *req)
695 NTSTATUS status;
697 PASS_THRU_REQ(ntvfs, req, cancel, NULL, (ntvfs, req));
699 return status;
703 lock a byte range
705 static void nbench_lock_send(struct ntvfs_request *req)
707 union smb_lock *lck = req->async_states->private_data;
709 if (lck->generic.level == RAW_LOCK_LOCKX &&
710 lck->lockx.in.lock_cnt == 1 &&
711 lck->lockx.in.ulock_cnt == 0) {
712 nbench_log(req, "LockX %s %d %d %s\n",
713 nbench_ntvfs_handle_string(req, lck->lockx.in.file.ntvfs),
714 (int)lck->lockx.in.locks[0].offset,
715 (int)lck->lockx.in.locks[0].count,
716 get_nt_error_c_code(req->async_states->status));
717 } else if (lck->generic.level == RAW_LOCK_LOCKX &&
718 lck->lockx.in.ulock_cnt == 1) {
719 nbench_log(req, "UnlockX %s %d %d %s\n",
720 nbench_ntvfs_handle_string(req, lck->lockx.in.file.ntvfs),
721 (int)lck->lockx.in.locks[0].offset,
722 (int)lck->lockx.in.locks[0].count,
723 get_nt_error_c_code(req->async_states->status));
724 } else {
725 nbench_log(req, "Lock-%d - NOT HANDLED\n", lck->generic.level);
728 PASS_THRU_REP_POST(req);
731 static NTSTATUS nbench_lock(struct ntvfs_module_context *ntvfs,
732 struct ntvfs_request *req, union smb_lock *lck)
734 NTSTATUS status;
736 PASS_THRU_REQ(ntvfs, req, lock, lck, (ntvfs, req, lck));
738 return status;
742 set info on a open file
744 static void nbench_setfileinfo_send(struct ntvfs_request *req)
746 union smb_setfileinfo *info = req->async_states->private_data;
748 nbench_log(req, "SET_FILE_INFORMATION %s %d %s\n",
749 nbench_ntvfs_handle_string(req, info->generic.in.file.ntvfs),
750 info->generic.level,
751 get_nt_error_c_code(req->async_states->status));
753 PASS_THRU_REP_POST(req);
756 static NTSTATUS nbench_setfileinfo(struct ntvfs_module_context *ntvfs,
757 struct ntvfs_request *req,
758 union smb_setfileinfo *info)
760 NTSTATUS status;
762 PASS_THRU_REQ(ntvfs, req, setfileinfo, info, (ntvfs, req, info));
764 return status;
768 return filesystem space info
770 static void nbench_fsinfo_send(struct ntvfs_request *req)
772 union smb_fsinfo *fs = req->async_states->private_data;
774 nbench_log(req, "QUERY_FS_INFORMATION %d %s\n",
775 fs->generic.level,
776 get_nt_error_c_code(req->async_states->status));
778 PASS_THRU_REP_POST(req);
781 static NTSTATUS nbench_fsinfo(struct ntvfs_module_context *ntvfs,
782 struct ntvfs_request *req, union smb_fsinfo *fs)
784 NTSTATUS status;
786 PASS_THRU_REQ(ntvfs, req, fsinfo, fs, (ntvfs, req, fs));
788 return status;
792 return print queue info
794 static void nbench_lpq_send(struct ntvfs_request *req)
796 union smb_lpq *lpq = req->async_states->private_data;
798 nbench_log(req, "Lpq-%d - NOT HANDLED\n", lpq->generic.level);
800 PASS_THRU_REP_POST(req);
803 static NTSTATUS nbench_lpq(struct ntvfs_module_context *ntvfs,
804 struct ntvfs_request *req, union smb_lpq *lpq)
806 NTSTATUS status;
808 PASS_THRU_REQ(ntvfs, req, lpq, lpq, (ntvfs, req, lpq));
810 return status;
814 list files in a directory matching a wildcard pattern
816 static void nbench_search_first_send(struct ntvfs_request *req)
818 union smb_search_first *io = req->async_states->private_data;
820 switch (io->generic.level) {
821 case RAW_SEARCH_TRANS2:
822 if (NT_STATUS_IS_ERR(req->async_states->status)) {
823 ZERO_STRUCT(io->t2ffirst.out);
825 nbench_log(req, "FIND_FIRST \"%s\" %d %d %d %s\n",
826 io->t2ffirst.in.pattern,
827 io->t2ffirst.data_level,
828 io->t2ffirst.in.max_count,
829 io->t2ffirst.out.count,
830 get_nt_error_c_code(req->async_states->status));
831 break;
833 default:
834 nbench_log(req, "Search-%d - NOT HANDLED\n", io->generic.level);
835 break;
838 PASS_THRU_REP_POST(req);
841 static NTSTATUS nbench_search_first(struct ntvfs_module_context *ntvfs,
842 struct ntvfs_request *req, union smb_search_first *io,
843 void *search_private,
844 bool (*callback)(void *, const union smb_search_data *))
846 NTSTATUS status;
848 PASS_THRU_REQ(ntvfs, req, search_first, io, (ntvfs, req, io, search_private, callback));
850 return status;
853 /* continue a search */
854 static void nbench_search_next_send(struct ntvfs_request *req)
856 union smb_search_next *io = req->async_states->private_data;
858 nbench_log(req, "Searchnext-%d - NOT HANDLED\n", io->generic.level);
860 PASS_THRU_REP_POST(req);
863 static NTSTATUS nbench_search_next(struct ntvfs_module_context *ntvfs,
864 struct ntvfs_request *req, union smb_search_next *io,
865 void *search_private,
866 bool (*callback)(void *, const union smb_search_data *))
868 NTSTATUS status;
870 PASS_THRU_REQ(ntvfs, req, search_next, io, (ntvfs, req, io, search_private, callback));
872 return status;
875 /* close a search */
876 static void nbench_search_close_send(struct ntvfs_request *req)
878 union smb_search_close *io = req->async_states->private_data;
880 nbench_log(req, "Searchclose-%d - NOT HANDLED\n", io->generic.level);
882 PASS_THRU_REP_POST(req);
885 static NTSTATUS nbench_search_close(struct ntvfs_module_context *ntvfs,
886 struct ntvfs_request *req, union smb_search_close *io)
888 NTSTATUS status;
890 PASS_THRU_REQ(ntvfs, req, search_close, io, (ntvfs, req, io));
892 return status;
895 /* SMBtrans - not used on file shares */
896 static void nbench_trans_send(struct ntvfs_request *req)
898 nbench_log(req, "Trans - NOT HANDLED\n");
900 PASS_THRU_REP_POST(req);
903 static NTSTATUS nbench_trans(struct ntvfs_module_context *ntvfs,
904 struct ntvfs_request *req, struct smb_trans2 *trans2)
906 NTSTATUS status;
908 PASS_THRU_REQ(ntvfs, req, trans, trans2, (ntvfs, req, trans2));
910 return status;
914 initialise the nbench backend, registering ourselves with the ntvfs subsystem
916 NTSTATUS ntvfs_nbench_init(void)
918 NTSTATUS ret;
919 struct ntvfs_ops ops;
920 NTVFS_CURRENT_CRITICAL_SIZES(vers);
922 ZERO_STRUCT(ops);
924 /* fill in the name and type */
925 ops.name = "nbench";
926 ops.type = NTVFS_DISK;
928 /* fill in all the operations */
929 ops.connect = nbench_connect;
930 ops.disconnect = nbench_disconnect;
931 ops.unlink = nbench_unlink;
932 ops.chkpath = nbench_chkpath;
933 ops.qpathinfo = nbench_qpathinfo;
934 ops.setpathinfo = nbench_setpathinfo;
935 ops.open = nbench_open;
936 ops.mkdir = nbench_mkdir;
937 ops.rmdir = nbench_rmdir;
938 ops.rename = nbench_rename;
939 ops.copy = nbench_copy;
940 ops.ioctl = nbench_ioctl;
941 ops.read = nbench_read;
942 ops.write = nbench_write;
943 ops.seek = nbench_seek;
944 ops.flush = nbench_flush;
945 ops.close = nbench_close;
946 ops.exit = nbench_exit;
947 ops.lock = nbench_lock;
948 ops.setfileinfo = nbench_setfileinfo;
949 ops.qfileinfo = nbench_qfileinfo;
950 ops.fsinfo = nbench_fsinfo;
951 ops.lpq = nbench_lpq;
952 ops.search_first = nbench_search_first;
953 ops.search_next = nbench_search_next;
954 ops.search_close = nbench_search_close;
955 ops.trans = nbench_trans;
956 ops.logoff = nbench_logoff;
957 ops.async_setup = nbench_async_setup;
958 ops.cancel = nbench_cancel;
960 /* we don't register a trans2 handler as we want to be able to
961 log individual trans2 requests */
962 ops.trans2 = NULL;
964 /* register ourselves with the NTVFS subsystem. */
965 ret = ntvfs_register(&ops, &vers);
967 if (!NT_STATUS_IS_OK(ret)) {
968 DEBUG(0,("Failed to register nbench backend!\n"));
971 return ret;