s3:smb2_break: make use of file_fsp_smb2()
[Samba/gebeck_regimport.git] / source4 / ntvfs / nbench / vfs_nbench.c
blob565f2dafedc0b3c42ac8f08047979898ffaf052f
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 NTSTATUS ntvfs_nbench_init(void);
32 /* this is stored in ntvfs_private */
33 struct nbench_private {
34 int log_fd;
38 log one request to the nbench log
40 static void nbench_log(struct ntvfs_request *req,
41 const char *format, ...) PRINTF_ATTRIBUTE(2, 3);
43 static void nbench_log(struct ntvfs_request *req,
44 const char *format, ...)
46 struct nbench_private *nprivates = req->async_states->ntvfs->private_data;
47 va_list ap;
48 char *s = NULL;
50 va_start(ap, format);
51 vasprintf(&s, format, ap);
52 va_end(ap);
54 write(nprivates->log_fd, s, strlen(s));
55 free(s);
58 static char *nbench_ntvfs_handle_string(struct ntvfs_request *req, struct ntvfs_handle *h)
60 DATA_BLOB key;
61 uint16_t fnum = 0;
63 key = ntvfs_handle_get_wire_key(h, req);
65 switch (key.length) {
66 case 2: /* SMB fnum */
67 fnum = SVAL(key.data, 0);
68 break;
69 default:
70 DEBUG(0,("%s: invalid wire handle size: %u\n",
71 __FUNCTION__, (unsigned)key.length));
72 break;
75 return talloc_asprintf(req, "%u", fnum);
79 this pass through macro operates on request contexts, and disables
80 async calls.
82 async calls are a pain for the nbench module as it makes pulling the
83 status code and any result parameters much harder.
85 #define PASS_THRU_REQ_PRE_ASYNC(ntvfs, req, op, par1) do { \
86 status = ntvfs_async_state_push(ntvfs, req, par1, nbench_##op##_send); \
87 if (!NT_STATUS_IS_OK(status)) { \
88 return status; \
89 } \
90 } while (0)
92 #define PASS_THRU_REQ_POST_ASYNC(req) do { \
93 req->async_states->status = status; \
94 if (!(req->async_states->state & NTVFS_ASYNC_STATE_ASYNC)) { \
95 req->async_states->send_fn(req); \
96 } \
97 } while (0)
99 #define PASS_THRU_REQ(ntvfs, req, op, par1, args) do { \
100 PASS_THRU_REQ_PRE_ASYNC(ntvfs, req, op, par1); \
101 status = ntvfs_next_##op args; \
102 PASS_THRU_REQ_POST_ASYNC(req); \
103 } while (0)
105 #define PASS_THRU_REP_POST(req) do { \
106 ntvfs_async_state_pop(req); \
107 if (req->async_states->state & NTVFS_ASYNC_STATE_ASYNC) { \
108 req->async_states->send_fn(req); \
110 } while (0)
113 connect to a share - used when a tree_connect operation comes in.
115 static NTSTATUS nbench_connect(struct ntvfs_module_context *ntvfs,
116 struct ntvfs_request *req,
117 union smb_tcon* con)
119 struct nbench_private *nprivates;
120 NTSTATUS status;
121 char *logname = NULL;
123 nprivates = talloc(ntvfs, struct nbench_private);
124 if (!nprivates) {
125 return NT_STATUS_NO_MEMORY;
128 logname = talloc_asprintf(req, "/tmp/nbenchlog%d.%u", ntvfs->depth,
129 getpid());
130 NT_STATUS_HAVE_NO_MEMORY(logname);
131 nprivates->log_fd = open(logname, O_WRONLY|O_CREAT|O_APPEND, 0644);
132 talloc_free(logname);
134 if (nprivates->log_fd == -1) {
135 DEBUG(0,("Failed to open nbench log\n"));
136 return NT_STATUS_UNSUCCESSFUL;
139 ntvfs->private_data = nprivates;
141 status = ntvfs_next_connect(ntvfs, req, con);
143 return status;
147 disconnect from a share
149 static NTSTATUS nbench_disconnect(struct ntvfs_module_context *ntvfs)
151 struct nbench_private *nprivates = ntvfs->private_data;
152 NTSTATUS status;
154 close(nprivates->log_fd);
156 status = ntvfs_next_disconnect(ntvfs);
158 return status;
162 delete a file - the dirtype specifies the file types to include in the search.
163 The name can contain CIFS wildcards, but rarely does (except with OS/2 clients)
165 static void nbench_unlink_send(struct ntvfs_request *req)
167 union smb_unlink *unl = req->async_states->private_data;
168 nbench_log(req, "Unlink \"%s\" 0x%x %s\n",
169 unl->unlink.in.pattern, unl->unlink.in.attrib,
170 get_nt_error_c_code(req, req->async_states->status));
172 PASS_THRU_REP_POST(req);
175 static NTSTATUS nbench_unlink(struct ntvfs_module_context *ntvfs,
176 struct ntvfs_request *req,
177 union smb_unlink *unl)
179 NTSTATUS status;
181 PASS_THRU_REQ(ntvfs, req, unlink, unl, (ntvfs, req, unl));
183 return status;
187 ioctl interface
189 static void nbench_ioctl_send(struct ntvfs_request *req)
191 nbench_log(req, "Ioctl - NOT HANDLED\n");
193 PASS_THRU_REP_POST(req);
196 static NTSTATUS nbench_ioctl(struct ntvfs_module_context *ntvfs,
197 struct ntvfs_request *req, union smb_ioctl *io)
199 NTSTATUS status;
201 PASS_THRU_REQ(ntvfs, req, ioctl, io, (ntvfs, req, io));
203 return status;
207 check if a directory exists
209 static void nbench_chkpath_send(struct ntvfs_request *req)
211 union smb_chkpath *cp = req->async_states->private_data;
213 nbench_log(req, "Chkpath \"%s\" %s\n",
214 cp->chkpath.in.path,
215 get_nt_error_c_code(req, req->async_states->status));
217 PASS_THRU_REP_POST(req);
220 static NTSTATUS nbench_chkpath(struct ntvfs_module_context *ntvfs,
221 struct ntvfs_request *req,
222 union smb_chkpath *cp)
224 NTSTATUS status;
226 PASS_THRU_REQ(ntvfs, req, chkpath, cp, (ntvfs, req, cp));
228 return status;
232 return info on a pathname
234 static void nbench_qpathinfo_send(struct ntvfs_request *req)
236 union smb_fileinfo *info = req->async_states->private_data;
238 nbench_log(req, "QUERY_PATH_INFORMATION \"%s\" %d %s\n",
239 info->generic.in.file.path,
240 info->generic.level,
241 get_nt_error_c_code(req, req->async_states->status));
243 PASS_THRU_REP_POST(req);
246 static NTSTATUS nbench_qpathinfo(struct ntvfs_module_context *ntvfs,
247 struct ntvfs_request *req, union smb_fileinfo *info)
249 NTSTATUS status;
251 PASS_THRU_REQ(ntvfs, req, qpathinfo, info, (ntvfs, req, info));
253 return status;
257 query info on a open file
259 static void nbench_qfileinfo_send(struct ntvfs_request *req)
261 union smb_fileinfo *info = req->async_states->private_data;
263 nbench_log(req, "QUERY_FILE_INFORMATION %s %d %s\n",
264 nbench_ntvfs_handle_string(req, info->generic.in.file.ntvfs),
265 info->generic.level,
266 get_nt_error_c_code(req, req->async_states->status));
268 PASS_THRU_REP_POST(req);
271 static NTSTATUS nbench_qfileinfo(struct ntvfs_module_context *ntvfs,
272 struct ntvfs_request *req, union smb_fileinfo *info)
274 NTSTATUS status;
276 PASS_THRU_REQ(ntvfs, req, qfileinfo, info, (ntvfs, req, info));
278 return status;
282 set info on a pathname
284 static void nbench_setpathinfo_send(struct ntvfs_request *req)
286 union smb_setfileinfo *st = req->async_states->private_data;
288 nbench_log(req, "SET_PATH_INFORMATION \"%s\" %d %s\n",
289 st->generic.in.file.path,
290 st->generic.level,
291 get_nt_error_c_code(req, req->async_states->status));
293 PASS_THRU_REP_POST(req);
296 static NTSTATUS nbench_setpathinfo(struct ntvfs_module_context *ntvfs,
297 struct ntvfs_request *req, union smb_setfileinfo *st)
299 NTSTATUS status;
301 PASS_THRU_REQ(ntvfs, req, setpathinfo, st, (ntvfs, req, st));
303 return status;
307 open a file
309 static void nbench_open_send(struct ntvfs_request *req)
311 union smb_open *io = req->async_states->private_data;
313 switch (io->generic.level) {
314 case RAW_OPEN_NTCREATEX:
315 if (!NT_STATUS_IS_OK(req->async_states->status)) {
316 ZERO_STRUCT(io->ntcreatex.out);
318 nbench_log(req, "NTCreateX \"%s\" 0x%x 0x%x %s %s\n",
319 io->ntcreatex.in.fname,
320 io->ntcreatex.in.create_options,
321 io->ntcreatex.in.open_disposition,
322 nbench_ntvfs_handle_string(req, io->ntcreatex.out.file.ntvfs),
323 get_nt_error_c_code(req, req->async_states->status));
324 break;
326 default:
327 nbench_log(req, "Open-%d - NOT HANDLED\n",
328 io->generic.level);
329 break;
332 PASS_THRU_REP_POST(req);
335 static NTSTATUS nbench_open(struct ntvfs_module_context *ntvfs,
336 struct ntvfs_request *req, union smb_open *io)
338 NTSTATUS status;
340 #undef open /* AIX defines open to be open64 */
341 PASS_THRU_REQ(ntvfs, req, open, io, (ntvfs, req, io));
343 return status;
347 create a directory
349 static void nbench_mkdir_send(struct ntvfs_request *req)
351 nbench_log(req, "Mkdir - NOT HANDLED\n");
353 PASS_THRU_REP_POST(req);
356 static NTSTATUS nbench_mkdir(struct ntvfs_module_context *ntvfs,
357 struct ntvfs_request *req, union smb_mkdir *md)
359 NTSTATUS status;
361 PASS_THRU_REQ(ntvfs, req, mkdir, md, (ntvfs, req, md));
363 return status;
367 remove a directory
369 static void nbench_rmdir_send(struct ntvfs_request *req)
371 struct smb_rmdir *rd = req->async_states->private_data;
373 nbench_log(req, "Rmdir \"%s\" %s\n",
374 rd->in.path,
375 get_nt_error_c_code(req, req->async_states->status));
377 PASS_THRU_REP_POST(req);
380 static NTSTATUS nbench_rmdir(struct ntvfs_module_context *ntvfs,
381 struct ntvfs_request *req, struct smb_rmdir *rd)
383 NTSTATUS status;
385 PASS_THRU_REQ(ntvfs, req, rmdir, rd, (ntvfs, req, rd));
387 return status;
391 rename a set of files
393 static void nbench_rename_send(struct ntvfs_request *req)
395 union smb_rename *ren = req->async_states->private_data;
397 switch (ren->generic.level) {
398 case RAW_RENAME_RENAME:
399 nbench_log(req, "Rename \"%s\" \"%s\" %s\n",
400 ren->rename.in.pattern1,
401 ren->rename.in.pattern2,
402 get_nt_error_c_code(req, req->async_states->status));
403 break;
405 default:
406 nbench_log(req, "Rename-%d - NOT HANDLED\n",
407 ren->generic.level);
408 break;
411 PASS_THRU_REP_POST(req);
414 static NTSTATUS nbench_rename(struct ntvfs_module_context *ntvfs,
415 struct ntvfs_request *req, union smb_rename *ren)
417 NTSTATUS status;
419 PASS_THRU_REQ(ntvfs, req, rename, ren, (ntvfs, req, ren));
421 return status;
425 copy a set of files
427 static void nbench_copy_send(struct ntvfs_request *req)
429 nbench_log(req, "Copy - NOT HANDLED\n");
431 PASS_THRU_REP_POST(req);
434 static NTSTATUS nbench_copy(struct ntvfs_module_context *ntvfs,
435 struct ntvfs_request *req, struct smb_copy *cp)
437 NTSTATUS status;
439 PASS_THRU_REQ(ntvfs, req, copy, cp, (ntvfs, req, cp));
441 return status;
445 read from a file
447 static void nbench_read_send(struct ntvfs_request *req)
449 union smb_read *rd = req->async_states->private_data;
451 switch (rd->generic.level) {
452 case RAW_READ_READX:
453 if (!NT_STATUS_IS_OK(req->async_states->status)) {
454 ZERO_STRUCT(rd->readx.out);
456 nbench_log(req, "ReadX %s %d %d %d %s\n",
457 nbench_ntvfs_handle_string(req, rd->readx.in.file.ntvfs),
458 (int)rd->readx.in.offset,
459 rd->readx.in.maxcnt,
460 rd->readx.out.nread,
461 get_nt_error_c_code(req, req->async_states->status));
462 break;
463 default:
464 nbench_log(req, "Read-%d - NOT HANDLED\n",
465 rd->generic.level);
466 break;
469 PASS_THRU_REP_POST(req);
472 static NTSTATUS nbench_read(struct ntvfs_module_context *ntvfs,
473 struct ntvfs_request *req, union smb_read *rd)
475 NTSTATUS status;
477 PASS_THRU_REQ(ntvfs, req, read, rd, (ntvfs, req, rd));
479 return status;
483 write to a file
485 static void nbench_write_send(struct ntvfs_request *req)
487 union smb_write *wr = req->async_states->private_data;
489 switch (wr->generic.level) {
490 case RAW_WRITE_WRITEX:
491 if (!NT_STATUS_IS_OK(req->async_states->status)) {
492 ZERO_STRUCT(wr->writex.out);
494 nbench_log(req, "WriteX %s %d %d %d %s\n",
495 nbench_ntvfs_handle_string(req, wr->writex.in.file.ntvfs),
496 (int)wr->writex.in.offset,
497 wr->writex.in.count,
498 wr->writex.out.nwritten,
499 get_nt_error_c_code(req, req->async_states->status));
500 break;
502 case RAW_WRITE_WRITE:
503 if (!NT_STATUS_IS_OK(req->async_states->status)) {
504 ZERO_STRUCT(wr->write.out);
506 nbench_log(req, "Write %s %d %d %d %s\n",
507 nbench_ntvfs_handle_string(req, wr->write.in.file.ntvfs),
508 wr->write.in.offset,
509 wr->write.in.count,
510 wr->write.out.nwritten,
511 get_nt_error_c_code(req, req->async_states->status));
512 break;
514 default:
515 nbench_log(req, "Write-%d - NOT HANDLED\n",
516 wr->generic.level);
517 break;
520 PASS_THRU_REP_POST(req);
523 static NTSTATUS nbench_write(struct ntvfs_module_context *ntvfs,
524 struct ntvfs_request *req, union smb_write *wr)
526 NTSTATUS status;
528 PASS_THRU_REQ(ntvfs, req, write, wr, (ntvfs, req, wr));
530 return status;
534 seek in a file
536 static void nbench_seek_send(struct ntvfs_request *req)
538 nbench_log(req, "Seek - NOT HANDLED\n");
540 PASS_THRU_REP_POST(req);
543 static NTSTATUS nbench_seek(struct ntvfs_module_context *ntvfs,
544 struct ntvfs_request *req,
545 union smb_seek *io)
547 NTSTATUS status;
549 PASS_THRU_REQ(ntvfs, req, seek, io, (ntvfs, req, io));
551 return status;
555 flush a file
557 static void nbench_flush_send(struct ntvfs_request *req)
559 union smb_flush *io = req->async_states->private_data;
561 switch (io->generic.level) {
562 case RAW_FLUSH_FLUSH:
563 nbench_log(req, "Flush %s %s\n",
564 nbench_ntvfs_handle_string(req, io->flush.in.file.ntvfs),
565 get_nt_error_c_code(req, req->async_states->status));
566 break;
567 case RAW_FLUSH_ALL:
568 nbench_log(req, "Flush %d %s\n",
569 0xFFFF,
570 get_nt_error_c_code(req, req->async_states->status));
571 break;
572 default:
573 nbench_log(req, "Flush-%d - NOT HANDLED\n",
574 io->generic.level);
575 break;
578 PASS_THRU_REP_POST(req);
581 static NTSTATUS nbench_flush(struct ntvfs_module_context *ntvfs,
582 struct ntvfs_request *req,
583 union smb_flush *io)
585 NTSTATUS status;
587 PASS_THRU_REQ(ntvfs, req, flush, io, (ntvfs, req, io));
589 return status;
593 close a file
595 static void nbench_close_send(struct ntvfs_request *req)
597 union smb_close *io = req->async_states->private_data;
599 switch (io->generic.level) {
600 case RAW_CLOSE_CLOSE:
601 nbench_log(req, "Close %s %s\n",
602 nbench_ntvfs_handle_string(req, io->close.in.file.ntvfs),
603 get_nt_error_c_code(req, req->async_states->status));
604 break;
606 default:
607 nbench_log(req, "Close-%d - NOT HANDLED\n",
608 io->generic.level);
609 break;
612 PASS_THRU_REP_POST(req);
615 static NTSTATUS nbench_close(struct ntvfs_module_context *ntvfs,
616 struct ntvfs_request *req, union smb_close *io)
618 NTSTATUS status;
620 PASS_THRU_REQ(ntvfs, req, close, io, (ntvfs, req, io));
622 return status;
626 exit - closing files
628 static void nbench_exit_send(struct ntvfs_request *req)
630 nbench_log(req, "Exit - NOT HANDLED\n");
632 PASS_THRU_REP_POST(req);
635 static NTSTATUS nbench_exit(struct ntvfs_module_context *ntvfs,
636 struct ntvfs_request *req)
638 NTSTATUS status;
640 PASS_THRU_REQ(ntvfs, req, exit, NULL, (ntvfs, req));
642 return status;
646 logoff - closing files
648 static void nbench_logoff_send(struct ntvfs_request *req)
650 nbench_log(req, "Logoff - NOT HANDLED\n");
652 PASS_THRU_REP_POST(req);
655 static NTSTATUS nbench_logoff(struct ntvfs_module_context *ntvfs,
656 struct ntvfs_request *req)
658 NTSTATUS status;
660 PASS_THRU_REQ(ntvfs, req, logoff, NULL, (ntvfs, req));
662 return status;
666 async_setup - send fn
668 static void nbench_async_setup_send(struct ntvfs_request *req)
670 PASS_THRU_REP_POST(req);
674 async setup
676 static NTSTATUS nbench_async_setup(struct ntvfs_module_context *ntvfs,
677 struct ntvfs_request *req,
678 void *private_data)
680 NTSTATUS status;
682 PASS_THRU_REQ(ntvfs, req, async_setup, NULL, (ntvfs, req, private_data));
684 return status;
688 static void nbench_cancel_send(struct ntvfs_request *req)
690 PASS_THRU_REP_POST(req);
694 cancel an existing async request
696 static NTSTATUS nbench_cancel(struct ntvfs_module_context *ntvfs,
697 struct ntvfs_request *req)
699 NTSTATUS status;
701 PASS_THRU_REQ(ntvfs, req, cancel, NULL, (ntvfs, req));
703 return status;
707 lock a byte range
709 static void nbench_lock_send(struct ntvfs_request *req)
711 union smb_lock *lck = req->async_states->private_data;
713 if (lck->generic.level == RAW_LOCK_LOCKX &&
714 lck->lockx.in.lock_cnt == 1 &&
715 lck->lockx.in.ulock_cnt == 0) {
716 nbench_log(req, "LockX %s %d %d %s\n",
717 nbench_ntvfs_handle_string(req, lck->lockx.in.file.ntvfs),
718 (int)lck->lockx.in.locks[0].offset,
719 (int)lck->lockx.in.locks[0].count,
720 get_nt_error_c_code(req, req->async_states->status));
721 } else if (lck->generic.level == RAW_LOCK_LOCKX &&
722 lck->lockx.in.ulock_cnt == 1) {
723 nbench_log(req, "UnlockX %s %d %d %s\n",
724 nbench_ntvfs_handle_string(req, lck->lockx.in.file.ntvfs),
725 (int)lck->lockx.in.locks[0].offset,
726 (int)lck->lockx.in.locks[0].count,
727 get_nt_error_c_code(req, req->async_states->status));
728 } else {
729 nbench_log(req, "Lock-%d - NOT HANDLED\n", lck->generic.level);
732 PASS_THRU_REP_POST(req);
735 static NTSTATUS nbench_lock(struct ntvfs_module_context *ntvfs,
736 struct ntvfs_request *req, union smb_lock *lck)
738 NTSTATUS status;
740 PASS_THRU_REQ(ntvfs, req, lock, lck, (ntvfs, req, lck));
742 return status;
746 set info on a open file
748 static void nbench_setfileinfo_send(struct ntvfs_request *req)
750 union smb_setfileinfo *info = req->async_states->private_data;
752 nbench_log(req, "SET_FILE_INFORMATION %s %d %s\n",
753 nbench_ntvfs_handle_string(req, info->generic.in.file.ntvfs),
754 info->generic.level,
755 get_nt_error_c_code(req, req->async_states->status));
757 PASS_THRU_REP_POST(req);
760 static NTSTATUS nbench_setfileinfo(struct ntvfs_module_context *ntvfs,
761 struct ntvfs_request *req,
762 union smb_setfileinfo *info)
764 NTSTATUS status;
766 PASS_THRU_REQ(ntvfs, req, setfileinfo, info, (ntvfs, req, info));
768 return status;
772 return filesystem space info
774 static void nbench_fsinfo_send(struct ntvfs_request *req)
776 union smb_fsinfo *fs = req->async_states->private_data;
778 nbench_log(req, "QUERY_FS_INFORMATION %d %s\n",
779 fs->generic.level,
780 get_nt_error_c_code(req, req->async_states->status));
782 PASS_THRU_REP_POST(req);
785 static NTSTATUS nbench_fsinfo(struct ntvfs_module_context *ntvfs,
786 struct ntvfs_request *req, union smb_fsinfo *fs)
788 NTSTATUS status;
790 PASS_THRU_REQ(ntvfs, req, fsinfo, fs, (ntvfs, req, fs));
792 return status;
796 return print queue info
798 static void nbench_lpq_send(struct ntvfs_request *req)
800 union smb_lpq *lpq = req->async_states->private_data;
802 nbench_log(req, "Lpq-%d - NOT HANDLED\n", lpq->generic.level);
804 PASS_THRU_REP_POST(req);
807 static NTSTATUS nbench_lpq(struct ntvfs_module_context *ntvfs,
808 struct ntvfs_request *req, union smb_lpq *lpq)
810 NTSTATUS status;
812 PASS_THRU_REQ(ntvfs, req, lpq, lpq, (ntvfs, req, lpq));
814 return status;
818 list files in a directory matching a wildcard pattern
820 static void nbench_search_first_send(struct ntvfs_request *req)
822 union smb_search_first *io = req->async_states->private_data;
824 switch (io->generic.level) {
825 case RAW_SEARCH_TRANS2:
826 if (NT_STATUS_IS_ERR(req->async_states->status)) {
827 ZERO_STRUCT(io->t2ffirst.out);
829 nbench_log(req, "FIND_FIRST \"%s\" %d %d %d %s\n",
830 io->t2ffirst.in.pattern,
831 io->t2ffirst.data_level,
832 io->t2ffirst.in.max_count,
833 io->t2ffirst.out.count,
834 get_nt_error_c_code(req, req->async_states->status));
835 break;
837 default:
838 nbench_log(req, "Search-%d - NOT HANDLED\n", io->generic.level);
839 break;
842 PASS_THRU_REP_POST(req);
845 static NTSTATUS nbench_search_first(struct ntvfs_module_context *ntvfs,
846 struct ntvfs_request *req, union smb_search_first *io,
847 void *search_private,
848 bool (*callback)(void *, const union smb_search_data *))
850 NTSTATUS status;
852 PASS_THRU_REQ(ntvfs, req, search_first, io, (ntvfs, req, io, search_private, callback));
854 return status;
857 /* continue a search */
858 static void nbench_search_next_send(struct ntvfs_request *req)
860 union smb_search_next *io = req->async_states->private_data;
862 nbench_log(req, "Searchnext-%d - NOT HANDLED\n", io->generic.level);
864 PASS_THRU_REP_POST(req);
867 static NTSTATUS nbench_search_next(struct ntvfs_module_context *ntvfs,
868 struct ntvfs_request *req, union smb_search_next *io,
869 void *search_private,
870 bool (*callback)(void *, const union smb_search_data *))
872 NTSTATUS status;
874 PASS_THRU_REQ(ntvfs, req, search_next, io, (ntvfs, req, io, search_private, callback));
876 return status;
879 /* close a search */
880 static void nbench_search_close_send(struct ntvfs_request *req)
882 union smb_search_close *io = req->async_states->private_data;
884 nbench_log(req, "Searchclose-%d - NOT HANDLED\n", io->generic.level);
886 PASS_THRU_REP_POST(req);
889 static NTSTATUS nbench_search_close(struct ntvfs_module_context *ntvfs,
890 struct ntvfs_request *req, union smb_search_close *io)
892 NTSTATUS status;
894 PASS_THRU_REQ(ntvfs, req, search_close, io, (ntvfs, req, io));
896 return status;
899 /* SMBtrans - not used on file shares */
900 static void nbench_trans_send(struct ntvfs_request *req)
902 nbench_log(req, "Trans - NOT HANDLED\n");
904 PASS_THRU_REP_POST(req);
907 static NTSTATUS nbench_trans(struct ntvfs_module_context *ntvfs,
908 struct ntvfs_request *req, struct smb_trans2 *trans2)
910 NTSTATUS status;
912 PASS_THRU_REQ(ntvfs, req, trans, trans2, (ntvfs, req, trans2));
914 return status;
918 initialise the nbench backend, registering ourselves with the ntvfs subsystem
920 NTSTATUS ntvfs_nbench_init(void)
922 NTSTATUS ret;
923 struct ntvfs_ops ops;
924 NTVFS_CURRENT_CRITICAL_SIZES(vers);
926 ZERO_STRUCT(ops);
928 /* fill in the name and type */
929 ops.name = "nbench";
930 ops.type = NTVFS_DISK;
932 /* fill in all the operations */
933 ops.connect = nbench_connect;
934 ops.disconnect = nbench_disconnect;
935 ops.unlink = nbench_unlink;
936 ops.chkpath = nbench_chkpath;
937 ops.qpathinfo = nbench_qpathinfo;
938 ops.setpathinfo = nbench_setpathinfo;
939 ops.open = nbench_open;
940 ops.mkdir = nbench_mkdir;
941 ops.rmdir = nbench_rmdir;
942 ops.rename = nbench_rename;
943 ops.copy = nbench_copy;
944 ops.ioctl = nbench_ioctl;
945 ops.read = nbench_read;
946 ops.write = nbench_write;
947 ops.seek = nbench_seek;
948 ops.flush = nbench_flush;
949 ops.close = nbench_close;
950 ops.exit = nbench_exit;
951 ops.lock = nbench_lock;
952 ops.setfileinfo = nbench_setfileinfo;
953 ops.qfileinfo = nbench_qfileinfo;
954 ops.fsinfo = nbench_fsinfo;
955 ops.lpq = nbench_lpq;
956 ops.search_first = nbench_search_first;
957 ops.search_next = nbench_search_next;
958 ops.search_close = nbench_search_close;
959 ops.trans = nbench_trans;
960 ops.logoff = nbench_logoff;
961 ops.async_setup = nbench_async_setup;
962 ops.cancel = nbench_cancel;
964 /* we don't register a trans2 handler as we want to be able to
965 log individual trans2 requests */
966 ops.trans2 = NULL;
968 /* register ourselves with the NTVFS subsystem. */
969 ret = ntvfs_register(&ops, &vers);
971 if (!NT_STATUS_IS_OK(ret)) {
972 DEBUG(0,("Failed to register nbench backend!\n"));
975 return ret;