a0584c0aa42c7fe228a4ed51e2b35426a4caf33d
[samba.git] / source4 / libcli / raw / interfaces.h
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB request interface structures
4    Copyright (C) Andrew Tridgell                        2003
5    Copyright (C) James J Myers 2003 <myersjj@samba.org>
6    Copyright (C) James Peach 2007
7    
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.
12    
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.
17    
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/>.
20 */
21
22 #ifndef __LIBCLI_RAW_INTERFACES_H__
23 #define __LIBCLI_RAW_INTERFACES_H__
24
25 #include "smb.h" 
26 #include "librpc/gen_ndr/misc.h" /* for struct GUID */
27
28 /* this structure is just a wrapper for a string, the only reason we
29    bother with this is that it allows us to check the length provided
30    on the wire in testsuite test code to ensure that we are
31    terminating names in the same way that win2003 is. The *ONLY* time
32    you should ever look at the 'private_length' field in this
33    structure is inside compliance test code, in all other cases just
34    use the null terminated char* as the definitive definition of the
35    string
36
37    also note that this structure is only used in packets where there
38    is an explicit length provided on the wire (hence the name). That
39    length is placed in 'private_length'. For packets where the length
40    is always determined by NULL or packet termination a normal char*
41    is used in the structure definition.
42  */
43 struct smb_wire_string {
44         uint32_t private_length;
45         const char *s;
46 };
47
48 /*
49  * SMB2 uses a 16Byte handle,
50  * (we can maybe use struct GUID later)
51  */
52 struct smb2_handle {
53         uint64_t data[2];
54 };
55
56 struct ntvfs_handle;
57
58 /*
59  * a generic container for file handles or file pathes
60  * for qfileinfo/setfileinfo and qpathinfo/setpathinfo
61 */
62 union smb_handle_or_path {
63         /*
64          * this is used for
65          * the qpathinfo and setpathinfo
66          * calls
67          */
68         const char *path;
69         /*
70          * this is used as file handle in SMB
71          */
72         uint16_t fnum;
73
74         /*
75          * this is used as file handle in SMB2
76          */
77         struct smb2_handle handle;
78
79         /*
80          * this is used as generic file handle for the NTVFS layer
81          */
82         struct ntvfs_handle *ntvfs;
83 };
84
85 /*
86  a generic container for file handles
87 */
88 union smb_handle {
89         /*
90          * this is used as file handle in SMB
91          */
92         uint16_t fnum;
93
94         /*
95          * this is used as file handle in SMB2
96          */
97         struct smb2_handle handle;
98
99         /*
100          * this is used as generic file handle for the NTVFS layer
101          */
102         struct ntvfs_handle *ntvfs;
103 };
104
105 /*
106   this header defines the structures and unions used between the SMB
107   parser and the backends.
108 */
109
110 /* struct used for SMBlseek call */
111 union smb_seek {
112         struct {
113                 struct {
114                         union smb_handle file;
115                         uint16_t mode;
116                         int32_t  offset; /* signed */
117                 } in;
118                 struct {
119                         int32_t offset;
120                 } out;
121         } lseek, generic;
122 };
123
124 /* struct used in unlink() call */
125 union smb_unlink {
126         struct {
127                 struct {
128                         const char *pattern;
129                         uint16_t attrib;
130                 } in;
131         } unlink;
132 };
133
134
135 /* struct used in chkpath() call */
136 union smb_chkpath {
137         struct {
138                 struct {
139                         const char *path;
140                 } in;
141         } chkpath;
142 };
143
144 enum smb_mkdir_level {RAW_MKDIR_GENERIC, RAW_MKDIR_MKDIR, RAW_MKDIR_T2MKDIR};
145
146 /* union used in mkdir() call */
147 union smb_mkdir {
148         /* generic level */
149         struct {
150                 enum smb_mkdir_level level;
151         } generic;
152
153         struct {
154                 enum smb_mkdir_level level;
155                 struct {
156                         const char *path;
157                 } in;
158         } mkdir;
159
160         struct {
161                 enum smb_mkdir_level level;
162                 struct {
163                         const char *path;
164                         uint_t num_eas;
165                         struct ea_struct *eas;                  
166                 } in;
167         } t2mkdir;
168 };
169
170 /* struct used in rmdir() call */
171 struct smb_rmdir {
172         struct {
173                 const char *path;
174         } in;
175 };
176
177 /* struct used in rename() call */
178 enum smb_rename_level {RAW_RENAME_RENAME, RAW_RENAME_NTRENAME, RAW_RENAME_NTTRANS};
179
180 union smb_rename {
181         struct {
182                 enum smb_rename_level level;
183         } generic;
184
185         /* SMBrename interface */
186         struct {
187                 enum smb_rename_level level;
188
189                 struct {
190                         const char *pattern1;
191                         const char *pattern2;
192                         uint16_t attrib;
193                 } in;
194         } rename;
195
196
197         /* SMBntrename interface */
198         struct {
199                 enum smb_rename_level level;
200
201                 struct {
202                         uint16_t attrib;
203                         uint16_t flags; /* see RENAME_FLAG_* */
204                         uint32_t cluster_size;
205                         const char *old_name;
206                         const char *new_name;
207                 } in;
208         } ntrename;
209
210         /* NT TRANS rename interface */
211         struct {
212                 enum smb_rename_level level;
213
214                 struct {
215                         union smb_handle file;
216                         uint16_t flags;/* see RENAME_REPLACE_IF_EXISTS */
217                         const char *new_name;
218                 } in;
219         } nttrans;
220 };
221
222 enum smb_tcon_level {
223         RAW_TCON_TCON,
224         RAW_TCON_TCONX,
225         RAW_TCON_SMB2
226 };
227
228 /* union used in tree connect call */
229 union smb_tcon {
230         /* generic interface */
231         struct {
232                 enum smb_tcon_level level;
233         } generic;
234
235         /* SMBtcon interface */
236         struct {
237                 enum smb_tcon_level level;
238
239                 struct {
240                         const char *service;
241                         const char *password;
242                         const char *dev;
243                 } in;
244                 struct {
245                         uint16_t max_xmit;
246                         uint16_t tid;
247                 } out;
248         } tcon;
249
250         /* SMBtconX interface */
251         struct {
252                 enum smb_tcon_level level;
253
254                 struct {
255                         uint16_t flags;
256                         DATA_BLOB password;
257                         const char *path;
258                         const char *device;
259                 } in;
260                 struct {
261                         uint16_t options;
262                         char *dev_type;
263                         char *fs_type;
264                         uint16_t tid;
265                 } out;
266         } tconx;
267
268         /* SMB2 TreeConnect */
269         struct smb2_tree_connect {
270                 enum smb_tcon_level level;
271
272                 struct {
273                         /* static body buffer 8 (0x08) bytes */
274                         uint16_t reserved;
275                         /* uint16_t path_ofs */
276                         /* uint16_t path_size */
277                                 /* dynamic body */
278                         const char *path; /* as non-terminated UTF-16 on the wire */
279                 } in;
280                 struct {
281                         /* static body buffer 16 (0x10) bytes */
282                         /* uint16_t buffer_code;  0x10 */
283                         uint8_t share_type;
284                         uint8_t reserved;
285                         uint32_t flags;
286                         uint32_t capabilities;
287                         uint32_t access_mask;
288         
289                         /* extracted from the SMB2 header */
290                         uint32_t tid;
291                 } out;
292         } smb2;
293 };
294
295
296 enum smb_sesssetup_level {
297         RAW_SESSSETUP_OLD,
298         RAW_SESSSETUP_NT1,
299         RAW_SESSSETUP_SPNEGO,
300         RAW_SESSSETUP_SMB2
301 };
302
303 /* union used in session_setup call */
304 union smb_sesssetup {
305         /* the pre-NT1 interface */
306         struct {
307                 enum smb_sesssetup_level level;
308
309                 struct {
310                         uint16_t bufsize;
311                         uint16_t mpx_max;
312                         uint16_t vc_num;
313                         uint32_t sesskey;
314                         DATA_BLOB password;
315                         const char *user;
316                         const char *domain;
317                         const char *os;
318                         const char *lanman;
319                 } in;
320                 struct {
321                         uint16_t action;
322                         uint16_t vuid;
323                         char *os;
324                         char *lanman;
325                         char *domain;
326                 } out;
327         } old;
328
329         /* the NT1 interface */
330         struct {
331                 enum smb_sesssetup_level level;
332
333                 struct {
334                         uint16_t bufsize;
335                         uint16_t mpx_max;
336                         uint16_t vc_num;
337                         uint32_t sesskey;
338                         uint32_t capabilities;
339                         DATA_BLOB password1;
340                         DATA_BLOB password2;
341                         const char *user;
342                         const char *domain;
343                         const char *os;
344                         const char *lanman;
345                 } in;
346                 struct {
347                         uint16_t action;
348                         uint16_t vuid;
349                         char *os;
350                         char *lanman;
351                         char *domain;
352                 } out;
353         } nt1;
354
355
356         /* the SPNEGO interface */
357         struct {
358                 enum smb_sesssetup_level level;
359
360                 struct {
361                         uint16_t bufsize;
362                         uint16_t mpx_max;
363                         uint16_t vc_num;
364                         uint32_t sesskey;
365                         uint32_t capabilities;
366                         DATA_BLOB secblob;
367                         const char *os;
368                         const char *lanman;
369                         const char *workgroup;
370                 } in;
371                 struct {
372                         uint16_t action;
373                         DATA_BLOB secblob;
374                         char *os;
375                         char *lanman;
376                         char *workgroup;
377                         uint16_t vuid;
378                 } out;
379         } spnego;
380
381         /* SMB2 SessionSetup */
382         struct smb2_session_setup {
383                 enum smb_sesssetup_level level;
384
385                 struct {
386                         /* static body 24 (0x18) bytes */
387                         uint8_t vc_number;
388                         uint8_t security_mode;
389                         uint32_t capabilities;
390                         uint32_t channel;
391                         /* uint16_t secblob_ofs */
392                         /* uint16_t secblob_size */
393                         uint64_t previous_sessionid;
394                         /* dynamic body */
395                         DATA_BLOB secblob;
396                 } in;
397                 struct {
398                         /* body buffer 8 (0x08) bytes */
399                         uint16_t session_flags;
400                         /* uint16_t secblob_ofs */
401                         /* uint16_t secblob_size */
402                         /* dynamic body */
403                         DATA_BLOB secblob;
404
405                         /* extracted from the SMB2 header */
406                         uint64_t uid;
407                 } out;
408         } smb2;
409 };
410
411 /* Note that the specified enum values are identical to the actual info-levels used
412  * on the wire.
413  */
414 enum smb_fileinfo_level {
415                      RAW_FILEINFO_GENERIC                    = 0xF000, 
416                      RAW_FILEINFO_GETATTR,                   /* SMBgetatr */
417                      RAW_FILEINFO_GETATTRE,                  /* SMBgetattrE */
418                      RAW_FILEINFO_SEC_DESC,                  /* NT_TRANSACT_QUERY_SECURITY_DESC */
419                      RAW_FILEINFO_STANDARD                   = SMB_QFILEINFO_STANDARD,
420                      RAW_FILEINFO_EA_SIZE                    = SMB_QFILEINFO_EA_SIZE,
421                      RAW_FILEINFO_EA_LIST                    = SMB_QFILEINFO_EA_LIST,
422                      RAW_FILEINFO_ALL_EAS                    = SMB_QFILEINFO_ALL_EAS,
423                      RAW_FILEINFO_IS_NAME_VALID              = SMB_QFILEINFO_IS_NAME_VALID,
424                      RAW_FILEINFO_BASIC_INFO                 = SMB_QFILEINFO_BASIC_INFO, 
425                      RAW_FILEINFO_STANDARD_INFO              = SMB_QFILEINFO_STANDARD_INFO,
426                      RAW_FILEINFO_EA_INFO                    = SMB_QFILEINFO_EA_INFO,
427                      RAW_FILEINFO_NAME_INFO                  = SMB_QFILEINFO_NAME_INFO, 
428                      RAW_FILEINFO_ALL_INFO                   = SMB_QFILEINFO_ALL_INFO,
429                      RAW_FILEINFO_ALT_NAME_INFO              = SMB_QFILEINFO_ALT_NAME_INFO,
430                      RAW_FILEINFO_STREAM_INFO                = SMB_QFILEINFO_STREAM_INFO,
431                      RAW_FILEINFO_COMPRESSION_INFO           = SMB_QFILEINFO_COMPRESSION_INFO,
432                      RAW_FILEINFO_UNIX_BASIC                 = SMB_QFILEINFO_UNIX_BASIC,
433                      RAW_FILEINFO_UNIX_INFO2                 = SMB_QFILEINFO_UNIX_INFO2,
434                      RAW_FILEINFO_UNIX_LINK                  = SMB_QFILEINFO_UNIX_LINK,
435                      RAW_FILEINFO_BASIC_INFORMATION          = SMB_QFILEINFO_BASIC_INFORMATION,
436                      RAW_FILEINFO_STANDARD_INFORMATION       = SMB_QFILEINFO_STANDARD_INFORMATION,
437                      RAW_FILEINFO_INTERNAL_INFORMATION       = SMB_QFILEINFO_INTERNAL_INFORMATION,
438                      RAW_FILEINFO_EA_INFORMATION             = SMB_QFILEINFO_EA_INFORMATION,
439                      RAW_FILEINFO_ACCESS_INFORMATION         = SMB_QFILEINFO_ACCESS_INFORMATION,
440                      RAW_FILEINFO_NAME_INFORMATION           = SMB_QFILEINFO_NAME_INFORMATION,
441                      RAW_FILEINFO_POSITION_INFORMATION       = SMB_QFILEINFO_POSITION_INFORMATION,
442                      RAW_FILEINFO_MODE_INFORMATION           = SMB_QFILEINFO_MODE_INFORMATION,
443                      RAW_FILEINFO_ALIGNMENT_INFORMATION      = SMB_QFILEINFO_ALIGNMENT_INFORMATION,
444                      RAW_FILEINFO_ALL_INFORMATION            = SMB_QFILEINFO_ALL_INFORMATION,
445                      RAW_FILEINFO_ALT_NAME_INFORMATION       = SMB_QFILEINFO_ALT_NAME_INFORMATION,
446                      RAW_FILEINFO_STREAM_INFORMATION         = SMB_QFILEINFO_STREAM_INFORMATION,
447                      RAW_FILEINFO_COMPRESSION_INFORMATION    = SMB_QFILEINFO_COMPRESSION_INFORMATION,
448                      RAW_FILEINFO_NETWORK_OPEN_INFORMATION   = SMB_QFILEINFO_NETWORK_OPEN_INFORMATION,
449                      RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION  = SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION,
450                      /* SMB2 specific levels */
451                      RAW_FILEINFO_SMB2_ALL_EAS               = 0x0f01,
452                      RAW_FILEINFO_SMB2_ALL_INFORMATION       = 0x1201
453 };
454
455 /* union used in qfileinfo() and qpathinfo() backend calls */
456 union smb_fileinfo {
457         /* generic interface:
458          * matches RAW_FILEINFO_GENERIC */
459         struct {
460                 enum smb_fileinfo_level level;
461                 struct {
462                         union smb_handle_or_path file;
463                 } in;
464                 struct {
465                         uint32_t attrib;
466                         uint32_t ea_size;
467                         uint_t num_eas;
468                         struct ea_struct {
469                                 uint8_t flags;
470                                 struct smb_wire_string name;
471                                 DATA_BLOB value;
472                         } *eas;         
473                         NTTIME create_time;
474                         NTTIME access_time;
475                         NTTIME write_time;
476                         NTTIME change_time;
477                         uint64_t alloc_size;
478                         uint64_t size;
479                         uint32_t nlink;
480                         struct smb_wire_string fname;   
481                         struct smb_wire_string alt_fname;       
482                         uint8_t delete_pending;
483                         uint8_t directory;
484                         uint64_t compressed_size;
485                         uint16_t format;
486                         uint8_t unit_shift;
487                         uint8_t chunk_shift;
488                         uint8_t cluster_shift;
489                         uint64_t file_id;
490                         uint32_t access_flags; /* seen 0x001f01ff from w2k3 */
491                         uint64_t position;
492                         uint32_t mode;
493                         uint32_t alignment_requirement;
494                         uint32_t reparse_tag;
495                         uint_t num_streams;
496                         struct stream_struct {
497                                 uint64_t size;
498                                 uint64_t alloc_size;
499                                 struct smb_wire_string stream_name;
500                         } *streams;
501                 } out;
502         } generic;
503
504
505         /* SMBgetatr interface:
506          * matches RAW_FILEINFO_GETATTR */
507         struct {
508                 enum smb_fileinfo_level level;
509                 struct {
510                         union smb_handle_or_path file;
511                 } in;
512                 struct {
513                         uint16_t attrib;
514                         uint32_t size;
515                         time_t write_time;
516                 } out;
517         } getattr;
518
519         /* SMBgetattrE and  RAW_FILEINFO_STANDARD interface */
520         struct {
521                 enum smb_fileinfo_level level;
522                 struct {
523                         union smb_handle_or_path file;
524                 } in;
525                 struct {
526                         time_t create_time;
527                         time_t access_time;
528                         time_t write_time;
529                         uint32_t size;
530                         uint32_t alloc_size;
531                         uint16_t attrib;
532                 } out;
533         } getattre, standard;
534
535         /* trans2 RAW_FILEINFO_EA_SIZE interface */
536         struct {
537                 enum smb_fileinfo_level level;
538                 struct {
539                         union smb_handle_or_path file;
540                 } in;
541                 struct {
542                         time_t create_time;
543                         time_t access_time;
544                         time_t write_time;
545                         uint32_t size;
546                         uint32_t alloc_size;
547                         uint16_t attrib;
548                         uint32_t ea_size;
549                 } out;
550         } ea_size;
551
552         /* trans2 RAW_FILEINFO_EA_LIST interface */
553         struct {
554                 enum smb_fileinfo_level level;
555                 struct {
556                         union smb_handle_or_path file;
557                         uint_t num_names;
558                         struct ea_name {
559                                 struct smb_wire_string name;
560                         } *ea_names;    
561                 } in;   
562
563                 struct smb_ea_list {
564                         uint_t num_eas;
565                         struct ea_struct *eas;
566                 } out;
567         } ea_list;
568
569         /* trans2 RAW_FILEINFO_ALL_EAS and RAW_FILEINFO_FULL_EA_INFORMATION interfaces */
570         struct {
571                 enum smb_fileinfo_level level;
572                 struct {
573                         union smb_handle_or_path file;
574                         /* SMB2 only - SMB2_CONTINUE_FLAG_* */
575                         uint8_t continue_flags;
576                 } in;
577                 struct smb_ea_list out;
578         } all_eas;
579
580         /* trans2 qpathinfo RAW_FILEINFO_IS_NAME_VALID interface 
581            only valid for a QPATHNAME call - no returned data */
582         struct {
583                 enum smb_fileinfo_level level;
584                 struct {
585                         union smb_handle_or_path file;
586                 } in;
587         } is_name_valid;
588
589         /* RAW_FILEINFO_BASIC_INFO and RAW_FILEINFO_BASIC_INFORMATION interfaces */
590         struct {
591                 enum smb_fileinfo_level level;
592                 struct {
593                         union smb_handle_or_path file;
594                 } in;
595                 struct {
596                         NTTIME create_time;
597                         NTTIME access_time;
598                         NTTIME write_time;
599                         NTTIME change_time;
600                         uint32_t attrib;
601                 } out;
602         } basic_info;
603                 
604
605         /* RAW_FILEINFO_STANDARD_INFO and RAW_FILEINFO_STANDARD_INFORMATION interfaces */
606         struct {
607                 enum smb_fileinfo_level level;
608                 struct {
609                         union smb_handle_or_path file;
610                 } in;
611                 struct {
612                         uint64_t alloc_size;
613                         uint64_t size;
614                         uint32_t nlink;
615                         bool delete_pending;
616                         bool directory;
617                 } out;
618         } standard_info;
619         
620         /* RAW_FILEINFO_EA_INFO and RAW_FILEINFO_EA_INFORMATION interfaces */
621         struct {
622                 enum smb_fileinfo_level level;
623                 struct {
624                         union smb_handle_or_path file;
625                 } in;
626                 struct {
627                         uint32_t ea_size;
628                 } out;
629         } ea_info;
630
631         /* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */
632         struct {
633                 enum smb_fileinfo_level level;
634                 struct {
635                         union smb_handle_or_path file;
636                 } in;
637                 struct {
638                         struct smb_wire_string fname;
639                 } out;
640         } name_info;
641
642         /* RAW_FILEINFO_ALL_INFO and RAW_FILEINFO_ALL_INFORMATION interfaces */
643         struct {
644                 enum smb_fileinfo_level level;
645                 struct {
646                         union smb_handle_or_path file;
647                 } in;
648                 struct {
649                         NTTIME create_time;
650                         NTTIME access_time;
651                         NTTIME write_time;
652                         NTTIME change_time;
653                         uint32_t attrib;
654                         uint64_t alloc_size;
655                         uint64_t size;
656                         uint32_t nlink;
657                         uint8_t delete_pending;
658                         uint8_t directory;
659                         uint32_t ea_size;
660                         struct smb_wire_string fname;
661                 } out;
662         } all_info;     
663
664         /* RAW_FILEINFO_SMB2_ALL_INFORMATION interface */
665         struct {
666                 enum smb_fileinfo_level level;
667                 struct {
668                         union smb_handle_or_path file;
669                 } in;
670                 struct {
671                         NTTIME   create_time;
672                         NTTIME   access_time;
673                         NTTIME   write_time;
674                         NTTIME   change_time;
675                         uint32_t attrib;
676                         uint32_t unknown1;
677                         uint64_t alloc_size;
678                         uint64_t size;
679                         uint32_t nlink;
680                         uint8_t  delete_pending;
681                         uint8_t  directory;
682                         /* uint16_t _pad; */
683                         uint64_t file_id;
684                         uint32_t ea_size;
685                         uint32_t access_mask;
686                         uint64_t position;
687                         uint32_t mode;
688                         uint32_t alignment_requirement;
689                         struct smb_wire_string fname;
690                 } out;
691         } all_info2;
692
693         /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */
694         struct {
695                 enum smb_fileinfo_level level;
696                 struct {
697                         union smb_handle_or_path file;
698                 } in;
699                 struct {
700                         struct smb_wire_string fname;
701                 } out;
702         } alt_name_info;
703
704         /* RAW_FILEINFO_STREAM_INFO and RAW_FILEINFO_STREAM_INFORMATION interfaces */
705         struct {
706                 enum smb_fileinfo_level level;
707                 struct {
708                         union smb_handle_or_path file;
709                 } in;
710                 struct stream_information {
711                         uint_t num_streams;
712                         struct stream_struct *streams;
713                 } out;
714         } stream_info;
715         
716         /* RAW_FILEINFO_COMPRESSION_INFO and RAW_FILEINFO_COMPRESSION_INFORMATION interfaces */
717         struct {
718                 enum smb_fileinfo_level level;
719                 struct {
720                         union smb_handle_or_path file;
721                 } in;
722                 struct {
723                         uint64_t compressed_size;
724                         uint16_t format;
725                         uint8_t unit_shift;
726                         uint8_t chunk_shift;
727                         uint8_t cluster_shift;
728                 } out;
729         } compression_info;
730
731         /* RAW_FILEINFO_UNIX_BASIC interface */
732         struct {
733                 enum smb_fileinfo_level level;
734                 struct {
735                         union smb_handle_or_path file;
736                 } in;
737                 struct {
738                         uint64_t end_of_file;
739                         uint64_t num_bytes;
740                         NTTIME status_change_time;
741                         NTTIME access_time;
742                         NTTIME change_time;
743                         uint64_t uid;
744                         uint64_t gid;
745                         uint32_t file_type;
746                         uint64_t dev_major;
747                         uint64_t dev_minor;
748                         uint64_t unique_id;
749                         uint64_t permissions;
750                         uint64_t nlink;
751                 } out;
752         } unix_basic_info;
753
754         /* RAW_FILEINFO_UNIX_INFO2 interface */
755         struct {
756                 enum smb_fileinfo_level level;
757                 struct {
758                         union smb_handle_or_path file;
759                 } in;
760                 struct {
761                         uint64_t end_of_file;
762                         uint64_t num_bytes;
763                         NTTIME status_change_time;
764                         NTTIME access_time;
765                         NTTIME change_time;
766                         uint64_t uid;
767                         uint64_t gid;
768                         uint32_t file_type;
769                         uint64_t dev_major;
770                         uint64_t dev_minor;
771                         uint64_t unique_id;
772                         uint64_t permissions;
773                         uint64_t nlink;
774                         NTTIME create_time;
775                         uint32_t file_flags;
776                         uint32_t flags_mask;
777                 } out;
778         } unix_info2;
779
780         /* RAW_FILEINFO_UNIX_LINK interface */
781         struct {
782                 enum smb_fileinfo_level level;
783                 struct {
784                         union smb_handle_or_path file;
785                 } in;
786                 struct {
787                         struct smb_wire_string link_dest;
788                 } out;
789         } unix_link_info;
790
791         /* RAW_FILEINFO_INTERNAL_INFORMATION interface */
792         struct {
793                 enum smb_fileinfo_level level;
794                 struct {
795                         union smb_handle_or_path file;
796                 } in;
797                 struct {
798                         uint64_t file_id;
799                 } out;
800         } internal_information;
801
802         /* RAW_FILEINFO_ACCESS_INFORMATION interface */
803         struct {
804                 enum smb_fileinfo_level level;
805                 struct {
806                         union smb_handle_or_path file;
807                 } in;
808                 struct {
809                         uint32_t access_flags;
810                 } out;
811         } access_information;
812
813         /* RAW_FILEINFO_POSITION_INFORMATION interface */
814         struct {
815                 enum smb_fileinfo_level level;
816                 struct {
817                         union smb_handle_or_path file;
818                 } in;
819                 struct {
820                         uint64_t position;
821                 } out;
822         } position_information;
823
824         /* RAW_FILEINFO_MODE_INFORMATION interface */
825         struct {
826                 enum smb_fileinfo_level level;
827                 struct {
828                         union smb_handle_or_path file;
829                 } in;
830                 struct {
831                         uint32_t mode;
832                 } out;
833         } mode_information;
834
835         /* RAW_FILEINFO_ALIGNMENT_INFORMATION interface */
836         struct {
837                 enum smb_fileinfo_level level;
838                 struct {
839                         union smb_handle_or_path file;
840                 } in;
841                 struct {
842                         uint32_t alignment_requirement;
843                 } out;
844         } alignment_information;
845
846         /* RAW_FILEINFO_NETWORK_OPEN_INFORMATION interface */
847         struct {
848                 enum smb_fileinfo_level level;
849                 struct {
850                         union smb_handle_or_path file;
851                 } in;
852                 struct {
853                         NTTIME create_time;
854                         NTTIME access_time;
855                         NTTIME write_time;
856                         NTTIME change_time;
857                         uint64_t alloc_size;
858                         uint64_t size;
859                         uint32_t attrib;
860                 } out;
861         } network_open_information;
862
863
864         /* RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION interface */
865         struct {
866                 enum smb_fileinfo_level level;
867                 struct {
868                         union smb_handle_or_path file;
869                 } in;
870                 struct {
871                         uint32_t attrib;
872                         uint32_t reparse_tag;
873                 } out;
874         } attribute_tag_information;
875
876         /* RAW_FILEINFO_SEC_DESC */
877         struct {
878                 enum smb_fileinfo_level level;
879                 struct {
880                         union smb_handle_or_path file;
881                         uint32_t secinfo_flags;
882                 } in;
883                 struct {
884                         struct security_descriptor *sd;
885                 } out;
886         } query_secdesc;
887 };
888
889
890 enum smb_setfileinfo_level {
891         RAW_SFILEINFO_GENERIC                 = 0xF000, 
892         RAW_SFILEINFO_SETATTR,                /* SMBsetatr */
893         RAW_SFILEINFO_SETATTRE,               /* SMBsetattrE */
894         RAW_SFILEINFO_SEC_DESC,               /* NT_TRANSACT_SET_SECURITY_DESC */
895         RAW_SFILEINFO_STANDARD                = SMB_SFILEINFO_STANDARD,
896         RAW_SFILEINFO_EA_SET                  = SMB_SFILEINFO_EA_SET,
897         RAW_SFILEINFO_BASIC_INFO              = SMB_SFILEINFO_BASIC_INFO,
898         RAW_SFILEINFO_DISPOSITION_INFO        = SMB_SFILEINFO_DISPOSITION_INFO,
899         RAW_SFILEINFO_ALLOCATION_INFO         = SMB_SFILEINFO_ALLOCATION_INFO,
900         RAW_SFILEINFO_END_OF_FILE_INFO        = SMB_SFILEINFO_END_OF_FILE_INFO,
901         RAW_SFILEINFO_UNIX_BASIC              = SMB_SFILEINFO_UNIX_BASIC,
902         RAW_SFILEINFO_UNIX_INFO2              = SMB_SFILEINFO_UNIX_INFO2,
903         RAW_SFILEINFO_UNIX_LINK               = SMB_SFILEINFO_UNIX_LINK,
904         RAW_SFILEINFO_UNIX_HLINK              = SMB_SFILEINFO_UNIX_HLINK,
905         RAW_SFILEINFO_BASIC_INFORMATION       = SMB_SFILEINFO_BASIC_INFORMATION,
906         RAW_SFILEINFO_RENAME_INFORMATION      = SMB_SFILEINFO_RENAME_INFORMATION,
907         RAW_SFILEINFO_LINK_INFORMATION        = SMB_SFILEINFO_LINK_INFORMATION,
908         RAW_SFILEINFO_DISPOSITION_INFORMATION = SMB_SFILEINFO_DISPOSITION_INFORMATION,
909         RAW_SFILEINFO_POSITION_INFORMATION    = SMB_SFILEINFO_POSITION_INFORMATION,
910         RAW_SFILEINFO_FULL_EA_INFORMATION     = SMB_SFILEINFO_FULL_EA_INFORMATION,
911         RAW_SFILEINFO_MODE_INFORMATION        = SMB_SFILEINFO_MODE_INFORMATION,
912         RAW_SFILEINFO_ALLOCATION_INFORMATION  = SMB_SFILEINFO_ALLOCATION_INFORMATION,
913         RAW_SFILEINFO_END_OF_FILE_INFORMATION = SMB_SFILEINFO_END_OF_FILE_INFORMATION,
914         RAW_SFILEINFO_PIPE_INFORMATION        = SMB_SFILEINFO_PIPE_INFORMATION,
915         RAW_SFILEINFO_VALID_DATA_INFORMATION  = SMB_SFILEINFO_VALID_DATA_INFORMATION,
916         RAW_SFILEINFO_SHORT_NAME_INFORMATION  = SMB_SFILEINFO_SHORT_NAME_INFORMATION,
917         RAW_SFILEINFO_1025                    = SMB_SFILEINFO_1025,
918         RAW_SFILEINFO_1027                    = SMB_SFILEINFO_1027,
919         RAW_SFILEINFO_1029                    = SMB_SFILEINFO_1029,
920         RAW_SFILEINFO_1030                    = SMB_SFILEINFO_1030,
921         RAW_SFILEINFO_1031                    = SMB_SFILEINFO_1031,
922         RAW_SFILEINFO_1032                    = SMB_SFILEINFO_1032,
923         RAW_SFILEINFO_1036                    = SMB_SFILEINFO_1036,
924         RAW_SFILEINFO_1041                    = SMB_SFILEINFO_1041,
925         RAW_SFILEINFO_1042                    = SMB_SFILEINFO_1042,
926         RAW_SFILEINFO_1043                    = SMB_SFILEINFO_1043,
927         RAW_SFILEINFO_1044                    = SMB_SFILEINFO_1044,
928         
929         /* cope with breakage in SMB2 */
930         RAW_SFILEINFO_RENAME_INFORMATION_SMB2 = SMB_SFILEINFO_RENAME_INFORMATION|0x80000000,
931 };
932
933 /* union used in setfileinfo() and setpathinfo() calls */
934 union smb_setfileinfo {
935         /* generic interface */
936         struct {
937                 enum smb_setfileinfo_level level;
938                 struct {
939                         union smb_handle_or_path file;
940                 } in;
941         } generic;
942
943         /* RAW_SFILEINFO_SETATTR (SMBsetatr) interface - only via setpathinfo() */
944         struct {
945                 enum smb_setfileinfo_level level;
946                 struct {
947                         union smb_handle_or_path file;
948                         uint16_t attrib;
949                         time_t write_time;
950                 } in;
951         } setattr;
952
953         /* RAW_SFILEINFO_SETATTRE (SMBsetattrE) interface - only via setfileinfo() 
954            also RAW_SFILEINFO_STANDARD */
955         struct {
956                 enum smb_setfileinfo_level level;
957                 struct {
958                         union smb_handle_or_path file;
959                         time_t create_time;
960                         time_t access_time;
961                         time_t write_time;
962                         /* notice that size, alloc_size and attrib are not settable,
963                            unlike the corresponding qfileinfo level */
964                 } in;
965         } setattre, standard;
966
967         /* RAW_SFILEINFO_EA_SET interface */
968         struct {
969                 enum smb_setfileinfo_level level;
970                 struct {
971                         union smb_handle_or_path file;
972                         uint_t num_eas;
973                         struct ea_struct *eas;                  
974                 } in;
975         } ea_set;
976
977         /* RAW_SFILEINFO_BASIC_INFO and
978            RAW_SFILEINFO_BASIC_INFORMATION interfaces */
979         struct {
980                 enum smb_setfileinfo_level level;
981                 struct {
982                         union smb_handle_or_path file;
983                         NTTIME create_time;
984                         NTTIME access_time;
985                         NTTIME write_time;
986                         NTTIME change_time;
987                         uint32_t attrib;
988                         uint32_t reserved;
989                 } in;
990         } basic_info;
991
992         /* RAW_SFILEINFO_DISPOSITION_INFO and 
993            RAW_SFILEINFO_DISPOSITION_INFORMATION interfaces */
994         struct {
995                 enum smb_setfileinfo_level level;
996                 struct {
997                         union smb_handle_or_path file;
998                         bool delete_on_close;
999                 } in;
1000         } disposition_info;
1001
1002         /* RAW_SFILEINFO_ALLOCATION_INFO and 
1003            RAW_SFILEINFO_ALLOCATION_INFORMATION interfaces */
1004         struct {
1005                 enum smb_setfileinfo_level level;
1006                 struct {
1007                         union smb_handle_or_path file;
1008                         /* w2k3 rounds this up to nearest 4096 */
1009                         uint64_t alloc_size;
1010                 } in;
1011         } allocation_info;
1012         
1013         /* RAW_SFILEINFO_END_OF_FILE_INFO and 
1014            RAW_SFILEINFO_END_OF_FILE_INFORMATION interfaces */
1015         struct {
1016                 enum smb_setfileinfo_level level;
1017                 struct {
1018                         union smb_handle_or_path file;
1019                         uint64_t size;
1020                 } in;
1021         } end_of_file_info;
1022
1023         /* RAW_SFILEINFO_RENAME_INFORMATION interface */
1024         struct {
1025                 enum smb_setfileinfo_level level;
1026                 struct {
1027                         union smb_handle_or_path file;
1028                         uint8_t overwrite;
1029                         uint64_t root_fid;
1030                         const char *new_name;
1031                 } in;
1032         } rename_information;
1033
1034         /* RAW_SFILEINFO_LINK_INFORMATION interface */
1035         struct {
1036                 enum smb_setfileinfo_level level;
1037                 struct {
1038                         union smb_handle_or_path file;
1039                         uint8_t overwrite;
1040                         uint64_t root_fid;
1041                         const char *new_name;
1042                 } in;
1043         } link_information;
1044
1045         /* RAW_SFILEINFO_POSITION_INFORMATION interface */
1046         struct {
1047                 enum smb_setfileinfo_level level;
1048                 struct {
1049                         union smb_handle_or_path file;
1050                         uint64_t position;
1051                 } in;
1052         } position_information;
1053
1054         /* RAW_SFILEINFO_MODE_INFORMATION interface */
1055         struct {
1056                 enum smb_setfileinfo_level level;
1057                 struct {
1058                         union smb_handle_or_path file;
1059                         /* valid values seem to be 0, 2, 4 and 6 */
1060                         uint32_t mode;
1061                 } in;
1062         } mode_information;
1063
1064         /* RAW_SFILEINFO_UNIX_BASIC interface */
1065         struct {
1066                 enum smb_setfileinfo_level level;
1067                 struct {
1068                         union smb_handle_or_path file;
1069                         uint32_t mode; /* yuck - this field remains to fix compile of libcli/clifile.c */
1070                         uint64_t end_of_file;
1071                         uint64_t num_bytes;
1072                         NTTIME status_change_time;
1073                         NTTIME access_time;
1074                         NTTIME change_time;
1075                         uint64_t uid;
1076                         uint64_t gid;
1077                         uint32_t file_type;
1078                         uint64_t dev_major;
1079                         uint64_t dev_minor;
1080                         uint64_t unique_id;
1081                         uint64_t permissions;
1082                         uint64_t nlink;
1083                 } in;
1084         } unix_basic;
1085
1086         /* RAW_SFILEINFO_UNIX_INFO2 interface */
1087         struct {
1088                 enum smb_setfileinfo_level level;
1089                 struct {
1090                         union smb_handle_or_path file;
1091                         uint64_t end_of_file;
1092                         uint64_t num_bytes;
1093                         NTTIME status_change_time;
1094                         NTTIME access_time;
1095                         NTTIME change_time;
1096                         uint64_t uid;
1097                         uint64_t gid;
1098                         uint32_t file_type;
1099                         uint64_t dev_major;
1100                         uint64_t dev_minor;
1101                         uint64_t unique_id;
1102                         uint64_t permissions;
1103                         uint64_t nlink;
1104                         NTTIME create_time;
1105                         uint32_t file_flags;
1106                         uint32_t flags_mask;
1107                 } in;
1108         } unix_info2;
1109
1110         /* RAW_SFILEINFO_UNIX_LINK, RAW_SFILEINFO_UNIX_HLINK interface */
1111         struct {
1112                 enum smb_setfileinfo_level level;
1113                 struct {
1114                         union smb_handle_or_path file;
1115                         const char *link_dest;
1116                 } in;
1117         } unix_link, unix_hlink;
1118
1119         /* RAW_FILEINFO_SET_SEC_DESC */
1120         struct {
1121                 enum smb_setfileinfo_level level;
1122                 struct {
1123                         union smb_handle_or_path file;
1124                         uint32_t secinfo_flags;
1125                         struct security_descriptor *sd;
1126                 } in;
1127         } set_secdesc;
1128
1129         /* RAW_SFILEINFO_FULL_EA_INFORMATION */
1130         struct {
1131                 enum smb_setfileinfo_level level;
1132                 struct {
1133                         union smb_handle_or_path file;
1134                         struct smb_ea_list eas;
1135                 } in;
1136         } full_ea_information;
1137 };
1138
1139
1140 enum smb_fsinfo_level {
1141                    RAW_QFS_GENERIC                        = 0xF000, 
1142                    RAW_QFS_DSKATTR,                         /* SMBdskattr */
1143                    RAW_QFS_ALLOCATION                     = SMB_QFS_ALLOCATION,
1144                    RAW_QFS_VOLUME                         = SMB_QFS_VOLUME,
1145                    RAW_QFS_VOLUME_INFO                    = SMB_QFS_VOLUME_INFO,
1146                    RAW_QFS_SIZE_INFO                      = SMB_QFS_SIZE_INFO,
1147                    RAW_QFS_DEVICE_INFO                    = SMB_QFS_DEVICE_INFO,
1148                    RAW_QFS_ATTRIBUTE_INFO                 = SMB_QFS_ATTRIBUTE_INFO,
1149                    RAW_QFS_UNIX_INFO                      = SMB_QFS_UNIX_INFO,
1150                    RAW_QFS_VOLUME_INFORMATION             = SMB_QFS_VOLUME_INFORMATION,
1151                    RAW_QFS_SIZE_INFORMATION               = SMB_QFS_SIZE_INFORMATION,
1152                    RAW_QFS_DEVICE_INFORMATION             = SMB_QFS_DEVICE_INFORMATION,
1153                    RAW_QFS_ATTRIBUTE_INFORMATION          = SMB_QFS_ATTRIBUTE_INFORMATION,
1154                    RAW_QFS_QUOTA_INFORMATION              = SMB_QFS_QUOTA_INFORMATION,
1155                    RAW_QFS_FULL_SIZE_INFORMATION          = SMB_QFS_FULL_SIZE_INFORMATION,
1156                    RAW_QFS_OBJECTID_INFORMATION           = SMB_QFS_OBJECTID_INFORMATION};
1157
1158
1159 /* union for fsinfo() backend call. Note that there are no in
1160    structures, as this call only contains out parameters */
1161 union smb_fsinfo {
1162         /* generic interface */
1163         struct {
1164                 enum smb_fsinfo_level level;
1165                 struct smb2_handle handle; /* only for smb2 */
1166
1167                 struct {
1168                         uint32_t block_size;
1169                         uint64_t blocks_total;
1170                         uint64_t blocks_free;
1171                         uint32_t fs_id;
1172                         NTTIME create_time;
1173                         uint32_t serial_number;
1174                         uint32_t fs_attr;
1175                         uint32_t max_file_component_length;
1176                         uint32_t device_type;
1177                         uint32_t device_characteristics;
1178                         uint64_t quota_soft;
1179                         uint64_t quota_hard;
1180                         uint64_t quota_flags;
1181                         struct GUID guid;
1182                         char *volume_name;
1183                         char *fs_type;
1184                 } out;
1185         } generic;
1186
1187         /* SMBdskattr interface */
1188         struct {
1189                 enum smb_fsinfo_level level;
1190
1191                 struct {
1192                         uint16_t units_total;
1193                         uint16_t blocks_per_unit;
1194                         uint16_t block_size;
1195                         uint16_t units_free;
1196                 } out;
1197         } dskattr;
1198
1199         /* trans2 RAW_QFS_ALLOCATION interface */
1200         struct {
1201                 enum smb_fsinfo_level level;
1202
1203                 struct {
1204                         uint32_t fs_id;
1205                         uint32_t sectors_per_unit;
1206                         uint32_t total_alloc_units;
1207                         uint32_t avail_alloc_units;
1208                         uint16_t bytes_per_sector;
1209                 } out;
1210         } allocation;
1211
1212         /* TRANS2 RAW_QFS_VOLUME interface */
1213         struct {
1214                 enum smb_fsinfo_level level;
1215
1216                 struct {
1217                         uint32_t serial_number;
1218                         struct smb_wire_string volume_name;
1219                 } out;
1220         } volume;
1221
1222         /* TRANS2 RAW_QFS_VOLUME_INFO and RAW_QFS_VOLUME_INFORMATION interfaces */
1223         struct {
1224                 enum smb_fsinfo_level level;
1225                 struct smb2_handle handle; /* only for smb2 */
1226
1227                 struct {
1228                         NTTIME create_time;
1229                         uint32_t serial_number;
1230                         struct smb_wire_string volume_name;
1231                 } out;
1232         } volume_info;
1233
1234         /* trans2 RAW_QFS_SIZE_INFO and RAW_QFS_SIZE_INFORMATION interfaces */
1235         struct {
1236                 enum smb_fsinfo_level level;
1237                 struct smb2_handle handle; /* only for smb2 */
1238
1239                 struct {
1240                         uint64_t total_alloc_units;
1241                         uint64_t avail_alloc_units; /* maps to call_avail_alloc_units */
1242                         uint32_t sectors_per_unit;
1243                         uint32_t bytes_per_sector;
1244                 } out;
1245         } size_info;
1246
1247         /* TRANS2 RAW_QFS_DEVICE_INFO and RAW_QFS_DEVICE_INFORMATION interfaces */
1248         struct {
1249                 enum smb_fsinfo_level level;
1250                 struct smb2_handle handle; /* only for smb2 */
1251
1252                 struct {
1253                         uint32_t device_type;
1254                         uint32_t characteristics;
1255                 } out;
1256         } device_info;
1257
1258
1259         /* TRANS2 RAW_QFS_ATTRIBUTE_INFO and RAW_QFS_ATTRIBUTE_INFORMATION interfaces */
1260         struct {
1261                 enum smb_fsinfo_level level;
1262                 struct smb2_handle handle; /* only for smb2 */
1263
1264                 struct {
1265                         uint32_t fs_attr;
1266                         uint32_t max_file_component_length;
1267                         struct smb_wire_string fs_type;
1268                 } out;
1269         } attribute_info;
1270
1271
1272         /* TRANS2 RAW_QFS_UNIX_INFO interface */
1273         struct {
1274                 enum smb_fsinfo_level level;
1275
1276                 struct {
1277                         uint16_t major_version;
1278                         uint16_t minor_version;
1279                         uint64_t capability;
1280                 } out;
1281         } unix_info;
1282
1283         /* trans2 RAW_QFS_QUOTA_INFORMATION interface */
1284         struct {
1285                 enum smb_fsinfo_level level;
1286                 struct smb2_handle handle; /* only for smb2 */
1287
1288                 struct {
1289                         uint64_t unknown[3];
1290                         uint64_t quota_soft;
1291                         uint64_t quota_hard;
1292                         uint64_t quota_flags;
1293                 } out;
1294         } quota_information;    
1295
1296         /* trans2 RAW_QFS_FULL_SIZE_INFORMATION interface */
1297         struct {
1298                 enum smb_fsinfo_level level;
1299                 struct smb2_handle handle; /* only for smb2 */
1300
1301                 struct {
1302                         uint64_t total_alloc_units;
1303                         uint64_t call_avail_alloc_units;
1304                         uint64_t actual_avail_alloc_units;
1305                         uint32_t sectors_per_unit;
1306                         uint32_t bytes_per_sector;
1307                 } out;
1308         } full_size_information;
1309
1310         /* trans2 RAW_QFS_OBJECTID_INFORMATION interface */
1311         struct {
1312                 enum smb_fsinfo_level level;
1313                 struct smb2_handle handle; /* only for smb2 */
1314
1315                 struct {
1316                         struct GUID  guid;
1317                         uint64_t unknown[6];
1318                 } out;
1319         } objectid_information; 
1320 };
1321
1322
1323
1324 enum smb_open_level {
1325         RAW_OPEN_OPEN,
1326         RAW_OPEN_OPENX, 
1327         RAW_OPEN_MKNEW,
1328         RAW_OPEN_CREATE, 
1329         RAW_OPEN_CTEMP,
1330         RAW_OPEN_SPLOPEN,
1331         RAW_OPEN_NTCREATEX,
1332         RAW_OPEN_T2OPEN,
1333         RAW_OPEN_NTTRANS_CREATE, 
1334         RAW_OPEN_OPENX_READX,
1335         RAW_OPEN_SMB2
1336 };
1337
1338 /* the generic interface is defined to be equal to the NTCREATEX interface */
1339 #define RAW_OPEN_GENERIC RAW_OPEN_NTCREATEX
1340
1341 /* union for open() backend call */
1342 union smb_open {
1343 /* 
1344  * because the *.out.file structs are not aligned to the same offset for each level
1345  * we provide a hepler macro that should be used to find the current smb_handle structure
1346  */
1347 #define SMB_OPEN_OUT_FILE(op, file) do { \
1348         switch (op->generic.level) { \
1349         case RAW_OPEN_OPEN: \
1350                 file = &op->openold.out.file; \
1351                 break; \
1352         case RAW_OPEN_OPENX: \
1353                 file = &op->openx.out.file; \
1354                 break; \
1355         case RAW_OPEN_MKNEW: \
1356                 file = &op->mknew.out.file; \
1357                 break; \
1358         case RAW_OPEN_CREATE: \
1359                 file = &op->create.out.file; \
1360                 break; \
1361         case RAW_OPEN_CTEMP: \
1362                 file = &op->ctemp.out.file; \
1363                 break; \
1364         case RAW_OPEN_SPLOPEN: \
1365                 file = &op->splopen.out.file; \
1366                 break; \
1367         case RAW_OPEN_NTCREATEX: \
1368                 file = &op->ntcreatex.out.file; \
1369                 break; \
1370         case RAW_OPEN_T2OPEN: \
1371                 file = &op->t2open.out.file; \
1372                 break; \
1373         case RAW_OPEN_NTTRANS_CREATE: \
1374                 file = &op->nttrans.out.file; \
1375                 break; \
1376         case RAW_OPEN_OPENX_READX: \
1377                 file = &op->openxreadx.out.file; \
1378                 break; \
1379         case RAW_OPEN_SMB2: \
1380                 file = &op->smb2.out.file; \
1381                 break; \
1382         default: \
1383                 /* this must be a programmer error */ \
1384                 file = NULL; \
1385                 break; \
1386         } \
1387 } while (0)
1388         /* SMBNTCreateX, nttrans and generic interface */
1389         struct {
1390                 enum smb_open_level level;
1391                 struct {
1392                         uint32_t flags;
1393                         uint32_t root_fid;
1394                         uint32_t access_mask;
1395                         uint64_t alloc_size;
1396                         uint32_t file_attr;
1397                         uint32_t share_access;
1398                         uint32_t open_disposition;
1399                         uint32_t create_options;
1400                         uint32_t impersonation;
1401                         uint8_t  security_flags;
1402                         /* NOTE: fname can also be a pointer to a
1403                          uint64_t file_id if create_options has the
1404                          NTCREATEX_OPTIONS_OPEN_BY_FILE_ID flag set */
1405                         const char *fname;
1406
1407                         /* these last 2 elements are only used in the
1408                            NTTRANS varient of the call */
1409                         struct security_descriptor *sec_desc;
1410                         struct smb_ea_list *ea_list;
1411                         
1412                         /* some optional parameters from the SMB2 varient */
1413                         bool query_maximal_access;
1414                 } in;
1415                 struct {
1416                         union smb_handle file;
1417                         uint8_t oplock_level;
1418                         uint32_t create_action;
1419                         NTTIME create_time;
1420                         NTTIME access_time;
1421                         NTTIME write_time;
1422                         NTTIME change_time;
1423                         uint32_t attrib;
1424                         uint64_t alloc_size;
1425                         uint64_t size;
1426                         uint16_t file_type;
1427                         uint16_t ipc_state;
1428                         uint8_t  is_directory;
1429
1430                         /* optional return values matching SMB2 tagged
1431                            values in the call */
1432                         uint32_t maximal_access;
1433                 } out;
1434         } ntcreatex, nttrans, generic;
1435
1436         /* TRANS2_OPEN interface */
1437         struct {
1438                 enum smb_open_level level;
1439                 struct {
1440                         uint16_t flags;
1441                         uint16_t open_mode;
1442                         uint16_t search_attrs;
1443                         uint16_t file_attrs;
1444                         time_t write_time;
1445                         uint16_t open_func;
1446                         uint32_t size;
1447                         uint32_t timeout;
1448                         const char *fname;
1449                         uint_t num_eas;
1450                         struct ea_struct *eas;                  
1451                 } in;
1452                 struct {
1453                         union smb_handle file;
1454                         uint16_t attrib;
1455                         time_t write_time;
1456                         uint32_t size;
1457                         uint16_t access;
1458                         uint16_t ftype;
1459                         uint16_t devstate;
1460                         uint16_t action;
1461                         uint32_t file_id;
1462                 } out;
1463         } t2open;
1464
1465         /* SMBopen interface */
1466         struct {
1467                 enum smb_open_level level;
1468                 struct {
1469                         uint16_t open_mode;
1470                         uint16_t search_attrs;
1471                         const char *fname;
1472                 } in;
1473                 struct {
1474                         union smb_handle file;
1475                         uint16_t attrib;
1476                         time_t write_time;
1477                         uint32_t size;
1478                         uint16_t rmode;
1479                 } out;
1480         } openold;
1481
1482         /* SMBopenX interface */
1483         struct {
1484                 enum smb_open_level level;
1485                 struct {
1486                         uint16_t flags;
1487                         uint16_t open_mode;
1488                         uint16_t search_attrs; /* not honoured by win2003 */
1489                         uint16_t file_attrs;
1490                         time_t write_time; /* not honoured by win2003 */
1491                         uint16_t open_func;
1492                         uint32_t size; /* note that this sets the
1493                                         initial file size, not
1494                                         just allocation size */
1495                         uint32_t timeout; /* not honoured by win2003 */
1496                         const char *fname;
1497                 } in;
1498                 struct {
1499                         union smb_handle file;
1500                         uint16_t attrib;
1501                         time_t write_time;
1502                         uint32_t size;
1503                         uint16_t access;
1504                         uint16_t ftype;
1505                         uint16_t devstate;
1506                         uint16_t action;
1507                         uint32_t unique_fid;
1508                         uint32_t access_mask;
1509                         uint32_t unknown;
1510                 } out;
1511         } openx;
1512
1513         /* SMBmknew interface */
1514         struct {
1515                 enum smb_open_level level;
1516                 struct {
1517                         uint16_t attrib;
1518                         time_t write_time;
1519                         const char *fname;
1520                 } in;
1521                 struct {
1522                         union smb_handle file;
1523                 } out;
1524         } mknew, create;
1525
1526         /* SMBctemp interface */
1527         struct {
1528                 enum smb_open_level level;
1529                 struct {
1530                         uint16_t attrib;
1531                         time_t write_time;
1532                         const char *directory;
1533                 } in;
1534                 struct {
1535                         union smb_handle file;
1536                         /* temp name, relative to directory */
1537                         char *name; 
1538                 } out;
1539         } ctemp;
1540
1541         /* SMBsplopen interface */
1542         struct {
1543                 enum smb_open_level level;
1544                 struct {
1545                         uint16_t setup_length;
1546                         uint16_t mode;
1547                         const char *ident;
1548                 } in;
1549                 struct {
1550                         union smb_handle file;
1551                 } out;
1552         } splopen;
1553
1554
1555         /* chained OpenX/ReadX interface */
1556         struct {
1557                 enum smb_open_level level;
1558                 struct {
1559                         uint16_t flags;
1560                         uint16_t open_mode;
1561                         uint16_t search_attrs; /* not honoured by win2003 */
1562                         uint16_t file_attrs;
1563                         time_t write_time; /* not honoured by win2003 */
1564                         uint16_t open_func;
1565                         uint32_t size; /* note that this sets the
1566                                         initial file size, not
1567                                         just allocation size */
1568                         uint32_t timeout; /* not honoured by win2003 */
1569                         const char *fname;
1570
1571                         /* readx part */
1572                         uint64_t offset;
1573                         uint16_t mincnt;
1574                         uint32_t maxcnt;
1575                         uint16_t remaining;
1576                 } in;
1577                 struct {
1578                         union smb_handle file;
1579                         uint16_t attrib;
1580                         time_t write_time;
1581                         uint32_t size;
1582                         uint16_t access;
1583                         uint16_t ftype;
1584                         uint16_t devstate;
1585                         uint16_t action;
1586                         uint32_t unique_fid;
1587                         uint32_t access_mask;
1588                         uint32_t unknown;
1589                         
1590                         /* readx part */
1591                         uint8_t *data;
1592                         uint16_t remaining;
1593                         uint16_t compaction_mode;
1594                         uint16_t nread;
1595                 } out;
1596         } openxreadx;
1597
1598 #define SMB2_CREATE_FLAG_REQUEST_OPLOCK           0x0100
1599 #define SMB2_CREATE_FLAG_REQUEST_EXCLUSIVE_OPLOCK 0x0800
1600 #define SMB2_CREATE_FLAG_GRANT_OPLOCK             0x0001
1601 #define SMB2_CREATE_FLAG_GRANT_EXCLUSIVE_OPLOCK   0x0080
1602
1603         /* SMB2 Create */
1604         struct smb2_create {
1605                 enum smb_open_level level;
1606                 struct {
1607                         /* static body buffer 56 (0x38) bytes */
1608                         uint8_t  security_flags;      /* SMB2_SECURITY_* */
1609                         uint8_t  oplock_level;        /* SMB2_OPLOCK_LEVEL_* */
1610                         uint32_t impersonation_level; /* SMB2_IMPERSONATION_* */
1611                         uint64_t create_flags;
1612                         uint64_t reserved;
1613                         uint32_t desired_access;
1614                         uint32_t file_attributes;
1615                         uint32_t share_access; /* NTCREATEX_SHARE_ACCESS_* */
1616                         uint32_t create_disposition; /* NTCREATEX_DISP_* */
1617                         uint32_t create_options; /* NTCREATEX_OPTIONS_* */
1618
1619                         /* uint16_t fname_ofs */
1620                         /* uint16_t fname_size */
1621                         /* uint32_t blob_ofs; */
1622                         /* uint32_t blob_size; */
1623
1624                         /* dynamic body */
1625                         const char *fname;
1626
1627                         /* now some optional parameters - encoded as tagged blobs */
1628                         struct smb_ea_list eas;
1629                         uint64_t alloc_size;
1630                         struct security_descriptor *sec_desc;
1631                         bool   durable_open;
1632                         struct smb2_handle *durable_handle;
1633                         bool   query_maximal_access;
1634                         NTTIME timewarp;
1635                         bool   query_on_disk_id;
1636                         
1637                         /* and any additional blobs the caller wants */
1638                         struct smb2_create_blobs {
1639                                 uint32_t num_blobs;
1640                                 struct smb2_create_blob {
1641                                         const char *tag;
1642                                         DATA_BLOB data;
1643                                 } *blobs;
1644                         } blobs;
1645                 } in;
1646                 struct {
1647                         union smb_handle file;
1648
1649                         /* static body buffer 88 (0x58) bytes */
1650                         /* uint16_t buffer_code;  0x59 = 0x58 + 1 */
1651                         uint8_t oplock_level;
1652                         uint8_t reserved;
1653                         uint32_t create_action;
1654                         NTTIME   create_time;
1655                         NTTIME   access_time;
1656                         NTTIME   write_time;
1657                         NTTIME   change_time;
1658                         uint64_t alloc_size;
1659                         uint64_t size;
1660                         uint32_t file_attr;
1661                         uint32_t reserved2;
1662                         /* struct smb2_handle handle;*/
1663                         /* uint32_t blob_ofs; */
1664                         /* uint32_t blob_size; */
1665
1666                         /* optional return values matching tagged values in the call */
1667                         uint32_t maximal_access;
1668                         uint8_t on_disk_id[32];
1669
1670                         /* tagged blobs in the reply */
1671                         struct smb2_create_blobs blobs;
1672                 } out;
1673         } smb2;
1674 };
1675
1676
1677
1678 enum smb_read_level {
1679         RAW_READ_READBRAW,
1680         RAW_READ_LOCKREAD,
1681         RAW_READ_READ,
1682         RAW_READ_READX,
1683         RAW_READ_SMB2
1684 };
1685
1686 #define RAW_READ_GENERIC RAW_READ_READX
1687
1688 /* union for read() backend call 
1689
1690    note that .infoX.out.data will be allocated before the backend is
1691    called. It will be big enough to hold the maximum size asked for
1692 */
1693 union smb_read {
1694         /* SMBreadX (and generic) interface */
1695         struct {
1696                 enum smb_read_level level;
1697                 struct {
1698                         union smb_handle file;
1699                         uint64_t offset;
1700                         uint32_t mincnt; /* enforced on SMB2, 16 bit on SMB */
1701                         uint32_t maxcnt;
1702                         uint16_t remaining;
1703                         bool read_for_execute;
1704                 } in;
1705                 struct {
1706                         uint8_t *data;
1707                         uint16_t remaining;
1708                         uint16_t compaction_mode;
1709                         uint32_t nread;
1710                 } out;
1711         } readx, generic;
1712
1713         /* SMBreadbraw interface */
1714         struct {
1715                 enum smb_read_level level;
1716                 struct {
1717                         union smb_handle file;
1718                         uint64_t offset;
1719                         uint16_t  maxcnt;
1720                         uint16_t  mincnt;
1721                         uint32_t  timeout;
1722                 } in;
1723                 struct {
1724                         uint8_t *data;
1725                         uint32_t nread;
1726                 } out;
1727         } readbraw;
1728
1729
1730         /* SMBlockandread interface */
1731         struct {
1732                 enum smb_read_level level;
1733                 struct {
1734                         union smb_handle file;
1735                         uint16_t count;
1736                         uint32_t offset;
1737                         uint16_t remaining;
1738                 } in;
1739                 struct {
1740                         uint8_t *data;
1741                         uint16_t nread;
1742                 } out;
1743         } lockread;
1744
1745         /* SMBread interface */
1746         struct {
1747                 enum smb_read_level level;
1748                 struct {
1749                         union smb_handle file;
1750                         uint16_t count;
1751                         uint32_t offset;
1752                         uint16_t remaining;
1753                 } in;
1754                 struct {
1755                         uint8_t *data;
1756                         uint16_t nread;
1757                 } out;
1758         } read;
1759
1760         /* SMB2 Read */
1761         struct smb2_read {
1762                 enum smb_read_level level;
1763                 struct {
1764                         union smb_handle file;
1765
1766                         /* static body buffer 48 (0x30) bytes */
1767                         /* uint16_t buffer_code;  0x31 = 0x30 + 1 */
1768                         uint8_t _pad;
1769                         uint8_t reserved;
1770                         uint32_t length;
1771                         uint64_t offset;
1772                         /* struct smb2_handle handle; */
1773                         uint32_t min_count;
1774                         uint32_t channel;
1775                         uint32_t remaining;
1776                         /* the docs give no indication of what
1777                            these channel variables are for */
1778                         uint16_t channel_offset;
1779                         uint16_t channel_length;
1780                 } in;
1781                 struct {
1782                         /* static body buffer 16 (0x10) bytes */
1783                         /* uint16_t buffer_code;  0x11 = 0x10 + 1 */
1784                         /* uint8_t data_ofs; */
1785                         /* uint8_t reserved; */
1786                         /* uint32_t data_size; */
1787                         uint32_t remaining;
1788                         uint32_t reserved;
1789
1790                         /* dynamic body */
1791                         DATA_BLOB data;
1792                 } out;
1793         } smb2;
1794 };
1795
1796
1797 enum smb_write_level {
1798         RAW_WRITE_WRITEUNLOCK,
1799         RAW_WRITE_WRITE,
1800         RAW_WRITE_WRITEX,
1801         RAW_WRITE_WRITECLOSE,
1802         RAW_WRITE_SPLWRITE,
1803         RAW_WRITE_SMB2
1804 };
1805
1806 #define RAW_WRITE_GENERIC RAW_WRITE_WRITEX
1807
1808 /* union for write() backend call 
1809 */
1810 union smb_write {
1811         /* SMBwriteX interface */
1812         struct {
1813                 enum smb_write_level level;
1814                 struct {
1815                         union smb_handle file;
1816                         uint64_t offset;
1817                         uint16_t wmode;
1818                         uint16_t remaining;
1819                         uint32_t count;
1820                         const uint8_t *data;
1821                 } in;
1822                 struct {
1823                         uint32_t nwritten;
1824                         uint16_t remaining;
1825                 } out;
1826         } writex, generic;
1827
1828         /* SMBwriteunlock interface */
1829         struct {
1830                 enum smb_write_level level;
1831                 struct {
1832                         union smb_handle file;
1833                         uint16_t count;
1834                         uint32_t offset;
1835                         uint16_t remaining;
1836                         const uint8_t *data;
1837                 } in;
1838                 struct {
1839                         uint32_t nwritten;
1840                 } out;
1841         } writeunlock;
1842
1843         /* SMBwrite interface */
1844         struct {
1845                 enum smb_write_level level;
1846                 struct {
1847                         union smb_handle file;
1848                         uint16_t count;
1849                         uint32_t offset;
1850                         uint16_t remaining;
1851                         const uint8_t *data;
1852                 } in;
1853                 struct {
1854                         uint16_t nwritten;
1855                 } out;
1856         } write;
1857
1858         /* SMBwriteclose interface */
1859         struct {
1860                 enum smb_write_level level;
1861                 struct {
1862                         union smb_handle file;
1863                         uint16_t count;
1864                         uint32_t offset;
1865                         time_t mtime;
1866                         const uint8_t *data;
1867                 } in;
1868                 struct {
1869                         uint16_t nwritten;
1870                 } out;
1871         } writeclose;
1872
1873         /* SMBsplwrite interface */
1874         struct {
1875                 enum smb_write_level level;
1876                 struct {
1877                         union smb_handle file;
1878                         uint16_t count;
1879                         const uint8_t *data;
1880                 } in;
1881         } splwrite;
1882
1883         /* SMB2 Write */
1884         struct smb2_write {
1885                 enum smb_write_level level;
1886                 struct {
1887                         union smb_handle file;
1888
1889                         /* static body buffer 48 (0x30) bytes */
1890                         /* uint16_t buffer_code;  0x31 = 0x30 + 1 */
1891                         /* uint16_t data_ofs; */
1892                         /* uint32_t data_size; */
1893                         uint64_t offset;
1894                         /* struct smb2_handle handle; */
1895                         uint64_t unknown1; /* 0xFFFFFFFFFFFFFFFF */
1896                         uint64_t unknown2; /* 0xFFFFFFFFFFFFFFFF */
1897
1898                         /* dynamic body */
1899                         DATA_BLOB data;
1900                 } in;
1901                 struct {
1902                         /* static body buffer 17 (0x11) bytes */
1903                         /* uint16_t buffer_code;  0x11 = 0x10 + 1*/
1904                         uint16_t _pad;
1905                         uint32_t nwritten;
1906                         uint64_t unknown1; /* 0x0000000000000000 */
1907                 } out;
1908         } smb2;
1909 };
1910
1911
1912 enum smb_lock_level {
1913         RAW_LOCK_LOCK,
1914         RAW_LOCK_UNLOCK,
1915         RAW_LOCK_LOCKX,
1916         RAW_LOCK_SMB2,
1917         RAW_LOCK_SMB2_BREAK
1918 };
1919
1920 #define RAW_LOCK_GENERIC RAW_LOCK_LOCKX
1921
1922 /* union for lock() backend call 
1923 */
1924 union smb_lock {
1925         /* SMBlockingX and generic interface */
1926         struct {
1927                 enum smb_lock_level level;
1928                 struct {
1929                         union smb_handle file;
1930                         uint16_t mode;
1931                         uint32_t timeout;
1932                         uint16_t ulock_cnt;
1933                         uint16_t lock_cnt;
1934                         struct smb_lock_entry {
1935                                 uint32_t pid; /* 16 bits in SMB1 */
1936                                 uint64_t offset;
1937                                 uint64_t count;
1938                         } *locks; /* unlocks are first in the arrray */
1939                 } in;
1940         } generic, lockx;
1941
1942         /* SMBlock and SMBunlock interface */
1943         struct {
1944                 enum smb_lock_level level;
1945                 struct {
1946                         union smb_handle file;
1947                         uint32_t count;
1948                         uint32_t offset;
1949                 } in;
1950         } lock, unlock;
1951
1952         /* SMB2 Lock */
1953         struct smb2_lock {
1954                 enum smb_lock_level level;
1955                 struct {
1956                         union smb_handle file;
1957
1958                         /* static body buffer 48 (0x30) bytes */
1959                         /* uint16_t buffer_code;  0x30 */
1960                         uint16_t lock_count;
1961                         uint32_t reserved;
1962                         /* struct smb2_handle handle; */
1963                         struct smb2_lock_element {
1964                                 uint64_t offset;
1965                                 uint64_t length;
1966 /* these flags are the same as the SMB2 lock flags */
1967 #define SMB2_LOCK_FLAG_NONE             0x00000000
1968 #define SMB2_LOCK_FLAG_SHARED           0x00000001
1969 #define SMB2_LOCK_FLAG_EXCLUSIVE        0x00000002
1970 #define SMB2_LOCK_FLAG_UNLOCK           0x00000004
1971 #define SMB2_LOCK_FLAG_FAIL_IMMEDIATELY 0x00000010
1972 #define SMB2_LOCK_FLAG_ALL_MASK         0x00000017
1973                                 uint32_t flags;
1974                                 uint32_t reserved;
1975                         } *locks;
1976                 } in;
1977                 struct {
1978                         /* static body buffer 4 (0x04) bytes */
1979                         /* uint16_t buffer_code;  0x04 */
1980                         uint16_t reserved;
1981                 } out;
1982         } smb2;
1983
1984         /* SMB2 Break */
1985         struct smb2_break {
1986                 enum smb_lock_level level;
1987                 struct {
1988                         union smb_handle file;
1989
1990                         /* static body buffer 24 (0x18) bytes */
1991                         uint8_t oplock_level;
1992                         uint8_t reserved;
1993                         uint32_t reserved2;
1994                         /* struct smb2_handle handle; */
1995                 } in, out;
1996         } smb2_break;
1997 };
1998
1999
2000 enum smb_close_level {
2001         RAW_CLOSE_CLOSE,
2002         RAW_CLOSE_SPLCLOSE,
2003         RAW_CLOSE_SMB2,
2004         RAW_CLOSE_GENERIC,
2005 };
2006
2007 /*
2008   union for close() backend call
2009 */
2010 union smb_close {
2011         /* generic interface */
2012         struct {
2013                 enum smb_close_level level;
2014                 struct {
2015                         union smb_handle file;
2016                         time_t write_time;
2017 #define SMB2_CLOSE_FLAGS_FULL_INFORMATION (1<<0)
2018                         uint16_t flags; /* SMB2_CLOSE_FLAGS_* */
2019                 } in;
2020                 struct {
2021                         uint16_t flags;
2022                         NTTIME   create_time;
2023                         NTTIME   access_time;
2024                         NTTIME   write_time;
2025                         NTTIME   change_time;
2026                         uint64_t alloc_size;
2027                         uint64_t size;
2028                         uint32_t file_attr;
2029                 } out;
2030         } generic;
2031
2032         /* SMBclose interface */
2033         struct {
2034                 enum smb_close_level level;
2035                 struct {
2036                         union smb_handle file;
2037                         time_t write_time;
2038                 } in;
2039         } close;
2040
2041         /* SMBsplclose interface - empty! */
2042         struct {
2043                 enum smb_close_level level;
2044                 struct {
2045                         union smb_handle file;
2046                 } in;
2047         } splclose;
2048
2049         /* SMB2 Close */
2050         struct smb2_close {
2051                 enum smb_close_level level;
2052                 struct {
2053                         union smb_handle file;
2054
2055                         /* static body buffer 24 (0x18) bytes */
2056                         /* uint16_t buffer_code;  0x18 */
2057                         uint16_t flags; /* SMB2_CLOSE_FLAGS_* */
2058                         uint32_t _pad;
2059                 } in;
2060                 struct {
2061                         /* static body buffer 60 (0x3C) bytes */
2062                         /* uint16_t buffer_code;  0x3C */
2063                         uint16_t flags;
2064                         uint32_t _pad;
2065                         NTTIME   create_time;
2066                         NTTIME   access_time;
2067                         NTTIME   write_time;
2068                         NTTIME   change_time;
2069                         uint64_t alloc_size;
2070                         uint64_t size;
2071                         uint32_t file_attr;
2072                 } out;
2073         } smb2;
2074 };
2075
2076
2077 enum smb_lpq_level {RAW_LPQ_GENERIC, RAW_LPQ_RETQ};
2078
2079 /*
2080   union for lpq() backend
2081 */
2082 union smb_lpq {
2083         /* generic interface */
2084         struct {
2085                 enum smb_lpq_level level;
2086
2087         } generic;
2088
2089
2090         /* SMBsplretq interface */
2091         struct {
2092                 enum smb_lpq_level level;
2093
2094                 struct {
2095                         uint16_t maxcount;
2096                         uint16_t startidx;
2097                 } in;
2098                 struct {
2099                         uint16_t count;
2100                         uint16_t restart_idx;
2101                         struct {
2102                                 time_t time;
2103                                 uint8_t status;
2104                                 uint16_t job;
2105                                 uint32_t size;
2106                                 char *user;
2107                         } *queue;
2108                 } out;
2109         } retq;
2110 };
2111
2112 enum smb_ioctl_level {
2113         RAW_IOCTL_IOCTL,
2114         RAW_IOCTL_NTIOCTL,
2115         RAW_IOCTL_SMB2,
2116         RAW_IOCTL_SMB2_NO_HANDLE
2117 };
2118
2119 /*
2120   union for ioctl() backend
2121 */
2122 union smb_ioctl {
2123         /* generic interface */
2124         struct {
2125                 enum smb_ioctl_level level;
2126                 struct {
2127                         union smb_handle file;
2128                 } in;
2129         } generic;
2130
2131         /* struct for SMBioctl */
2132         struct {
2133                 enum smb_ioctl_level level;
2134                 struct {
2135                         union smb_handle file;
2136                         uint32_t request;
2137                 } in;
2138                 struct {
2139                         DATA_BLOB blob;
2140                 } out;
2141         } ioctl;
2142
2143
2144         /* struct for NT ioctl call */
2145         struct {
2146                 enum smb_ioctl_level level;
2147                 struct {
2148                         union smb_handle file;
2149                         uint32_t function;
2150                         bool fsctl;
2151                         uint8_t filter;
2152                         uint32_t max_data;
2153                         DATA_BLOB blob;
2154                 } in;
2155                 struct {
2156                         DATA_BLOB blob;
2157                 } out;
2158         } ntioctl;
2159
2160         /* SMB2 Ioctl */
2161         struct smb2_ioctl {
2162                 enum smb_ioctl_level level;
2163                 struct {
2164                         union smb_handle file;
2165
2166                         /* static body buffer 56 (0x38) bytes */
2167                         /* uint16_t buffer_code;  0x39 = 0x38 + 1 */
2168                         uint16_t _pad;
2169                         uint32_t function;
2170                         /*struct smb2_handle handle;*/
2171                         /* uint32_t out_ofs; */
2172                         /* uint32_t out_size; */
2173                         uint32_t unknown2;
2174                         /* uint32_t in_ofs; */
2175                         /* uint32_t in_size; */
2176                         uint32_t max_response_size;
2177                         uint64_t flags;
2178
2179                         /* dynamic body */
2180                         DATA_BLOB out;
2181                         DATA_BLOB in;
2182                 } in;
2183                 struct {
2184                         union smb_handle file;
2185
2186                         /* static body buffer 48 (0x30) bytes */
2187                         /* uint16_t buffer_code;  0x31 = 0x30 + 1 */
2188                         uint16_t _pad;
2189                         uint32_t function;
2190                         /* struct smb2_handle handle; */
2191                         /* uint32_t in_ofs; */
2192                         /* uint32_t in_size; */
2193                         /* uint32_t out_ofs; */
2194                         /* uint32_t out_size; */
2195                         uint32_t unknown2;
2196                         uint32_t unknown3;
2197
2198                         /* dynamic body */
2199                         DATA_BLOB in;
2200                         DATA_BLOB out;
2201                 } out;
2202         } smb2;
2203 };
2204
2205 enum smb_flush_level {
2206         RAW_FLUSH_FLUSH,
2207         RAW_FLUSH_ALL,
2208         RAW_FLUSH_SMB2
2209 };
2210
2211 union smb_flush {
2212         /* struct for SMBflush */
2213         struct {
2214                 enum smb_flush_level level;
2215                 struct {
2216                         union smb_handle file;
2217                 } in;
2218         } flush, generic;
2219
2220         /* SMBflush with 0xFFFF wildcard fnum */
2221         struct {
2222                 enum smb_flush_level level;
2223         } flush_all;
2224
2225         /* SMB2 Flush */
2226         struct smb2_flush {
2227                 enum smb_flush_level level;
2228                 struct {
2229                         union smb_handle file;
2230                         uint16_t reserved1;
2231                         uint32_t reserved2;
2232                 } in;
2233                 struct {
2234                         uint16_t reserved;
2235                 } out;
2236         } smb2;
2237 };
2238
2239 /* struct for SMBcopy */
2240 struct smb_copy {
2241         struct {
2242                 uint16_t tid2;
2243                 uint16_t ofun;
2244                 uint16_t flags;
2245                 const char *path1;
2246                 const char *path2;
2247         } in;
2248         struct {
2249                 uint16_t count;
2250         } out;
2251 };
2252
2253
2254 /* struct for transact/transact2 call */
2255 struct smb_trans2 {
2256         struct {
2257                 uint16_t max_param;
2258                 uint16_t max_data;
2259                 uint8_t  max_setup;
2260                 uint16_t flags;
2261                 uint32_t timeout;
2262                 uint8_t  setup_count;
2263                 uint16_t *setup;
2264                 const char *trans_name; /* SMBtrans only */
2265                 DATA_BLOB params;
2266                 DATA_BLOB data;
2267         } in;
2268
2269         struct {
2270                 uint8_t  setup_count;
2271                 uint16_t *setup;
2272                 DATA_BLOB params;
2273                 DATA_BLOB data;
2274         } out;
2275 };
2276
2277 /* struct for nttransact2 call */
2278 struct smb_nttrans {
2279         struct {
2280                 uint8_t  max_setup;
2281                 uint32_t max_param;
2282                 uint32_t max_data;
2283                 uint8_t setup_count;
2284                 uint16_t function;
2285                 uint8_t  *setup;
2286                 DATA_BLOB params;
2287                 DATA_BLOB data;
2288         } in;
2289
2290         struct {
2291                 uint8_t  setup_count; /* in units of 16 bit words */
2292                 uint8_t  *setup;
2293                 DATA_BLOB params;
2294                 DATA_BLOB data;
2295         } out;
2296 };
2297
2298 enum smb_notify_level {
2299         RAW_NOTIFY_NTTRANS,
2300         RAW_NOTIFY_SMB2
2301 };
2302
2303 union smb_notify {
2304         /* struct for nttrans change notify call */
2305         struct {
2306                 enum smb_notify_level level;
2307
2308                 struct {
2309                         union smb_handle file;
2310                         uint32_t buffer_size;
2311                         uint32_t completion_filter;
2312                         bool recursive;
2313                 } in;
2314
2315                 struct {
2316                         uint32_t num_changes;
2317                         struct notify_changes {
2318                                 uint32_t action;
2319                                 struct smb_wire_string name;
2320                         } *changes;
2321                 } out;
2322         } nttrans;
2323
2324         struct smb2_notify {
2325                 enum smb_notify_level level;
2326                 
2327                 struct {
2328                         union smb_handle file;
2329                         /* static body buffer 32 (0x20) bytes */
2330                         /* uint16_t buffer_code;  0x32 */
2331                         uint16_t recursive;
2332                         uint32_t buffer_size;
2333                         /*struct  smb2_handle file;*/
2334                         uint32_t completion_filter;
2335                         uint32_t unknown;
2336                 } in;
2337
2338                 struct {
2339                         /* static body buffer 8 (0x08) bytes */
2340                         /* uint16_t buffer_code; 0x09 = 0x08 + 1 */
2341                         /* uint16_t blob_ofs; */
2342                         /* uint16_t blob_size; */
2343
2344                         /* dynamic body */
2345                         /*DATA_BLOB blob;*/
2346
2347                         /* DATA_BLOB content */
2348                         uint32_t num_changes;
2349                         struct notify_changes *changes;
2350                 } out;
2351         } smb2;
2352 };
2353
2354 enum smb_search_level {
2355         RAW_SEARCH_SEARCH,      /* SMBsearch */ 
2356         RAW_SEARCH_FFIRST,      /* SMBffirst */ 
2357         RAW_SEARCH_FUNIQUE,     /* SMBfunique */
2358         RAW_SEARCH_TRANS2,      /* SMBtrans2 */
2359         RAW_SEARCH_SMB2         /* SMB2 Find */
2360 };
2361
2362 enum smb_search_data_level {
2363         RAW_SEARCH_DATA_GENERIC                 = 0x10000, /* only used in the smbcli_ code */
2364         RAW_SEARCH_DATA_SEARCH,
2365         RAW_SEARCH_DATA_STANDARD                = SMB_FIND_STANDARD,
2366         RAW_SEARCH_DATA_EA_SIZE                 = SMB_FIND_EA_SIZE,
2367         RAW_SEARCH_DATA_EA_LIST                 = SMB_FIND_EA_LIST,
2368         RAW_SEARCH_DATA_DIRECTORY_INFO          = SMB_FIND_DIRECTORY_INFO,
2369         RAW_SEARCH_DATA_FULL_DIRECTORY_INFO     = SMB_FIND_FULL_DIRECTORY_INFO,
2370         RAW_SEARCH_DATA_NAME_INFO               = SMB_FIND_NAME_INFO,
2371         RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO     = SMB_FIND_BOTH_DIRECTORY_INFO,
2372         RAW_SEARCH_DATA_ID_FULL_DIRECTORY_INFO  = SMB_FIND_ID_FULL_DIRECTORY_INFO,
2373         RAW_SEARCH_DATA_ID_BOTH_DIRECTORY_INFO  = SMB_FIND_ID_BOTH_DIRECTORY_INFO,
2374         RAW_SEARCH_DATA_UNIX_INFO               = SMB_FIND_UNIX_INFO,
2375         RAW_SEARCH_DATA_UNIX_INFO2              = SMB_FIND_UNIX_INFO2
2376 };
2377         
2378 /* union for file search */
2379 union smb_search_first {
2380         struct {
2381                 enum smb_search_level level;
2382                 enum smb_search_data_level data_level;
2383         } generic;
2384         
2385         /* search (old) findfirst interface. 
2386            Also used for ffirst and funique. */
2387         struct {
2388                 enum smb_search_level level;
2389                 enum smb_search_data_level data_level;
2390         
2391                 struct {
2392                         uint16_t max_count;
2393                         uint16_t search_attrib;
2394                         const char *pattern;
2395                 } in;
2396                 struct {
2397                         int16_t count;
2398                 } out;
2399         } search_first;
2400
2401         /* trans2 findfirst interface */
2402         struct {
2403                 enum smb_search_level level;
2404                 enum smb_search_data_level data_level;
2405                 
2406                 struct {
2407                         uint16_t search_attrib;
2408                         uint16_t max_count;
2409                         uint16_t flags;
2410                         uint32_t storage_type;
2411                         const char *pattern;
2412
2413                         /* the ea names are only used for RAW_SEARCH_EA_LIST */
2414                         uint_t num_names;
2415                         struct ea_name *ea_names;
2416                 } in;
2417                 struct {
2418                         uint16_t handle;
2419                         uint16_t count;
2420                         uint16_t end_of_search;
2421                 } out;
2422         } t2ffirst;
2423
2424 /*
2425   SMB2 uses different level numbers for the same old SMB trans2 search levels
2426 */
2427 #define SMB2_FIND_DIRECTORY_INFO         0x01
2428 #define SMB2_FIND_FULL_DIRECTORY_INFO    0x02
2429 #define SMB2_FIND_BOTH_DIRECTORY_INFO    0x03
2430 #define SMB2_FIND_NAME_INFO              0x0C
2431 #define SMB2_FIND_ID_BOTH_DIRECTORY_INFO 0x25
2432 #define SMB2_FIND_ID_FULL_DIRECTORY_INFO 0x26
2433
2434 /* flags for SMB2 find */
2435 #define SMB2_CONTINUE_FLAG_RESTART    0x01
2436 #define SMB2_CONTINUE_FLAG_SINGLE     0x02
2437 #define SMB2_CONTINUE_FLAG_INDEX      0x04
2438 #define SMB2_CONTINUE_FLAG_REOPEN     0x10
2439
2440         /* SMB2 Find */
2441         struct smb2_find {
2442                 enum smb_search_level level;
2443                 enum smb_search_data_level data_level;
2444                 struct {
2445                         union smb_handle file;
2446
2447                         /* static body buffer 32 (0x20) bytes */
2448                         /* uint16_t buffer_code;  0x21 = 0x20 + 1 */
2449                         uint8_t level;
2450                         uint8_t continue_flags; /* SMB2_CONTINUE_FLAG_* */
2451                         uint32_t file_index; 
2452                         /* struct smb2_handle handle; */
2453                         /* uint16_t pattern_ofs; */
2454                         /* uint16_t pattern_size; */
2455                         uint32_t max_response_size;
2456         
2457                         /* dynamic body */
2458                         const char *pattern;
2459                 } in;
2460                 struct {
2461                         /* static body buffer 8 (0x08) bytes */
2462                         /* uint16_t buffer_code;  0x08 */
2463                         /* uint16_t blob_ofs; */
2464                         /* uint32_t blob_size; */
2465
2466                         /* dynamic body */
2467                         DATA_BLOB blob;
2468                 } out;
2469         } smb2;
2470 };
2471
2472 /* union for file search continue */
2473 union smb_search_next {
2474         struct {
2475                 enum smb_search_level level;
2476                 enum smb_search_data_level data_level;
2477         } generic;
2478
2479         /* search (old) findnext interface. Also used
2480            for ffirst when continuing */
2481         struct {
2482                 enum smb_search_level level;
2483                 enum smb_search_data_level data_level;
2484         
2485                 struct {
2486                         uint16_t max_count;
2487                         uint16_t search_attrib;
2488                         struct smb_search_id {
2489                                 uint8_t reserved;
2490                                 char name[11];
2491                                 uint8_t handle;
2492                                 uint32_t server_cookie;
2493                                 uint32_t client_cookie;
2494                         } id;
2495                 } in;
2496                 struct {
2497                         uint16_t count;
2498                 } out;
2499         } search_next;
2500         
2501         /* trans2 findnext interface */
2502         struct {
2503                 enum smb_search_level level;
2504                 enum smb_search_data_level data_level;
2505                 
2506                 struct {
2507                         uint16_t handle;
2508                         uint16_t max_count;
2509                         uint32_t resume_key;
2510                         uint16_t flags;
2511                         const char *last_name;
2512
2513                         /* the ea names are only used for RAW_SEARCH_EA_LIST */
2514                         uint_t num_names;
2515                         struct ea_name *ea_names;
2516                 } in;
2517                 struct {
2518                         uint16_t count;
2519                         uint16_t end_of_search;
2520                 } out;
2521         } t2fnext;
2522
2523         /* SMB2 Find */
2524         struct smb2_find smb2;
2525 };
2526
2527 /* union for search reply file data */
2528 union smb_search_data {
2529         /*
2530          * search (old) findfirst 
2531          * RAW_SEARCH_DATA_SEARCH
2532          */
2533         struct {
2534                 uint16_t attrib;
2535                 time_t write_time;
2536                 uint32_t size;
2537                 struct smb_search_id id;
2538                 const char *name;
2539         } search;
2540
2541         /* trans2 findfirst RAW_SEARCH_DATA_STANDARD level */
2542         struct {
2543                 uint32_t resume_key;
2544                 time_t create_time;
2545                 time_t access_time;
2546                 time_t write_time;
2547                 uint32_t size;
2548                 uint32_t alloc_size;
2549                 uint16_t attrib;
2550                 struct smb_wire_string name;
2551         } standard;
2552
2553         /* trans2 findfirst RAW_SEARCH_DATA_EA_SIZE level */
2554         struct {
2555                 uint32_t resume_key;
2556                 time_t create_time;
2557                 time_t access_time;
2558                 time_t write_time;
2559                 uint32_t size;
2560                 uint32_t alloc_size;
2561                 uint16_t attrib;
2562                 uint32_t ea_size;
2563                 struct smb_wire_string name;
2564         } ea_size;
2565
2566         /* trans2 findfirst RAW_SEARCH_DATA_EA_LIST level */
2567         struct {
2568                 uint32_t resume_key;
2569                 time_t create_time;
2570                 time_t access_time;
2571                 time_t write_time;
2572                 uint32_t size;
2573                 uint32_t alloc_size;
2574                 uint16_t attrib;
2575                 struct smb_ea_list eas;
2576                 struct smb_wire_string name;
2577         } ea_list;
2578
2579         /* RAW_SEARCH_DATA_DIRECTORY_INFO interface */
2580         struct {
2581                 uint32_t file_index;
2582                 NTTIME create_time;
2583                 NTTIME access_time;
2584                 NTTIME write_time;
2585                 NTTIME change_time;
2586                 uint64_t  size;
2587                 uint64_t  alloc_size;
2588                 uint32_t   attrib;
2589                 struct smb_wire_string name;
2590         } directory_info;
2591
2592         /* RAW_SEARCH_DATA_FULL_DIRECTORY_INFO interface */
2593         struct {
2594                 uint32_t file_index;
2595                 NTTIME create_time;
2596                 NTTIME access_time;
2597                 NTTIME write_time;
2598                 NTTIME change_time;
2599                 uint64_t  size;
2600                 uint64_t  alloc_size;
2601                 uint32_t   attrib;
2602                 uint32_t   ea_size;
2603                 struct smb_wire_string name;
2604         } full_directory_info;
2605
2606         /* RAW_SEARCH_DATA_NAME_INFO interface */
2607         struct {
2608                 uint32_t file_index;
2609                 struct smb_wire_string name;
2610         } name_info;
2611
2612         /* RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO interface */
2613         struct {
2614                 uint32_t file_index;
2615                 NTTIME create_time;
2616                 NTTIME access_time;
2617                 NTTIME write_time;
2618                 NTTIME change_time;
2619                 uint64_t  size;
2620                 uint64_t  alloc_size;
2621                 uint32_t   attrib;
2622                 uint32_t   ea_size;
2623                 struct smb_wire_string short_name;
2624                 struct smb_wire_string name;
2625         } both_directory_info;
2626
2627         /* RAW_SEARCH_DATA_ID_FULL_DIRECTORY_INFO interface */
2628         struct {
2629                 uint32_t file_index;
2630                 NTTIME create_time;
2631                 NTTIME access_time;
2632                 NTTIME write_time;
2633                 NTTIME change_time;
2634                 uint64_t size;
2635                 uint64_t alloc_size;
2636                 uint32_t attrib;
2637                 uint32_t ea_size;
2638                 uint64_t file_id;
2639                 struct smb_wire_string name;
2640         } id_full_directory_info;
2641
2642         /* RAW_SEARCH_DATA_ID_BOTH_DIRECTORY_INFO interface */
2643         struct {
2644                 uint32_t file_index;
2645                 NTTIME create_time;
2646                 NTTIME access_time;
2647                 NTTIME write_time;
2648                 NTTIME change_time;
2649                 uint64_t size;
2650                 uint64_t alloc_size;
2651                 uint32_t  attrib;
2652                 uint32_t  ea_size;
2653                 uint64_t file_id;
2654                 struct smb_wire_string short_name;
2655                 struct smb_wire_string name;
2656         } id_both_directory_info;
2657
2658         /* RAW_SEARCH_DATA_UNIX_INFO interface */
2659         struct {
2660                 uint32_t file_index;
2661                 uint64_t size;
2662                 uint64_t alloc_size;
2663                 NTTIME status_change_time;
2664                 NTTIME access_time;
2665                 NTTIME change_time;
2666                 uint64_t uid;
2667                 uint64_t gid;
2668                 uint32_t file_type;
2669                 uint64_t dev_major;
2670                 uint64_t dev_minor;
2671                 uint64_t unique_id;
2672                 uint64_t permissions;
2673                 uint64_t nlink;         
2674                 const char *name;
2675         } unix_info;
2676
2677         /* RAW_SEARCH_DATA_UNIX_INFO2 interface */
2678         struct {
2679                 uint32_t file_index;
2680                 uint64_t end_of_file;
2681                 uint64_t num_bytes;
2682                 NTTIME status_change_time;
2683                 NTTIME access_time;
2684                 NTTIME change_time;
2685                 uint64_t uid;
2686                 uint64_t gid;
2687                 uint32_t file_type;
2688                 uint64_t dev_major;
2689                 uint64_t dev_minor;
2690                 uint64_t unique_id;
2691                 uint64_t permissions;
2692                 uint64_t nlink;
2693                 NTTIME create_time;
2694                 uint32_t file_flags;
2695                 uint32_t flags_mask;
2696                 struct smb_wire_string name;
2697         } unix_info2;
2698 };
2699
2700 /* Callback function passed to the raw search interface. */
2701 typedef bool (*smbcli_search_callback)(void *private_data, const union smb_search_data *file);
2702
2703 enum smb_search_close_level {RAW_FINDCLOSE_GENERIC, RAW_FINDCLOSE_FCLOSE, RAW_FINDCLOSE_FINDCLOSE};
2704
2705 /* union for file search close */
2706 union smb_search_close {
2707         struct {
2708                 enum smb_search_close_level level;
2709         } generic;
2710
2711         /* SMBfclose (old search) interface */
2712         struct {
2713                 enum smb_search_close_level level;
2714         
2715                 struct {
2716                         /* max_count and search_attrib are not used, but are present */
2717                         uint16_t max_count;
2718                         uint16_t search_attrib;
2719                         struct smb_search_id id;
2720                 } in;
2721         } fclose;
2722         
2723         /* SMBfindclose interface */
2724         struct {
2725                 enum smb_search_close_level level;
2726                 
2727                 struct {
2728                         uint16_t handle;
2729                 } in;
2730         } findclose;
2731 };
2732
2733
2734 /*
2735   struct for SMBecho call
2736 */
2737 struct smb_echo {
2738         struct {
2739                 uint16_t repeat_count;
2740                 uint16_t size;
2741                 uint8_t *data;
2742         } in;
2743         struct {
2744                 uint16_t count;
2745                 uint16_t sequence_number;
2746                 uint16_t size;
2747                 uint8_t *data;
2748         } out;
2749 };
2750
2751 /*
2752   struct for shadow copy volumes
2753  */
2754 struct smb_shadow_copy {
2755         struct {
2756                 union smb_handle file;
2757                 uint32_t max_data;
2758         } in;
2759         struct {
2760                 uint32_t num_volumes;
2761                 uint32_t num_names;
2762                 const char **names;
2763         } out;
2764 };
2765
2766 #endif /* __LIBCLI_RAW_INTERFACES_H__ */