diff options
Diffstat (limited to 'fs/cifs/cifspdu.h')
| -rw-r--r-- | fs/cifs/cifspdu.h | 499 |
1 files changed, 328 insertions, 171 deletions
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index aede6a813167..48a05b9df7eb 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
| @@ -36,9 +36,11 @@ | |||
| 36 | #define SMB_COM_CLOSE 0x04 /* triv req/rsp, timestamp ignored */ | 36 | #define SMB_COM_CLOSE 0x04 /* triv req/rsp, timestamp ignored */ |
| 37 | #define SMB_COM_DELETE 0x06 /* trivial response */ | 37 | #define SMB_COM_DELETE 0x06 /* trivial response */ |
| 38 | #define SMB_COM_RENAME 0x07 /* trivial response */ | 38 | #define SMB_COM_RENAME 0x07 /* trivial response */ |
| 39 | #define SMB_COM_QUERY_INFORMATION 0x08 /* aka getattr */ | ||
| 39 | #define SMB_COM_SETATTR 0x09 /* trivial response */ | 40 | #define SMB_COM_SETATTR 0x09 /* trivial response */ |
| 40 | #define SMB_COM_LOCKING_ANDX 0x24 /* trivial response */ | 41 | #define SMB_COM_LOCKING_ANDX 0x24 /* trivial response */ |
| 41 | #define SMB_COM_COPY 0x29 /* trivial rsp, fail filename ignrd*/ | 42 | #define SMB_COM_COPY 0x29 /* trivial rsp, fail filename ignrd*/ |
| 43 | #define SMB_COM_OPEN_ANDX 0x2D /* Legacy open for old servers */ | ||
| 42 | #define SMB_COM_READ_ANDX 0x2E | 44 | #define SMB_COM_READ_ANDX 0x2E |
| 43 | #define SMB_COM_WRITE_ANDX 0x2F | 45 | #define SMB_COM_WRITE_ANDX 0x2F |
| 44 | #define SMB_COM_TRANSACTION2 0x32 | 46 | #define SMB_COM_TRANSACTION2 0x32 |
| @@ -52,6 +54,7 @@ | |||
| 52 | #define SMB_COM_NT_TRANSACT 0xA0 | 54 | #define SMB_COM_NT_TRANSACT 0xA0 |
| 53 | #define SMB_COM_NT_TRANSACT_SECONDARY 0xA1 | 55 | #define SMB_COM_NT_TRANSACT_SECONDARY 0xA1 |
| 54 | #define SMB_COM_NT_CREATE_ANDX 0xA2 | 56 | #define SMB_COM_NT_CREATE_ANDX 0xA2 |
| 57 | #define SMB_COM_NT_CANCEL 0xA4 /* no response */ | ||
| 55 | #define SMB_COM_NT_RENAME 0xA5 /* trivial response */ | 58 | #define SMB_COM_NT_RENAME 0xA5 /* trivial response */ |
| 56 | 59 | ||
| 57 | /* Transact2 subcommand codes */ | 60 | /* Transact2 subcommand codes */ |
| @@ -59,6 +62,7 @@ | |||
| 59 | #define TRANS2_FIND_FIRST 0x01 | 62 | #define TRANS2_FIND_FIRST 0x01 |
| 60 | #define TRANS2_FIND_NEXT 0x02 | 63 | #define TRANS2_FIND_NEXT 0x02 |
| 61 | #define TRANS2_QUERY_FS_INFORMATION 0x03 | 64 | #define TRANS2_QUERY_FS_INFORMATION 0x03 |
| 65 | #define TRANS2_SET_FS_INFORMATION 0x04 | ||
| 62 | #define TRANS2_QUERY_PATH_INFORMATION 0x05 | 66 | #define TRANS2_QUERY_PATH_INFORMATION 0x05 |
| 63 | #define TRANS2_SET_PATH_INFORMATION 0x06 | 67 | #define TRANS2_SET_PATH_INFORMATION 0x06 |
| 64 | #define TRANS2_QUERY_FILE_INFORMATION 0x07 | 68 | #define TRANS2_QUERY_FILE_INFORMATION 0x07 |
| @@ -76,7 +80,7 @@ | |||
| 76 | #define NT_TRANSACT_GET_USER_QUOTA 0x07 | 80 | #define NT_TRANSACT_GET_USER_QUOTA 0x07 |
| 77 | #define NT_TRANSACT_SET_USER_QUOTA 0x08 | 81 | #define NT_TRANSACT_SET_USER_QUOTA 0x08 |
| 78 | 82 | ||
| 79 | #define MAX_CIFS_HDR_SIZE 256 /* chained NTCreateXReadX will probably be biggest */ | 83 | #define MAX_CIFS_HDR_SIZE 256 /* is future chained NTCreateXReadX bigger? */ |
| 80 | 84 | ||
| 81 | /* internal cifs vfs structures */ | 85 | /* internal cifs vfs structures */ |
| 82 | /***************************************************************** | 86 | /***************************************************************** |
| @@ -129,10 +133,11 @@ | |||
| 129 | /* | 133 | /* |
| 130 | * SMB flag definitions | 134 | * SMB flag definitions |
| 131 | */ | 135 | */ |
| 132 | #define SMBFLG_EXTD_LOCK 0x01 /* server supports lock-read write-unlock primitives */ | 136 | #define SMBFLG_EXTD_LOCK 0x01 /* server supports lock-read write-unlock smb */ |
| 133 | #define SMBFLG_RCV_POSTED 0x02 /* obsolete */ | 137 | #define SMBFLG_RCV_POSTED 0x02 /* obsolete */ |
| 134 | #define SMBFLG_RSVD 0x04 | 138 | #define SMBFLG_RSVD 0x04 |
| 135 | #define SMBFLG_CASELESS 0x08 /* all pathnames treated as caseless (off implies case sensitive file handling requested) */ | 139 | #define SMBFLG_CASELESS 0x08 /* all pathnames treated as caseless (off |
| 140 | implies case sensitive file handling request) */ | ||
| 136 | #define SMBFLG_CANONICAL_PATH_FORMAT 0x10 /* obsolete */ | 141 | #define SMBFLG_CANONICAL_PATH_FORMAT 0x10 /* obsolete */ |
| 137 | #define SMBFLG_OLD_OPLOCK 0x20 /* obsolete */ | 142 | #define SMBFLG_OLD_OPLOCK 0x20 /* obsolete */ |
| 138 | #define SMBFLG_OLD_OPLOCK_NOTIFY 0x40 /* obsolete */ | 143 | #define SMBFLG_OLD_OPLOCK_NOTIFY 0x40 /* obsolete */ |
| @@ -141,7 +146,8 @@ | |||
| 141 | /* | 146 | /* |
| 142 | * SMB flag2 definitions | 147 | * SMB flag2 definitions |
| 143 | */ | 148 | */ |
| 144 | #define SMBFLG2_KNOWS_LONG_NAMES cpu_to_le16(1) /* can send long (non-8.3) path names in response */ | 149 | #define SMBFLG2_KNOWS_LONG_NAMES cpu_to_le16(1) /* can send long (non-8.3) |
| 150 | path names in response */ | ||
| 145 | #define SMBFLG2_KNOWS_EAS cpu_to_le16(2) | 151 | #define SMBFLG2_KNOWS_EAS cpu_to_le16(2) |
| 146 | #define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4) | 152 | #define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4) |
| 147 | #define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40) | 153 | #define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40) |
| @@ -160,32 +166,32 @@ | |||
| 160 | * file and can have any suitable combination of the following values: | 166 | * file and can have any suitable combination of the following values: |
| 161 | */ | 167 | */ |
| 162 | 168 | ||
| 163 | #define FILE_READ_DATA 0x00000001 /* Data can be read from the file */ | 169 | #define FILE_READ_DATA 0x00000001 /* Data can be read from the file */ |
| 164 | #define FILE_WRITE_DATA 0x00000002 /* Data can be written to the file */ | 170 | #define FILE_WRITE_DATA 0x00000002 /* Data can be written to the file */ |
| 165 | #define FILE_APPEND_DATA 0x00000004 /* Data can be appended to the file */ | 171 | #define FILE_APPEND_DATA 0x00000004 /* Data can be appended to the file */ |
| 166 | #define FILE_READ_EA 0x00000008 /* Extended attributes associated */ | 172 | #define FILE_READ_EA 0x00000008 /* Extended attributes associated */ |
| 167 | /* with the file can be read */ | 173 | /* with the file can be read */ |
| 168 | #define FILE_WRITE_EA 0x00000010 /* Extended attributes associated */ | 174 | #define FILE_WRITE_EA 0x00000010 /* Extended attributes associated */ |
| 169 | /* with the file can be written */ | 175 | /* with the file can be written */ |
| 170 | #define FILE_EXECUTE 0x00000020 /*Data can be read into memory from */ | 176 | #define FILE_EXECUTE 0x00000020 /*Data can be read into memory from */ |
| 171 | /* the file using system paging I/O */ | 177 | /* the file using system paging I/O */ |
| 172 | #define FILE_DELETE_CHILD 0x00000040 | 178 | #define FILE_DELETE_CHILD 0x00000040 |
| 173 | #define FILE_READ_ATTRIBUTES 0x00000080 /* Attributes associated with the */ | 179 | #define FILE_READ_ATTRIBUTES 0x00000080 /* Attributes associated with the */ |
| 174 | /* file can be read */ | 180 | /* file can be read */ |
| 175 | #define FILE_WRITE_ATTRIBUTES 0x00000100 /* Attributes associated with the */ | 181 | #define FILE_WRITE_ATTRIBUTES 0x00000100 /* Attributes associated with the */ |
| 176 | /* file can be written */ | 182 | /* file can be written */ |
| 177 | #define DELETE 0x00010000 /* The file can be deleted */ | 183 | #define DELETE 0x00010000 /* The file can be deleted */ |
| 178 | #define READ_CONTROL 0x00020000 /* The access control list and */ | 184 | #define READ_CONTROL 0x00020000 /* The access control list and */ |
| 179 | /* ownership associated with the */ | 185 | /* ownership associated with the */ |
| 180 | /* file can be read */ | 186 | /* file can be read */ |
| 181 | #define WRITE_DAC 0x00040000 /* The access control list and */ | 187 | #define WRITE_DAC 0x00040000 /* The access control list and */ |
| 182 | /* ownership associated with the */ | 188 | /* ownership associated with the */ |
| 183 | /* file can be written. */ | 189 | /* file can be written. */ |
| 184 | #define WRITE_OWNER 0x00080000 /* Ownership information associated */ | 190 | #define WRITE_OWNER 0x00080000 /* Ownership information associated */ |
| 185 | /* with the file can be written */ | 191 | /* with the file can be written */ |
| 186 | #define SYNCHRONIZE 0x00100000 /* The file handle can waited on to */ | 192 | #define SYNCHRONIZE 0x00100000 /* The file handle can waited on to */ |
| 187 | /* synchronize with the completion */ | 193 | /* synchronize with the completion */ |
| 188 | /* of an input/output request */ | 194 | /* of an input/output request */ |
| 189 | #define GENERIC_ALL 0x10000000 | 195 | #define GENERIC_ALL 0x10000000 |
| 190 | #define GENERIC_EXECUTE 0x20000000 | 196 | #define GENERIC_EXECUTE 0x20000000 |
| 191 | #define GENERIC_WRITE 0x40000000 | 197 | #define GENERIC_WRITE 0x40000000 |
| @@ -193,7 +199,7 @@ | |||
| 193 | /* In summary - Relevant file */ | 199 | /* In summary - Relevant file */ |
| 194 | /* access flags from CIFS are */ | 200 | /* access flags from CIFS are */ |
| 195 | /* file_read_data, file_write_data */ | 201 | /* file_read_data, file_write_data */ |
| 196 | /* file_execute, file_read_attributes */ | 202 | /* file_execute, file_read_attributes*/ |
| 197 | /* write_dac, and delete. */ | 203 | /* write_dac, and delete. */ |
| 198 | 204 | ||
| 199 | /* | 205 | /* |
| @@ -238,7 +244,8 @@ | |||
| 238 | #define ATTR_SPARSE 0x0200 | 244 | #define ATTR_SPARSE 0x0200 |
| 239 | #define ATTR_REPARSE 0x0400 | 245 | #define ATTR_REPARSE 0x0400 |
| 240 | #define ATTR_COMPRESSED 0x0800 | 246 | #define ATTR_COMPRESSED 0x0800 |
| 241 | #define ATTR_OFFLINE 0x1000 /* ie file not immediately available - offline storage */ | 247 | #define ATTR_OFFLINE 0x1000 /* ie file not immediately available - |
| 248 | on offline storage */ | ||
| 242 | #define ATTR_NOT_CONTENT_INDEXED 0x2000 | 249 | #define ATTR_NOT_CONTENT_INDEXED 0x2000 |
| 243 | #define ATTR_ENCRYPTED 0x4000 | 250 | #define ATTR_ENCRYPTED 0x4000 |
| 244 | #define ATTR_POSIX_SEMANTICS 0x01000000 | 251 | #define ATTR_POSIX_SEMANTICS 0x01000000 |
| @@ -267,10 +274,18 @@ | |||
| 267 | /* CreateOptions */ | 274 | /* CreateOptions */ |
| 268 | #define CREATE_NOT_FILE 0x00000001 /* if set must not be file */ | 275 | #define CREATE_NOT_FILE 0x00000001 /* if set must not be file */ |
| 269 | #define CREATE_WRITE_THROUGH 0x00000002 | 276 | #define CREATE_WRITE_THROUGH 0x00000002 |
| 270 | #define CREATE_NOT_DIR 0x00000040 /* if set must not be directory */ | 277 | #define CREATE_SEQUENTIAL 0x00000004 |
| 278 | #define CREATE_SYNC_ALERT 0x00000010 | ||
| 279 | #define CREATE_ASYNC_ALERT 0x00000020 | ||
| 280 | #define CREATE_NOT_DIR 0x00000040 /* if set must not be directory */ | ||
| 281 | #define CREATE_NO_EA_KNOWLEDGE 0x00000200 | ||
| 282 | #define CREATE_EIGHT_DOT_THREE 0x00000400 | ||
| 271 | #define CREATE_RANDOM_ACCESS 0x00000800 | 283 | #define CREATE_RANDOM_ACCESS 0x00000800 |
| 272 | #define CREATE_DELETE_ON_CLOSE 0x00001000 | 284 | #define CREATE_DELETE_ON_CLOSE 0x00001000 |
| 285 | #define CREATE_OPEN_BY_ID 0x00002000 | ||
| 273 | #define OPEN_REPARSE_POINT 0x00200000 | 286 | #define OPEN_REPARSE_POINT 0x00200000 |
| 287 | #define CREATE_OPTIONS_MASK 0x007FFFFF | ||
| 288 | #define CREATE_OPTION_SPECIAL 0x20000000 /* system. NB not sent over wire */ | ||
| 274 | 289 | ||
| 275 | /* ImpersonationLevel flags */ | 290 | /* ImpersonationLevel flags */ |
| 276 | #define SECURITY_ANONYMOUS 0 | 291 | #define SECURITY_ANONYMOUS 0 |
| @@ -297,10 +312,10 @@ | |||
| 297 | #define GETU16(var) (*((__u16 *)var)) /* BB check for endian issues */ | 312 | #define GETU16(var) (*((__u16 *)var)) /* BB check for endian issues */ |
| 298 | #define GETU32(var) (*((__u32 *)var)) /* BB check for endian issues */ | 313 | #define GETU32(var) (*((__u32 *)var)) /* BB check for endian issues */ |
| 299 | 314 | ||
| 300 | #pragma pack(1) | ||
| 301 | |||
| 302 | struct smb_hdr { | 315 | struct smb_hdr { |
| 303 | __u32 smb_buf_length; /* big endian on wire *//* BB length is only two or three bytes - with one or two byte type preceding it but that is always zero - we could mask the type byte off just in case BB */ | 316 | __u32 smb_buf_length; /* big endian on wire *//* BB length is only two |
| 317 | or three bytes - with one or two byte type preceding it that are | ||
| 318 | zero - we could mask the type byte off just in case BB */ | ||
| 304 | __u8 Protocol[4]; | 319 | __u8 Protocol[4]; |
| 305 | __u8 Command; | 320 | __u8 Command; |
| 306 | union { | 321 | union { |
| @@ -308,9 +323,9 @@ struct smb_hdr { | |||
| 308 | __u8 ErrorClass; | 323 | __u8 ErrorClass; |
| 309 | __u8 Reserved; | 324 | __u8 Reserved; |
| 310 | __le16 Error; | 325 | __le16 Error; |
| 311 | } DosError; | 326 | } __attribute__((packed)) DosError; |
| 312 | __le32 CifsError; | 327 | __le32 CifsError; |
| 313 | } Status; | 328 | } __attribute__((packed)) Status; |
| 314 | __u8 Flags; | 329 | __u8 Flags; |
| 315 | __le16 Flags2; /* note: le */ | 330 | __le16 Flags2; /* note: le */ |
| 316 | __le16 PidHigh; | 331 | __le16 PidHigh; |
| @@ -318,16 +333,16 @@ struct smb_hdr { | |||
| 318 | struct { | 333 | struct { |
| 319 | __le32 SequenceNumber; /* le */ | 334 | __le32 SequenceNumber; /* le */ |
| 320 | __u32 Reserved; /* zero */ | 335 | __u32 Reserved; /* zero */ |
| 321 | } Sequence; | 336 | } __attribute__((packed)) Sequence; |
| 322 | __u8 SecuritySignature[8]; /* le */ | 337 | __u8 SecuritySignature[8]; /* le */ |
| 323 | } Signature; | 338 | } __attribute__((packed)) Signature; |
| 324 | __u8 pad[2]; | 339 | __u8 pad[2]; |
| 325 | __u16 Tid; | 340 | __u16 Tid; |
| 326 | __le16 Pid; | 341 | __le16 Pid; |
| 327 | __u16 Uid; | 342 | __u16 Uid; |
| 328 | __u16 Mid; | 343 | __u16 Mid; |
| 329 | __u8 WordCount; | 344 | __u8 WordCount; |
| 330 | }; | 345 | } __attribute__((packed)); |
| 331 | /* given a pointer to an smb_hdr retrieve the value of byte count */ | 346 | /* given a pointer to an smb_hdr retrieve the value of byte count */ |
| 332 | #define BCC(smb_var) ( *(__u16 *)((char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) ) ) | 347 | #define BCC(smb_var) ( *(__u16 *)((char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) ) ) |
| 333 | #define BCC_LE(smb_var) ( *(__le16 *)((char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) ) ) | 348 | #define BCC_LE(smb_var) ( *(__le16 *)((char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) ) ) |
| @@ -379,7 +394,7 @@ typedef struct negotiate_req { | |||
| 379 | struct smb_hdr hdr; /* wct = 0 */ | 394 | struct smb_hdr hdr; /* wct = 0 */ |
| 380 | __le16 ByteCount; | 395 | __le16 ByteCount; |
| 381 | unsigned char DialectsArray[1]; | 396 | unsigned char DialectsArray[1]; |
| 382 | } NEGOTIATE_REQ; | 397 | } __attribute__((packed)) NEGOTIATE_REQ; |
| 383 | 398 | ||
| 384 | typedef struct negotiate_rsp { | 399 | typedef struct negotiate_rsp { |
| 385 | struct smb_hdr hdr; /* wct = 17 */ | 400 | struct smb_hdr hdr; /* wct = 17 */ |
| @@ -397,16 +412,16 @@ typedef struct negotiate_rsp { | |||
| 397 | __u8 EncryptionKeyLength; | 412 | __u8 EncryptionKeyLength; |
| 398 | __u16 ByteCount; | 413 | __u16 ByteCount; |
| 399 | union { | 414 | union { |
| 400 | unsigned char EncryptionKey[1]; /* if cap extended security is off */ | 415 | unsigned char EncryptionKey[1]; /* cap extended security off */ |
| 401 | /* followed by Domain name - if extended security is off */ | 416 | /* followed by Domain name - if extended security is off */ |
| 402 | /* followed by 16 bytes of server GUID */ | 417 | /* followed by 16 bytes of server GUID */ |
| 403 | /* followed by security blob if cap_extended_security negotiated */ | 418 | /* then security blob if cap_extended_security negotiated */ |
| 404 | struct { | 419 | struct { |
| 405 | unsigned char GUID[16]; | 420 | unsigned char GUID[16]; |
| 406 | unsigned char SecurityBlob[1]; | 421 | unsigned char SecurityBlob[1]; |
| 407 | } extended_response; | 422 | } __attribute__((packed)) extended_response; |
| 408 | } u; | 423 | } __attribute__((packed)) u; |
| 409 | } NEGOTIATE_RSP; | 424 | } __attribute__((packed)) NEGOTIATE_RSP; |
| 410 | 425 | ||
| 411 | /* SecurityMode bits */ | 426 | /* SecurityMode bits */ |
| 412 | #define SECMODE_USER 0x01 /* off indicates share level security */ | 427 | #define SECMODE_USER 0x01 /* off indicates share level security */ |
| @@ -452,7 +467,8 @@ typedef union smb_com_session_setup_andx { | |||
| 452 | unsigned char SecurityBlob[1]; /* followed by */ | 467 | unsigned char SecurityBlob[1]; /* followed by */ |
| 453 | /* STRING NativeOS */ | 468 | /* STRING NativeOS */ |
| 454 | /* STRING NativeLanMan */ | 469 | /* STRING NativeLanMan */ |
| 455 | } req; /* NTLM request format (with extended security */ | 470 | } __attribute__((packed)) req; /* NTLM request format (with |
| 471 | extended security */ | ||
| 456 | 472 | ||
| 457 | struct { /* request format */ | 473 | struct { /* request format */ |
| 458 | struct smb_hdr hdr; /* wct = 13 */ | 474 | struct smb_hdr hdr; /* wct = 13 */ |
| @@ -463,18 +479,19 @@ typedef union smb_com_session_setup_andx { | |||
| 463 | __le16 MaxMpxCount; | 479 | __le16 MaxMpxCount; |
| 464 | __le16 VcNumber; | 480 | __le16 VcNumber; |
| 465 | __u32 SessionKey; | 481 | __u32 SessionKey; |
| 466 | __le16 CaseInsensitivePasswordLength; /* ASCII password length */ | 482 | __le16 CaseInsensitivePasswordLength; /* ASCII password len */ |
| 467 | __le16 CaseSensitivePasswordLength; /* Unicode password length */ | 483 | __le16 CaseSensitivePasswordLength; /* Unicode password length*/ |
| 468 | __u32 Reserved; /* see below */ | 484 | __u32 Reserved; /* see below */ |
| 469 | __le32 Capabilities; | 485 | __le32 Capabilities; |
| 470 | __le16 ByteCount; | 486 | __le16 ByteCount; |
| 471 | unsigned char CaseInsensitivePassword[1]; /* followed by: */ | 487 | unsigned char CaseInsensitivePassword[1]; /* followed by: */ |
| 472 | /* unsigned char * CaseSensitivePassword; */ | 488 | /* unsigned char * CaseSensitivePassword; */ |
| 473 | /* STRING AccountName */ | 489 | /* STRING AccountName */ |
| 474 | /* STRING PrimaryDomain */ | 490 | /* STRING PrimaryDomain */ |
| 475 | /* STRING NativeOS */ | 491 | /* STRING NativeOS */ |
| 476 | /* STRING NativeLanMan */ | 492 | /* STRING NativeLanMan */ |
| 477 | } req_no_secext; /* NTLM request format (without extended security */ | 493 | } __attribute__((packed)) req_no_secext; /* NTLM request format (without |
| 494 | extended security */ | ||
| 478 | 495 | ||
| 479 | struct { /* default (NTLM) response format */ | 496 | struct { /* default (NTLM) response format */ |
| 480 | struct smb_hdr hdr; /* wct = 4 */ | 497 | struct smb_hdr hdr; /* wct = 4 */ |
| @@ -488,7 +505,7 @@ typedef union smb_com_session_setup_andx { | |||
| 488 | /* unsigned char * NativeOS; */ | 505 | /* unsigned char * NativeOS; */ |
| 489 | /* unsigned char * NativeLanMan; */ | 506 | /* unsigned char * NativeLanMan; */ |
| 490 | /* unsigned char * PrimaryDomain; */ | 507 | /* unsigned char * PrimaryDomain; */ |
| 491 | } resp; /* NTLM response format (with or without extended security */ | 508 | } __attribute__((packed)) resp; /* NTLM response format (with or without extended security */ |
| 492 | 509 | ||
| 493 | struct { /* request format */ | 510 | struct { /* request format */ |
| 494 | struct smb_hdr hdr; /* wct = 10 */ | 511 | struct smb_hdr hdr; /* wct = 10 */ |
| @@ -507,7 +524,7 @@ typedef union smb_com_session_setup_andx { | |||
| 507 | /* STRING PrimaryDomain */ | 524 | /* STRING PrimaryDomain */ |
| 508 | /* STRING NativeOS */ | 525 | /* STRING NativeOS */ |
| 509 | /* STRING NativeLanMan */ | 526 | /* STRING NativeLanMan */ |
| 510 | } old_req; /* pre-NTLM (LANMAN2.1) request format */ | 527 | } __attribute__((packed)) old_req; /* pre-NTLM (LANMAN2.1) request format */ |
| 511 | 528 | ||
| 512 | struct { /* default (NTLM) response format */ | 529 | struct { /* default (NTLM) response format */ |
| 513 | struct smb_hdr hdr; /* wct = 3 */ | 530 | struct smb_hdr hdr; /* wct = 3 */ |
| @@ -519,8 +536,8 @@ typedef union smb_com_session_setup_andx { | |||
| 519 | unsigned char NativeOS[1]; /* followed by */ | 536 | unsigned char NativeOS[1]; /* followed by */ |
| 520 | /* unsigned char * NativeLanMan; */ | 537 | /* unsigned char * NativeLanMan; */ |
| 521 | /* unsigned char * PrimaryDomain; */ | 538 | /* unsigned char * PrimaryDomain; */ |
| 522 | } old_resp; /* pre-NTLM (LANMAN2.1) response format */ | 539 | } __attribute__((packed)) old_resp; /* pre-NTLM (LANMAN2.1) response format */ |
| 523 | } SESSION_SETUP_ANDX; | 540 | } __attribute__((packed)) SESSION_SETUP_ANDX; |
| 524 | 541 | ||
| 525 | #define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux" | 542 | #define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux" |
| 526 | 543 | ||
| @@ -530,7 +547,8 @@ typedef union smb_com_session_setup_andx { | |||
| 530 | #define CAP_NT_SMBS 0x00000010 | 547 | #define CAP_NT_SMBS 0x00000010 |
| 531 | #define CAP_STATUS32 0x00000040 | 548 | #define CAP_STATUS32 0x00000040 |
| 532 | #define CAP_LEVEL_II_OPLOCKS 0x00000080 | 549 | #define CAP_LEVEL_II_OPLOCKS 0x00000080 |
| 533 | #define CAP_NT_FIND 0x00000200 /* reserved should be zero (presumably because NT_SMBs implies the same thing) */ | 550 | #define CAP_NT_FIND 0x00000200 /* reserved should be zero |
| 551 | (because NT_SMBs implies the same thing?) */ | ||
| 534 | #define CAP_BULK_TRANSFER 0x20000000 | 552 | #define CAP_BULK_TRANSFER 0x20000000 |
| 535 | #define CAP_EXTENDED_SECURITY 0x80000000 | 553 | #define CAP_EXTENDED_SECURITY 0x80000000 |
| 536 | 554 | ||
| @@ -548,7 +566,7 @@ typedef struct smb_com_tconx_req { | |||
| 548 | unsigned char Password[1]; /* followed by */ | 566 | unsigned char Password[1]; /* followed by */ |
| 549 | /* STRING Path *//* \\server\share name */ | 567 | /* STRING Path *//* \\server\share name */ |
| 550 | /* STRING Service */ | 568 | /* STRING Service */ |
| 551 | } TCONX_REQ; | 569 | } __attribute__((packed)) TCONX_REQ; |
| 552 | 570 | ||
| 553 | typedef struct smb_com_tconx_rsp { | 571 | typedef struct smb_com_tconx_rsp { |
| 554 | struct smb_hdr hdr; /* wct = 3 *//* note that Win2000 has sent wct=7 in some cases on responses. Four unspecified words followed OptionalSupport */ | 572 | struct smb_hdr hdr; /* wct = 3 *//* note that Win2000 has sent wct=7 in some cases on responses. Four unspecified words followed OptionalSupport */ |
| @@ -559,13 +577,14 @@ typedef struct smb_com_tconx_rsp { | |||
| 559 | __u16 ByteCount; | 577 | __u16 ByteCount; |
| 560 | unsigned char Service[1]; /* always ASCII, not Unicode */ | 578 | unsigned char Service[1]; /* always ASCII, not Unicode */ |
| 561 | /* STRING NativeFileSystem */ | 579 | /* STRING NativeFileSystem */ |
| 562 | } TCONX_RSP; | 580 | } __attribute__((packed)) TCONX_RSP; |
| 563 | 581 | ||
| 564 | /* tree connect Flags */ | 582 | /* tree connect Flags */ |
| 565 | #define DISCONNECT_TID 0x0001 | 583 | #define DISCONNECT_TID 0x0001 |
| 566 | #define TCON_EXTENDED_SECINFO 0x0008 | 584 | #define TCON_EXTENDED_SECINFO 0x0008 |
| 567 | /* OptionalSupport bits */ | 585 | /* OptionalSupport bits */ |
| 568 | #define SMB_SUPPORT_SEARCH_BITS 0x0001 /* must have bits (exclusive searches suppt. */ | 586 | #define SMB_SUPPORT_SEARCH_BITS 0x0001 /* "must have" directory search bits |
| 587 | (exclusive searches supported) */ | ||
| 569 | #define SMB_SHARE_IS_IN_DFS 0x0002 | 588 | #define SMB_SHARE_IS_IN_DFS 0x0002 |
| 570 | 589 | ||
| 571 | typedef struct smb_com_logoff_andx_req { | 590 | typedef struct smb_com_logoff_andx_req { |
| @@ -574,7 +593,7 @@ typedef struct smb_com_logoff_andx_req { | |||
| 574 | __u8 AndXReserved; | 593 | __u8 AndXReserved; |
| 575 | __u16 AndXOffset; | 594 | __u16 AndXOffset; |
| 576 | __u16 ByteCount; | 595 | __u16 ByteCount; |
| 577 | } LOGOFF_ANDX_REQ; | 596 | } __attribute__((packed)) LOGOFF_ANDX_REQ; |
| 578 | 597 | ||
| 579 | typedef struct smb_com_logoff_andx_rsp { | 598 | typedef struct smb_com_logoff_andx_rsp { |
| 580 | struct smb_hdr hdr; /* wct = 2 */ | 599 | struct smb_hdr hdr; /* wct = 2 */ |
| @@ -582,38 +601,39 @@ typedef struct smb_com_logoff_andx_rsp { | |||
| 582 | __u8 AndXReserved; | 601 | __u8 AndXReserved; |
| 583 | __u16 AndXOffset; | 602 | __u16 AndXOffset; |
| 584 | __u16 ByteCount; | 603 | __u16 ByteCount; |
| 585 | } LOGOFF_ANDX_RSP; | 604 | } __attribute__((packed)) LOGOFF_ANDX_RSP; |
| 586 | 605 | ||
| 587 | typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on tree_connect PDU to effect disconnect *//* probably the simplest SMB PDU */ | 606 | typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on tree_connect PDU to effect disconnect *//* probably the simplest SMB PDU */ |
| 588 | struct { | 607 | struct { |
| 589 | struct smb_hdr hdr; /* wct = 0 */ | 608 | struct smb_hdr hdr; /* wct = 0 */ |
| 590 | __u16 ByteCount; /* bcc = 0 */ | 609 | __u16 ByteCount; /* bcc = 0 */ |
| 591 | } req; | 610 | } __attribute__((packed)) req; |
| 592 | struct { | 611 | struct { |
| 593 | struct smb_hdr hdr; /* wct = 0 */ | 612 | struct smb_hdr hdr; /* wct = 0 */ |
| 594 | __u16 ByteCount; /* bcc = 0 */ | 613 | __u16 ByteCount; /* bcc = 0 */ |
| 595 | } resp; | 614 | } __attribute__((packed)) resp; |
| 596 | } TREE_DISCONNECT; | 615 | } __attribute__((packed)) TREE_DISCONNECT; |
| 597 | 616 | ||
| 598 | typedef struct smb_com_close_req { | 617 | typedef struct smb_com_close_req { |
| 599 | struct smb_hdr hdr; /* wct = 3 */ | 618 | struct smb_hdr hdr; /* wct = 3 */ |
| 600 | __u16 FileID; | 619 | __u16 FileID; |
| 601 | __u32 LastWriteTime; /* should be zero */ | 620 | __u32 LastWriteTime; /* should be zero */ |
| 602 | __u16 ByteCount; /* 0 */ | 621 | __u16 ByteCount; /* 0 */ |
| 603 | } CLOSE_REQ; | 622 | } __attribute__((packed)) CLOSE_REQ; |
| 604 | 623 | ||
| 605 | typedef struct smb_com_close_rsp { | 624 | typedef struct smb_com_close_rsp { |
| 606 | struct smb_hdr hdr; /* wct = 0 */ | 625 | struct smb_hdr hdr; /* wct = 0 */ |
| 607 | __u16 ByteCount; /* bct = 0 */ | 626 | __u16 ByteCount; /* bct = 0 */ |
| 608 | } CLOSE_RSP; | 627 | } __attribute__((packed)) CLOSE_RSP; |
| 609 | 628 | ||
| 610 | typedef struct smb_com_findclose_req { | 629 | typedef struct smb_com_findclose_req { |
| 611 | struct smb_hdr hdr; /* wct = 1 */ | 630 | struct smb_hdr hdr; /* wct = 1 */ |
| 612 | __u16 FileID; | 631 | __u16 FileID; |
| 613 | __u16 ByteCount; /* 0 */ | 632 | __u16 ByteCount; /* 0 */ |
| 614 | } FINDCLOSE_REQ; | 633 | } __attribute__((packed)) FINDCLOSE_REQ; |
| 615 | 634 | ||
| 616 | /* OpenFlags */ | 635 | /* OpenFlags */ |
| 636 | #define REQ_MORE_INFO 0x00000001 /* legacy (OPEN_AND_X) only */ | ||
| 617 | #define REQ_OPLOCK 0x00000002 | 637 | #define REQ_OPLOCK 0x00000002 |
| 618 | #define REQ_BATCHOPLOCK 0x00000004 | 638 | #define REQ_BATCHOPLOCK 0x00000004 |
| 619 | #define REQ_OPENDIRONLY 0x00000008 | 639 | #define REQ_OPENDIRONLY 0x00000008 |
| @@ -637,7 +657,7 @@ typedef struct smb_com_open_req { /* also handles create */ | |||
| 637 | __u8 SecurityFlags; | 657 | __u8 SecurityFlags; |
| 638 | __le16 ByteCount; | 658 | __le16 ByteCount; |
| 639 | char fileName[1]; | 659 | char fileName[1]; |
| 640 | } OPEN_REQ; | 660 | } __attribute__((packed)) OPEN_REQ; |
| 641 | 661 | ||
| 642 | /* open response: oplock levels */ | 662 | /* open response: oplock levels */ |
| 643 | #define OPLOCK_NONE 0 | 663 | #define OPLOCK_NONE 0 |
| @@ -667,7 +687,63 @@ typedef struct smb_com_open_rsp { | |||
| 667 | __le16 DeviceState; | 687 | __le16 DeviceState; |
| 668 | __u8 DirectoryFlag; | 688 | __u8 DirectoryFlag; |
| 669 | __u16 ByteCount; /* bct = 0 */ | 689 | __u16 ByteCount; /* bct = 0 */ |
| 670 | } OPEN_RSP; | 690 | } __attribute__((packed)) OPEN_RSP; |
| 691 | |||
| 692 | /* format of legacy open request */ | ||
| 693 | typedef struct smb_com_openx_req { | ||
| 694 | struct smb_hdr hdr; /* wct = 15 */ | ||
| 695 | __u8 AndXCommand; | ||
| 696 | __u8 AndXReserved; | ||
| 697 | __le16 AndXOffset; | ||
| 698 | __le16 OpenFlags; | ||
| 699 | __le16 Mode; | ||
| 700 | __le16 Sattr; /* search attributes */ | ||
| 701 | __le16 FileAttributes; /* dos attrs */ | ||
| 702 | __le32 CreateTime; /* os2 format */ | ||
| 703 | __le16 OpenFunction; | ||
| 704 | __le32 EndOfFile; | ||
| 705 | __le32 Timeout; | ||
| 706 | __le32 Reserved; | ||
| 707 | __le16 ByteCount; /* file name follows */ | ||
| 708 | char fileName[1]; | ||
| 709 | } __attribute__((packed)) OPENX_REQ; | ||
| 710 | |||
| 711 | typedef struct smb_com_openx_rsp { | ||
| 712 | struct smb_hdr hdr; /* wct = 15 */ | ||
| 713 | __u8 AndXCommand; | ||
| 714 | __u8 AndXReserved; | ||
| 715 | __le16 AndXOffset; | ||
| 716 | __u16 Fid; | ||
| 717 | __le16 FileAttributes; | ||
| 718 | __le32 LastWriteTime; /* os2 format */ | ||
| 719 | __le32 EndOfFile; | ||
| 720 | __le16 Access; | ||
| 721 | __le16 FileType; | ||
| 722 | __le16 IPCState; | ||
| 723 | __le16 Action; | ||
| 724 | __u32 FileId; | ||
| 725 | __u16 Reserved; | ||
| 726 | __u16 ByteCount; | ||
| 727 | } __attribute__((packed)) OPENX_RSP; | ||
| 728 | |||
| 729 | /* Legacy write request for older servers */ | ||
| 730 | typedef struct smb_com_writex_req { | ||
| 731 | struct smb_hdr hdr; /* wct = 12 */ | ||
| 732 | __u8 AndXCommand; | ||
| 733 | __u8 AndXReserved; | ||
| 734 | __le16 AndXOffset; | ||
| 735 | __u16 Fid; | ||
| 736 | __le32 OffsetLow; | ||
| 737 | __u32 Reserved; /* Timeout */ | ||
| 738 | __le16 WriteMode; /* 1 = write through */ | ||
| 739 | __le16 Remaining; | ||
| 740 | __le16 Reserved2; | ||
| 741 | __le16 DataLengthLow; | ||
| 742 | __le16 DataOffset; | ||
| 743 | __le16 ByteCount; | ||
| 744 | __u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ | ||
| 745 | char Data[0]; | ||
| 746 | } __attribute__((packed)) WRITEX_REQ; | ||
| 671 | 747 | ||
| 672 | typedef struct smb_com_write_req { | 748 | typedef struct smb_com_write_req { |
| 673 | struct smb_hdr hdr; /* wct = 14 */ | 749 | struct smb_hdr hdr; /* wct = 14 */ |
| @@ -686,7 +762,7 @@ typedef struct smb_com_write_req { | |||
| 686 | __le16 ByteCount; | 762 | __le16 ByteCount; |
| 687 | __u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ | 763 | __u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ |
| 688 | char Data[0]; | 764 | char Data[0]; |
| 689 | } WRITE_REQ; | 765 | } __attribute__((packed)) WRITE_REQ; |
| 690 | 766 | ||
| 691 | typedef struct smb_com_write_rsp { | 767 | typedef struct smb_com_write_rsp { |
| 692 | struct smb_hdr hdr; /* wct = 6 */ | 768 | struct smb_hdr hdr; /* wct = 6 */ |
| @@ -698,7 +774,22 @@ typedef struct smb_com_write_rsp { | |||
| 698 | __le16 CountHigh; | 774 | __le16 CountHigh; |
| 699 | __u16 Reserved; | 775 | __u16 Reserved; |
| 700 | __u16 ByteCount; | 776 | __u16 ByteCount; |
| 701 | } WRITE_RSP; | 777 | } __attribute__((packed)) WRITE_RSP; |
| 778 | |||
| 779 | /* legacy read request for older servers */ | ||
| 780 | typedef struct smb_com_readx_req { | ||
| 781 | struct smb_hdr hdr; /* wct = 10 */ | ||
| 782 | __u8 AndXCommand; | ||
| 783 | __u8 AndXReserved; | ||
| 784 | __le16 AndXOffset; | ||
| 785 | __u16 Fid; | ||
| 786 | __le32 OffsetLow; | ||
| 787 | __le16 MaxCount; | ||
| 788 | __le16 MinCount; /* obsolete */ | ||
| 789 | __le32 Reserved; | ||
| 790 | __le16 Remaining; | ||
| 791 | __le16 ByteCount; | ||
| 792 | } __attribute__((packed)) READX_REQ; | ||
| 702 | 793 | ||
| 703 | typedef struct smb_com_read_req { | 794 | typedef struct smb_com_read_req { |
| 704 | struct smb_hdr hdr; /* wct = 12 */ | 795 | struct smb_hdr hdr; /* wct = 12 */ |
| @@ -713,7 +804,7 @@ typedef struct smb_com_read_req { | |||
| 713 | __le16 Remaining; | 804 | __le16 Remaining; |
| 714 | __le32 OffsetHigh; | 805 | __le32 OffsetHigh; |
| 715 | __le16 ByteCount; | 806 | __le16 ByteCount; |
| 716 | } READ_REQ; | 807 | } __attribute__((packed)) READ_REQ; |
| 717 | 808 | ||
| 718 | typedef struct smb_com_read_rsp { | 809 | typedef struct smb_com_read_rsp { |
| 719 | struct smb_hdr hdr; /* wct = 12 */ | 810 | struct smb_hdr hdr; /* wct = 12 */ |
| @@ -730,7 +821,7 @@ typedef struct smb_com_read_rsp { | |||
| 730 | __u16 ByteCount; | 821 | __u16 ByteCount; |
| 731 | __u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ | 822 | __u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ |
| 732 | char Data[1]; | 823 | char Data[1]; |
| 733 | } READ_RSP; | 824 | } __attribute__((packed)) READ_RSP; |
| 734 | 825 | ||
| 735 | typedef struct locking_andx_range { | 826 | typedef struct locking_andx_range { |
| 736 | __le16 Pid; | 827 | __le16 Pid; |
| @@ -739,7 +830,7 @@ typedef struct locking_andx_range { | |||
| 739 | __le32 OffsetLow; | 830 | __le32 OffsetLow; |
| 740 | __le32 LengthHigh; | 831 | __le32 LengthHigh; |
| 741 | __le32 LengthLow; | 832 | __le32 LengthLow; |
| 742 | } LOCKING_ANDX_RANGE; | 833 | } __attribute__((packed)) LOCKING_ANDX_RANGE; |
| 743 | 834 | ||
| 744 | #define LOCKING_ANDX_SHARED_LOCK 0x01 | 835 | #define LOCKING_ANDX_SHARED_LOCK 0x01 |
| 745 | #define LOCKING_ANDX_OPLOCK_RELEASE 0x02 | 836 | #define LOCKING_ANDX_OPLOCK_RELEASE 0x02 |
| @@ -760,7 +851,7 @@ typedef struct smb_com_lock_req { | |||
| 760 | __le16 NumberOfLocks; | 851 | __le16 NumberOfLocks; |
| 761 | __le16 ByteCount; | 852 | __le16 ByteCount; |
| 762 | LOCKING_ANDX_RANGE Locks[1]; | 853 | LOCKING_ANDX_RANGE Locks[1]; |
| 763 | } LOCK_REQ; | 854 | } __attribute__((packed)) LOCK_REQ; |
| 764 | 855 | ||
| 765 | 856 | ||
| 766 | typedef struct cifs_posix_lock { | 857 | typedef struct cifs_posix_lock { |
| @@ -770,7 +861,7 @@ typedef struct cifs_posix_lock { | |||
| 770 | __le64 start; | 861 | __le64 start; |
| 771 | __le64 length; | 862 | __le64 length; |
| 772 | /* BB what about additional owner info to identify network client */ | 863 | /* BB what about additional owner info to identify network client */ |
| 773 | } CIFS_POSIX_LOCK; | 864 | } __attribute__((packed)) CIFS_POSIX_LOCK; |
| 774 | 865 | ||
| 775 | typedef struct smb_com_lock_rsp { | 866 | typedef struct smb_com_lock_rsp { |
| 776 | struct smb_hdr hdr; /* wct = 2 */ | 867 | struct smb_hdr hdr; /* wct = 2 */ |
| @@ -778,7 +869,7 @@ typedef struct smb_com_lock_rsp { | |||
| 778 | __u8 AndXReserved; | 869 | __u8 AndXReserved; |
| 779 | __le16 AndXOffset; | 870 | __le16 AndXOffset; |
| 780 | __u16 ByteCount; | 871 | __u16 ByteCount; |
| 781 | } LOCK_RSP; | 872 | } __attribute__((packed)) LOCK_RSP; |
| 782 | 873 | ||
| 783 | typedef struct smb_com_rename_req { | 874 | typedef struct smb_com_rename_req { |
| 784 | struct smb_hdr hdr; /* wct = 1 */ | 875 | struct smb_hdr hdr; /* wct = 1 */ |
| @@ -788,7 +879,7 @@ typedef struct smb_com_rename_req { | |||
| 788 | unsigned char OldFileName[1]; | 879 | unsigned char OldFileName[1]; |
| 789 | /* followed by __u8 BufferFormat2 */ | 880 | /* followed by __u8 BufferFormat2 */ |
| 790 | /* followed by NewFileName */ | 881 | /* followed by NewFileName */ |
| 791 | } RENAME_REQ; | 882 | } __attribute__((packed)) RENAME_REQ; |
| 792 | 883 | ||
| 793 | /* copy request flags */ | 884 | /* copy request flags */ |
| 794 | #define COPY_MUST_BE_FILE 0x0001 | 885 | #define COPY_MUST_BE_FILE 0x0001 |
| @@ -808,7 +899,7 @@ typedef struct smb_com_copy_req { | |||
| 808 | unsigned char OldFileName[1]; | 899 | unsigned char OldFileName[1]; |
| 809 | /* followed by __u8 BufferFormat2 */ | 900 | /* followed by __u8 BufferFormat2 */ |
| 810 | /* followed by NewFileName string */ | 901 | /* followed by NewFileName string */ |
| 811 | } COPY_REQ; | 902 | } __attribute__((packed)) COPY_REQ; |
| 812 | 903 | ||
| 813 | typedef struct smb_com_copy_rsp { | 904 | typedef struct smb_com_copy_rsp { |
| 814 | struct smb_hdr hdr; /* wct = 1 */ | 905 | struct smb_hdr hdr; /* wct = 1 */ |
| @@ -816,7 +907,7 @@ typedef struct smb_com_copy_rsp { | |||
| 816 | __u16 ByteCount; /* may be zero */ | 907 | __u16 ByteCount; /* may be zero */ |
| 817 | __u8 BufferFormat; /* 0x04 - only present if errored file follows */ | 908 | __u8 BufferFormat; /* 0x04 - only present if errored file follows */ |
| 818 | unsigned char ErrorFileName[1]; /* only present if error in copy */ | 909 | unsigned char ErrorFileName[1]; /* only present if error in copy */ |
| 819 | } COPY_RSP; | 910 | } __attribute__((packed)) COPY_RSP; |
| 820 | 911 | ||
| 821 | #define CREATE_HARD_LINK 0x103 | 912 | #define CREATE_HARD_LINK 0x103 |
| 822 | #define MOVEFILE_COPY_ALLOWED 0x0002 | 913 | #define MOVEFILE_COPY_ALLOWED 0x0002 |
| @@ -832,12 +923,12 @@ typedef struct smb_com_nt_rename_req { /* A5 - also used for create hardlink */ | |||
| 832 | unsigned char OldFileName[1]; | 923 | unsigned char OldFileName[1]; |
| 833 | /* followed by __u8 BufferFormat2 */ | 924 | /* followed by __u8 BufferFormat2 */ |
| 834 | /* followed by NewFileName */ | 925 | /* followed by NewFileName */ |
| 835 | } NT_RENAME_REQ; | 926 | } __attribute__((packed)) NT_RENAME_REQ; |
| 836 | 927 | ||
| 837 | typedef struct smb_com_rename_rsp { | 928 | typedef struct smb_com_rename_rsp { |
| 838 | struct smb_hdr hdr; /* wct = 0 */ | 929 | struct smb_hdr hdr; /* wct = 0 */ |
| 839 | __u16 ByteCount; /* bct = 0 */ | 930 | __u16 ByteCount; /* bct = 0 */ |
| 840 | } RENAME_RSP; | 931 | } __attribute__((packed)) RENAME_RSP; |
| 841 | 932 | ||
| 842 | typedef struct smb_com_delete_file_req { | 933 | typedef struct smb_com_delete_file_req { |
| 843 | struct smb_hdr hdr; /* wct = 1 */ | 934 | struct smb_hdr hdr; /* wct = 1 */ |
| @@ -845,36 +936,52 @@ typedef struct smb_com_delete_file_req { | |||
| 845 | __le16 ByteCount; | 936 | __le16 ByteCount; |
| 846 | __u8 BufferFormat; /* 4 = ASCII */ | 937 | __u8 BufferFormat; /* 4 = ASCII */ |
| 847 | unsigned char fileName[1]; | 938 | unsigned char fileName[1]; |
| 848 | } DELETE_FILE_REQ; | 939 | } __attribute__((packed)) DELETE_FILE_REQ; |
| 849 | 940 | ||
| 850 | typedef struct smb_com_delete_file_rsp { | 941 | typedef struct smb_com_delete_file_rsp { |
| 851 | struct smb_hdr hdr; /* wct = 0 */ | 942 | struct smb_hdr hdr; /* wct = 0 */ |
| 852 | __u16 ByteCount; /* bct = 0 */ | 943 | __u16 ByteCount; /* bct = 0 */ |
| 853 | } DELETE_FILE_RSP; | 944 | } __attribute__((packed)) DELETE_FILE_RSP; |
| 854 | 945 | ||
| 855 | typedef struct smb_com_delete_directory_req { | 946 | typedef struct smb_com_delete_directory_req { |
| 856 | struct smb_hdr hdr; /* wct = 0 */ | 947 | struct smb_hdr hdr; /* wct = 0 */ |
| 857 | __le16 ByteCount; | 948 | __le16 ByteCount; |
| 858 | __u8 BufferFormat; /* 4 = ASCII */ | 949 | __u8 BufferFormat; /* 4 = ASCII */ |
| 859 | unsigned char DirName[1]; | 950 | unsigned char DirName[1]; |
| 860 | } DELETE_DIRECTORY_REQ; | 951 | } __attribute__((packed)) DELETE_DIRECTORY_REQ; |
| 861 | 952 | ||
| 862 | typedef struct smb_com_delete_directory_rsp { | 953 | typedef struct smb_com_delete_directory_rsp { |
| 863 | struct smb_hdr hdr; /* wct = 0 */ | 954 | struct smb_hdr hdr; /* wct = 0 */ |
| 864 | __u16 ByteCount; /* bct = 0 */ | 955 | __u16 ByteCount; /* bct = 0 */ |
| 865 | } DELETE_DIRECTORY_RSP; | 956 | } __attribute__((packed)) DELETE_DIRECTORY_RSP; |
| 866 | 957 | ||
| 867 | typedef struct smb_com_create_directory_req { | 958 | typedef struct smb_com_create_directory_req { |
| 868 | struct smb_hdr hdr; /* wct = 0 */ | 959 | struct smb_hdr hdr; /* wct = 0 */ |
| 869 | __le16 ByteCount; | 960 | __le16 ByteCount; |
| 870 | __u8 BufferFormat; /* 4 = ASCII */ | 961 | __u8 BufferFormat; /* 4 = ASCII */ |
| 871 | unsigned char DirName[1]; | 962 | unsigned char DirName[1]; |
| 872 | } CREATE_DIRECTORY_REQ; | 963 | } __attribute__((packed)) CREATE_DIRECTORY_REQ; |
| 873 | 964 | ||
| 874 | typedef struct smb_com_create_directory_rsp { | 965 | typedef struct smb_com_create_directory_rsp { |
| 875 | struct smb_hdr hdr; /* wct = 0 */ | 966 | struct smb_hdr hdr; /* wct = 0 */ |
| 876 | __u16 ByteCount; /* bct = 0 */ | 967 | __u16 ByteCount; /* bct = 0 */ |
| 877 | } CREATE_DIRECTORY_RSP; | 968 | } __attribute__((packed)) CREATE_DIRECTORY_RSP; |
| 969 | |||
| 970 | typedef struct smb_com_query_information_req { | ||
| 971 | struct smb_hdr hdr; /* wct = 0 */ | ||
| 972 | __le16 ByteCount; /* 1 + namelen + 1 */ | ||
| 973 | __u8 BufferFormat; /* 4 = ASCII */ | ||
| 974 | unsigned char FileName[1]; | ||
| 975 | } __attribute__((packed)) QUERY_INFORMATION_REQ; | ||
| 976 | |||
| 977 | typedef struct smb_com_query_information_rsp { | ||
| 978 | struct smb_hdr hdr; /* wct = 10 */ | ||
| 979 | __le16 attr; | ||
| 980 | __le32 last_write_time; | ||
| 981 | __le32 size; | ||
| 982 | __u16 reserved[5]; | ||
| 983 | __le16 ByteCount; /* bcc = 0 */ | ||
| 984 | } __attribute__((packed)) QUERY_INFORMATION_RSP; | ||
| 878 | 985 | ||
| 879 | typedef struct smb_com_setattr_req { | 986 | typedef struct smb_com_setattr_req { |
| 880 | struct smb_hdr hdr; /* wct = 8 */ | 987 | struct smb_hdr hdr; /* wct = 8 */ |
| @@ -885,12 +992,12 @@ typedef struct smb_com_setattr_req { | |||
| 885 | __u16 ByteCount; | 992 | __u16 ByteCount; |
| 886 | __u8 BufferFormat; /* 4 = ASCII */ | 993 | __u8 BufferFormat; /* 4 = ASCII */ |
| 887 | unsigned char fileName[1]; | 994 | unsigned char fileName[1]; |
| 888 | } SETATTR_REQ; | 995 | } __attribute__((packed)) SETATTR_REQ; |
| 889 | 996 | ||
| 890 | typedef struct smb_com_setattr_rsp { | 997 | typedef struct smb_com_setattr_rsp { |
| 891 | struct smb_hdr hdr; /* wct = 0 */ | 998 | struct smb_hdr hdr; /* wct = 0 */ |
| 892 | __u16 ByteCount; /* bct = 0 */ | 999 | __u16 ByteCount; /* bct = 0 */ |
| 893 | } SETATTR_RSP; | 1000 | } __attribute__((packed)) SETATTR_RSP; |
| 894 | 1001 | ||
| 895 | /* empty wct response to setattr */ | 1002 | /* empty wct response to setattr */ |
| 896 | 1003 | ||
| @@ -920,7 +1027,7 @@ typedef struct smb_com_transaction_ioctl_req { | |||
| 920 | __le16 ByteCount; | 1027 | __le16 ByteCount; |
| 921 | __u8 Pad[3]; | 1028 | __u8 Pad[3]; |
| 922 | __u8 Data[1]; | 1029 | __u8 Data[1]; |
| 923 | } TRANSACT_IOCTL_REQ; | 1030 | } __attribute__((packed)) TRANSACT_IOCTL_REQ; |
| 924 | 1031 | ||
| 925 | typedef struct smb_com_transaction_ioctl_rsp { | 1032 | typedef struct smb_com_transaction_ioctl_rsp { |
| 926 | struct smb_hdr hdr; /* wct = 19 */ | 1033 | struct smb_hdr hdr; /* wct = 19 */ |
| @@ -937,7 +1044,7 @@ typedef struct smb_com_transaction_ioctl_rsp { | |||
| 937 | __le16 ReturnedDataLen; | 1044 | __le16 ReturnedDataLen; |
| 938 | __u16 ByteCount; | 1045 | __u16 ByteCount; |
| 939 | __u8 Pad[3]; | 1046 | __u8 Pad[3]; |
| 940 | } TRANSACT_IOCTL_RSP; | 1047 | } __attribute__((packed)) TRANSACT_IOCTL_RSP; |
| 941 | 1048 | ||
| 942 | typedef struct smb_com_transaction_change_notify_req { | 1049 | typedef struct smb_com_transaction_change_notify_req { |
| 943 | struct smb_hdr hdr; /* wct = 23 */ | 1050 | struct smb_hdr hdr; /* wct = 23 */ |
| @@ -961,7 +1068,7 @@ typedef struct smb_com_transaction_change_notify_req { | |||
| 961 | __le16 ByteCount; | 1068 | __le16 ByteCount; |
| 962 | /* __u8 Pad[3];*/ | 1069 | /* __u8 Pad[3];*/ |
| 963 | /* __u8 Data[1];*/ | 1070 | /* __u8 Data[1];*/ |
| 964 | } TRANSACT_CHANGE_NOTIFY_REQ; | 1071 | } __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ; |
| 965 | 1072 | ||
| 966 | typedef struct smb_com_transaction_change_notify_rsp { | 1073 | typedef struct smb_com_transaction_change_notify_rsp { |
| 967 | struct smb_hdr hdr; /* wct = 18 */ | 1074 | struct smb_hdr hdr; /* wct = 18 */ |
| @@ -977,7 +1084,7 @@ typedef struct smb_com_transaction_change_notify_rsp { | |||
| 977 | __u8 SetupCount; /* 0 */ | 1084 | __u8 SetupCount; /* 0 */ |
| 978 | __u16 ByteCount; | 1085 | __u16 ByteCount; |
| 979 | /* __u8 Pad[3]; */ | 1086 | /* __u8 Pad[3]; */ |
| 980 | } TRANSACT_CHANGE_NOTIFY_RSP; | 1087 | } __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_RSP; |
| 981 | /* Completion Filter flags for Notify */ | 1088 | /* Completion Filter flags for Notify */ |
| 982 | #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 | 1089 | #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 |
| 983 | #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 | 1090 | #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 |
| @@ -1008,7 +1115,7 @@ struct file_notify_information { | |||
| 1008 | __le32 Action; | 1115 | __le32 Action; |
| 1009 | __le32 FileNameLength; | 1116 | __le32 FileNameLength; |
| 1010 | __u8 FileName[0]; | 1117 | __u8 FileName[0]; |
| 1011 | }; | 1118 | } __attribute__((packed)); |
| 1012 | 1119 | ||
| 1013 | struct reparse_data { | 1120 | struct reparse_data { |
| 1014 | __u32 ReparseTag; | 1121 | __u32 ReparseTag; |
| @@ -1019,7 +1126,7 @@ struct reparse_data { | |||
| 1019 | __u16 TargetNameOffset; | 1126 | __u16 TargetNameOffset; |
| 1020 | __u16 TargetNameLen; | 1127 | __u16 TargetNameLen; |
| 1021 | char LinkNamesBuf[1]; | 1128 | char LinkNamesBuf[1]; |
| 1022 | }; | 1129 | } __attribute__((packed)); |
| 1023 | 1130 | ||
| 1024 | struct cifs_quota_data { | 1131 | struct cifs_quota_data { |
| 1025 | __u32 rsrvd1; /* 0 */ | 1132 | __u32 rsrvd1; /* 0 */ |
| @@ -1029,7 +1136,7 @@ struct cifs_quota_data { | |||
| 1029 | __u64 soft_limit; | 1136 | __u64 soft_limit; |
| 1030 | __u64 hard_limit; | 1137 | __u64 hard_limit; |
| 1031 | char sid[1]; /* variable size? */ | 1138 | char sid[1]; /* variable size? */ |
| 1032 | }; | 1139 | } __attribute__((packed)); |
| 1033 | 1140 | ||
| 1034 | /* quota sub commands */ | 1141 | /* quota sub commands */ |
| 1035 | #define QUOTA_LIST_CONTINUE 0 | 1142 | #define QUOTA_LIST_CONTINUE 0 |
| @@ -1055,12 +1162,12 @@ struct trans2_req { | |||
| 1055 | __u8 Reserved3; | 1162 | __u8 Reserved3; |
| 1056 | __le16 SubCommand; /* 1st setup word - SetupCount words follow */ | 1163 | __le16 SubCommand; /* 1st setup word - SetupCount words follow */ |
| 1057 | __le16 ByteCount; | 1164 | __le16 ByteCount; |
| 1058 | }; | 1165 | } __attribute__((packed)); |
| 1059 | 1166 | ||
| 1060 | struct smb_t2_req { | 1167 | struct smb_t2_req { |
| 1061 | struct smb_hdr hdr; | 1168 | struct smb_hdr hdr; |
| 1062 | struct trans2_req t2_req; | 1169 | struct trans2_req t2_req; |
| 1063 | }; | 1170 | } __attribute__((packed)); |
| 1064 | 1171 | ||
| 1065 | struct trans2_resp { | 1172 | struct trans2_resp { |
| 1066 | /* struct smb_hdr hdr precedes. Note wct = 10 + setup count */ | 1173 | /* struct smb_hdr hdr precedes. Note wct = 10 + setup count */ |
| @@ -1079,12 +1186,12 @@ struct trans2_resp { | |||
| 1079 | __u16 ByteCount; | 1186 | __u16 ByteCount; |
| 1080 | __u16 Reserved2;*/ | 1187 | __u16 Reserved2;*/ |
| 1081 | /* data area follows */ | 1188 | /* data area follows */ |
| 1082 | }; | 1189 | } __attribute__((packed)); |
| 1083 | 1190 | ||
| 1084 | struct smb_t2_rsp { | 1191 | struct smb_t2_rsp { |
| 1085 | struct smb_hdr hdr; | 1192 | struct smb_hdr hdr; |
| 1086 | struct trans2_resp t2_rsp; | 1193 | struct trans2_resp t2_rsp; |
| 1087 | }; | 1194 | } __attribute__((packed)); |
| 1088 | 1195 | ||
| 1089 | /* PathInfo/FileInfo infolevels */ | 1196 | /* PathInfo/FileInfo infolevels */ |
| 1090 | #define SMB_INFO_STANDARD 1 | 1197 | #define SMB_INFO_STANDARD 1 |
| @@ -1171,14 +1278,14 @@ typedef struct smb_com_transaction2_qpi_req { | |||
| 1171 | __le16 InformationLevel; | 1278 | __le16 InformationLevel; |
| 1172 | __u32 Reserved4; | 1279 | __u32 Reserved4; |
| 1173 | char FileName[1]; | 1280 | char FileName[1]; |
| 1174 | } TRANSACTION2_QPI_REQ; | 1281 | } __attribute__((packed)) TRANSACTION2_QPI_REQ; |
| 1175 | 1282 | ||
| 1176 | typedef struct smb_com_transaction2_qpi_rsp { | 1283 | typedef struct smb_com_transaction2_qpi_rsp { |
| 1177 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ | 1284 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ |
| 1178 | struct trans2_resp t2; | 1285 | struct trans2_resp t2; |
| 1179 | __u16 ByteCount; | 1286 | __u16 ByteCount; |
| 1180 | __u16 Reserved2; /* parameter word reserved - present for infolevels > 100 */ | 1287 | __u16 Reserved2; /* parameter word reserved - present for infolevels > 100 */ |
| 1181 | } TRANSACTION2_QPI_RSP; | 1288 | } __attribute__((packed)) TRANSACTION2_QPI_RSP; |
| 1182 | 1289 | ||
| 1183 | typedef struct smb_com_transaction2_spi_req { | 1290 | typedef struct smb_com_transaction2_spi_req { |
| 1184 | struct smb_hdr hdr; /* wct = 15 */ | 1291 | struct smb_hdr hdr; /* wct = 15 */ |
| @@ -1204,21 +1311,21 @@ typedef struct smb_com_transaction2_spi_req { | |||
| 1204 | __le16 InformationLevel; | 1311 | __le16 InformationLevel; |
| 1205 | __u32 Reserved4; | 1312 | __u32 Reserved4; |
| 1206 | char FileName[1]; | 1313 | char FileName[1]; |
| 1207 | } TRANSACTION2_SPI_REQ; | 1314 | } __attribute__((packed)) TRANSACTION2_SPI_REQ; |
| 1208 | 1315 | ||
| 1209 | typedef struct smb_com_transaction2_spi_rsp { | 1316 | typedef struct smb_com_transaction2_spi_rsp { |
| 1210 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ | 1317 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ |
| 1211 | struct trans2_resp t2; | 1318 | struct trans2_resp t2; |
| 1212 | __u16 ByteCount; | 1319 | __u16 ByteCount; |
| 1213 | __u16 Reserved2; /* parameter word reserved - present for infolevels > 100 */ | 1320 | __u16 Reserved2; /* parameter word reserved - present for infolevels > 100 */ |
| 1214 | } TRANSACTION2_SPI_RSP; | 1321 | } __attribute__((packed)) TRANSACTION2_SPI_RSP; |
| 1215 | 1322 | ||
| 1216 | struct set_file_rename { | 1323 | struct set_file_rename { |
| 1217 | __le32 overwrite; /* 1 = overwrite dest */ | 1324 | __le32 overwrite; /* 1 = overwrite dest */ |
| 1218 | __u32 root_fid; /* zero */ | 1325 | __u32 root_fid; /* zero */ |
| 1219 | __le32 target_name_len; | 1326 | __le32 target_name_len; |
| 1220 | char target_name[0]; /* Must be unicode */ | 1327 | char target_name[0]; /* Must be unicode */ |
| 1221 | }; | 1328 | } __attribute__((packed)); |
| 1222 | 1329 | ||
| 1223 | struct smb_com_transaction2_sfi_req { | 1330 | struct smb_com_transaction2_sfi_req { |
| 1224 | struct smb_hdr hdr; /* wct = 15 */ | 1331 | struct smb_hdr hdr; /* wct = 15 */ |
| @@ -1244,7 +1351,7 @@ struct smb_com_transaction2_sfi_req { | |||
| 1244 | __u16 Fid; | 1351 | __u16 Fid; |
| 1245 | __le16 InformationLevel; | 1352 | __le16 InformationLevel; |
| 1246 | __u16 Reserved4; | 1353 | __u16 Reserved4; |
| 1247 | }; | 1354 | } __attribute__((packed)); |
| 1248 | 1355 | ||
| 1249 | struct smb_com_transaction2_sfi_rsp { | 1356 | struct smb_com_transaction2_sfi_rsp { |
| 1250 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ | 1357 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ |
| @@ -1252,7 +1359,7 @@ struct smb_com_transaction2_sfi_rsp { | |||
| 1252 | __u16 ByteCount; | 1359 | __u16 ByteCount; |
| 1253 | __u16 Reserved2; /* parameter word reserved - | 1360 | __u16 Reserved2; /* parameter word reserved - |
| 1254 | present for infolevels > 100 */ | 1361 | present for infolevels > 100 */ |
| 1255 | }; | 1362 | } __attribute__((packed)); |
| 1256 | 1363 | ||
| 1257 | struct smb_t2_qfi_req { | 1364 | struct smb_t2_qfi_req { |
| 1258 | struct smb_hdr hdr; | 1365 | struct smb_hdr hdr; |
| @@ -1260,7 +1367,7 @@ struct smb_t2_qfi_req { | |||
| 1260 | __u8 Pad; | 1367 | __u8 Pad; |
| 1261 | __u16 Fid; | 1368 | __u16 Fid; |
| 1262 | __le16 InformationLevel; | 1369 | __le16 InformationLevel; |
| 1263 | }; | 1370 | } __attribute__((packed)); |
| 1264 | 1371 | ||
| 1265 | struct smb_t2_qfi_rsp { | 1372 | struct smb_t2_qfi_rsp { |
| 1266 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ | 1373 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ |
| @@ -1268,7 +1375,7 @@ struct smb_t2_qfi_rsp { | |||
| 1268 | __u16 ByteCount; | 1375 | __u16 ByteCount; |
| 1269 | __u16 Reserved2; /* parameter word reserved - | 1376 | __u16 Reserved2; /* parameter word reserved - |
| 1270 | present for infolevels > 100 */ | 1377 | present for infolevels > 100 */ |
| 1271 | }; | 1378 | } __attribute__((packed)); |
| 1272 | 1379 | ||
| 1273 | /* | 1380 | /* |
| 1274 | * Flags on T2 FINDFIRST and FINDNEXT | 1381 | * Flags on T2 FINDFIRST and FINDNEXT |
| @@ -1310,13 +1417,13 @@ typedef struct smb_com_transaction2_ffirst_req { | |||
| 1310 | __le16 InformationLevel; | 1417 | __le16 InformationLevel; |
| 1311 | __le32 SearchStorageType; | 1418 | __le32 SearchStorageType; |
| 1312 | char FileName[1]; | 1419 | char FileName[1]; |
| 1313 | } TRANSACTION2_FFIRST_REQ; | 1420 | } __attribute__((packed)) TRANSACTION2_FFIRST_REQ; |
| 1314 | 1421 | ||
| 1315 | typedef struct smb_com_transaction2_ffirst_rsp { | 1422 | typedef struct smb_com_transaction2_ffirst_rsp { |
| 1316 | struct smb_hdr hdr; /* wct = 10 */ | 1423 | struct smb_hdr hdr; /* wct = 10 */ |
| 1317 | struct trans2_resp t2; | 1424 | struct trans2_resp t2; |
| 1318 | __u16 ByteCount; | 1425 | __u16 ByteCount; |
| 1319 | } TRANSACTION2_FFIRST_RSP; | 1426 | } __attribute__((packed)) TRANSACTION2_FFIRST_RSP; |
| 1320 | 1427 | ||
| 1321 | typedef struct smb_com_transaction2_ffirst_rsp_parms { | 1428 | typedef struct smb_com_transaction2_ffirst_rsp_parms { |
| 1322 | __u16 SearchHandle; | 1429 | __u16 SearchHandle; |
| @@ -1324,7 +1431,7 @@ typedef struct smb_com_transaction2_ffirst_rsp_parms { | |||
| 1324 | __le16 EndofSearch; | 1431 | __le16 EndofSearch; |
| 1325 | __le16 EAErrorOffset; | 1432 | __le16 EAErrorOffset; |
| 1326 | __le16 LastNameOffset; | 1433 | __le16 LastNameOffset; |
| 1327 | } T2_FFIRST_RSP_PARMS; | 1434 | } __attribute__((packed)) T2_FFIRST_RSP_PARMS; |
| 1328 | 1435 | ||
| 1329 | typedef struct smb_com_transaction2_fnext_req { | 1436 | typedef struct smb_com_transaction2_fnext_req { |
| 1330 | struct smb_hdr hdr; /* wct = 15 */ | 1437 | struct smb_hdr hdr; /* wct = 15 */ |
| @@ -1352,20 +1459,20 @@ typedef struct smb_com_transaction2_fnext_req { | |||
| 1352 | __u32 ResumeKey; | 1459 | __u32 ResumeKey; |
| 1353 | __le16 SearchFlags; | 1460 | __le16 SearchFlags; |
| 1354 | char ResumeFileName[1]; | 1461 | char ResumeFileName[1]; |
| 1355 | } TRANSACTION2_FNEXT_REQ; | 1462 | } __attribute__((packed)) TRANSACTION2_FNEXT_REQ; |
| 1356 | 1463 | ||
| 1357 | typedef struct smb_com_transaction2_fnext_rsp { | 1464 | typedef struct smb_com_transaction2_fnext_rsp { |
| 1358 | struct smb_hdr hdr; /* wct = 10 */ | 1465 | struct smb_hdr hdr; /* wct = 10 */ |
| 1359 | struct trans2_resp t2; | 1466 | struct trans2_resp t2; |
| 1360 | __u16 ByteCount; | 1467 | __u16 ByteCount; |
| 1361 | } TRANSACTION2_FNEXT_RSP; | 1468 | } __attribute__((packed)) TRANSACTION2_FNEXT_RSP; |
| 1362 | 1469 | ||
| 1363 | typedef struct smb_com_transaction2_fnext_rsp_parms { | 1470 | typedef struct smb_com_transaction2_fnext_rsp_parms { |
| 1364 | __le16 SearchCount; | 1471 | __le16 SearchCount; |
| 1365 | __le16 EndofSearch; | 1472 | __le16 EndofSearch; |
| 1366 | __le16 EAErrorOffset; | 1473 | __le16 EAErrorOffset; |
| 1367 | __le16 LastNameOffset; | 1474 | __le16 LastNameOffset; |
| 1368 | } T2_FNEXT_RSP_PARMS; | 1475 | } __attribute__((packed)) T2_FNEXT_RSP_PARMS; |
| 1369 | 1476 | ||
| 1370 | /* QFSInfo Levels */ | 1477 | /* QFSInfo Levels */ |
| 1371 | #define SMB_INFO_ALLOCATION 1 | 1478 | #define SMB_INFO_ALLOCATION 1 |
| @@ -1402,14 +1509,51 @@ typedef struct smb_com_transaction2_qfsi_req { | |||
| 1402 | __le16 ByteCount; | 1509 | __le16 ByteCount; |
| 1403 | __u8 Pad; | 1510 | __u8 Pad; |
| 1404 | __le16 InformationLevel; | 1511 | __le16 InformationLevel; |
| 1405 | } TRANSACTION2_QFSI_REQ; | 1512 | } __attribute__((packed)) TRANSACTION2_QFSI_REQ; |
| 1406 | 1513 | ||
| 1407 | typedef struct smb_com_transaction_qfsi_rsp { | 1514 | typedef struct smb_com_transaction_qfsi_rsp { |
| 1408 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ | 1515 | struct smb_hdr hdr; /* wct = 10 + SetupCount */ |
| 1409 | struct trans2_resp t2; | 1516 | struct trans2_resp t2; |
| 1410 | __u16 ByteCount; | 1517 | __u16 ByteCount; |
| 1411 | __u8 Pad; /* may be three bytes *//* followed by data area */ | 1518 | __u8 Pad; /* may be three bytes *//* followed by data area */ |
| 1412 | } TRANSACTION2_QFSI_RSP; | 1519 | } __attribute__((packed)) TRANSACTION2_QFSI_RSP; |
| 1520 | |||
| 1521 | |||
| 1522 | /* SETFSInfo Levels */ | ||
| 1523 | #define SMB_SET_CIFS_UNIX_INFO 0x200 | ||
| 1524 | typedef struct smb_com_transaction2_setfsi_req { | ||
| 1525 | struct smb_hdr hdr; /* wct = 15 */ | ||
| 1526 | __le16 TotalParameterCount; | ||
| 1527 | __le16 TotalDataCount; | ||
| 1528 | __le16 MaxParameterCount; | ||
| 1529 | __le16 MaxDataCount; | ||
| 1530 | __u8 MaxSetupCount; | ||
| 1531 | __u8 Reserved; | ||
| 1532 | __le16 Flags; | ||
| 1533 | __le32 Timeout; | ||
| 1534 | __u16 Reserved2; | ||
| 1535 | __le16 ParameterCount; /* 4 */ | ||
| 1536 | __le16 ParameterOffset; | ||
| 1537 | __le16 DataCount; /* 12 */ | ||
| 1538 | __le16 DataOffset; | ||
| 1539 | __u8 SetupCount; /* one */ | ||
| 1540 | __u8 Reserved3; | ||
| 1541 | __le16 SubCommand; /* TRANS2_SET_FS_INFORMATION */ | ||
| 1542 | __le16 ByteCount; | ||
| 1543 | __u8 Pad; | ||
| 1544 | __u16 FileNum; /* Parameters start. */ | ||
| 1545 | __le16 InformationLevel;/* Parameters end. */ | ||
| 1546 | __le16 ClientUnixMajor; /* Data start. */ | ||
| 1547 | __le16 ClientUnixMinor; | ||
| 1548 | __le64 ClientUnixCap; /* Data end */ | ||
| 1549 | } __attribute__((packed)) TRANSACTION2_SETFSI_REQ; | ||
| 1550 | |||
| 1551 | typedef struct smb_com_transaction2_setfsi_rsp { | ||
| 1552 | struct smb_hdr hdr; /* wct = 10 */ | ||
| 1553 | struct trans2_resp t2; | ||
| 1554 | __u16 ByteCount; | ||
| 1555 | } __attribute__((packed)) TRANSACTION2_SETFSI_RSP; | ||
| 1556 | |||
| 1413 | 1557 | ||
| 1414 | typedef struct smb_com_transaction2_get_dfs_refer_req { | 1558 | typedef struct smb_com_transaction2_get_dfs_refer_req { |
| 1415 | struct smb_hdr hdr; /* wct = 15 */ | 1559 | struct smb_hdr hdr; /* wct = 15 */ |
| @@ -1433,7 +1577,7 @@ typedef struct smb_com_transaction2_get_dfs_refer_req { | |||
| 1433 | __u8 Pad[3]; /* Win2K has sent 0x0F01 (max resp length perhaps?) followed by one byte pad - doesn't seem to matter though */ | 1577 | __u8 Pad[3]; /* Win2K has sent 0x0F01 (max resp length perhaps?) followed by one byte pad - doesn't seem to matter though */ |
| 1434 | __le16 MaxReferralLevel; | 1578 | __le16 MaxReferralLevel; |
| 1435 | char RequestFileName[1]; | 1579 | char RequestFileName[1]; |
| 1436 | } TRANSACTION2_GET_DFS_REFER_REQ; | 1580 | } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ; |
| 1437 | 1581 | ||
| 1438 | typedef struct dfs_referral_level_3 { | 1582 | typedef struct dfs_referral_level_3 { |
| 1439 | __le16 VersionNumber; | 1583 | __le16 VersionNumber; |
| @@ -1445,7 +1589,7 @@ typedef struct dfs_referral_level_3 { | |||
| 1445 | __le16 DfsPathOffset; | 1589 | __le16 DfsPathOffset; |
| 1446 | __le16 DfsAlternatePathOffset; | 1590 | __le16 DfsAlternatePathOffset; |
| 1447 | __le16 NetworkAddressOffset; | 1591 | __le16 NetworkAddressOffset; |
| 1448 | } REFERRAL3; | 1592 | } __attribute__((packed)) REFERRAL3; |
| 1449 | 1593 | ||
| 1450 | typedef struct smb_com_transaction_get_dfs_refer_rsp { | 1594 | typedef struct smb_com_transaction_get_dfs_refer_rsp { |
| 1451 | struct smb_hdr hdr; /* wct = 10 */ | 1595 | struct smb_hdr hdr; /* wct = 10 */ |
| @@ -1458,7 +1602,7 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp { | |||
| 1458 | __u16 Pad2; | 1602 | __u16 Pad2; |
| 1459 | REFERRAL3 referrals[1]; /* array of level 3 dfs_referral structures */ | 1603 | REFERRAL3 referrals[1]; /* array of level 3 dfs_referral structures */ |
| 1460 | /* followed by the strings pointed to by the referral structures */ | 1604 | /* followed by the strings pointed to by the referral structures */ |
| 1461 | } TRANSACTION2_GET_DFS_REFER_RSP; | 1605 | } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_RSP; |
| 1462 | 1606 | ||
| 1463 | /* DFS Flags */ | 1607 | /* DFS Flags */ |
| 1464 | #define DFSREF_REFERRAL_SERVER 0x0001 | 1608 | #define DFSREF_REFERRAL_SERVER 0x0001 |
| @@ -1512,7 +1656,7 @@ struct serverInfo { | |||
| 1512 | unsigned char versionMinor; | 1656 | unsigned char versionMinor; |
| 1513 | unsigned long type; | 1657 | unsigned long type; |
| 1514 | unsigned int commentOffset; | 1658 | unsigned int commentOffset; |
| 1515 | }; | 1659 | } __attribute__((packed)); |
| 1516 | 1660 | ||
| 1517 | /* | 1661 | /* |
| 1518 | * The following structure is the format of the data returned on a NetShareEnum | 1662 | * The following structure is the format of the data returned on a NetShareEnum |
| @@ -1524,39 +1668,55 @@ struct shareInfo { | |||
| 1524 | char pad; | 1668 | char pad; |
| 1525 | unsigned short type; | 1669 | unsigned short type; |
| 1526 | unsigned int commentOffset; | 1670 | unsigned int commentOffset; |
| 1527 | }; | 1671 | } __attribute__((packed)); |
| 1528 | 1672 | ||
| 1529 | struct aliasInfo { | 1673 | struct aliasInfo { |
| 1530 | char aliasName[9]; | 1674 | char aliasName[9]; |
| 1531 | char pad; | 1675 | char pad; |
| 1532 | unsigned int commentOffset; | 1676 | unsigned int commentOffset; |
| 1533 | unsigned char type[2]; | 1677 | unsigned char type[2]; |
| 1534 | }; | 1678 | } __attribute__((packed)); |
| 1535 | 1679 | ||
| 1536 | struct aliasInfo92 { | 1680 | struct aliasInfo92 { |
| 1537 | int aliasNameOffset; | 1681 | int aliasNameOffset; |
| 1538 | int serverNameOffset; | 1682 | int serverNameOffset; |
| 1539 | int shareNameOffset; | 1683 | int shareNameOffset; |
| 1540 | }; | 1684 | } __attribute__((packed)); |
| 1541 | 1685 | ||
| 1542 | typedef struct { | 1686 | typedef struct { |
| 1543 | __le64 TotalAllocationUnits; | 1687 | __le64 TotalAllocationUnits; |
| 1544 | __le64 FreeAllocationUnits; | 1688 | __le64 FreeAllocationUnits; |
| 1545 | __le32 SectorsPerAllocationUnit; | 1689 | __le32 SectorsPerAllocationUnit; |
| 1546 | __le32 BytesPerSector; | 1690 | __le32 BytesPerSector; |
| 1547 | } FILE_SYSTEM_INFO; /* size info, level 0x103 */ | 1691 | } __attribute__((packed)) FILE_SYSTEM_INFO; /* size info, level 0x103 */ |
| 1692 | |||
| 1693 | typedef struct { | ||
| 1694 | __le32 fsid; | ||
| 1695 | __le32 SectorsPerAllocationUnit; | ||
| 1696 | __le32 TotalAllocationUnits; | ||
| 1697 | __le32 FreeAllocationUnits; | ||
| 1698 | __le16 BytesPerSector; | ||
| 1699 | } __attribute__((packed)) FILE_SYSTEM_ALLOC_INFO; | ||
| 1548 | 1700 | ||
| 1549 | typedef struct { | 1701 | typedef struct { |
| 1550 | __le16 MajorVersionNumber; | 1702 | __le16 MajorVersionNumber; |
| 1551 | __le16 MinorVersionNumber; | 1703 | __le16 MinorVersionNumber; |
| 1552 | __le64 Capability; | 1704 | __le64 Capability; |
| 1553 | } FILE_SYSTEM_UNIX_INFO; /* Unix extensions info, level 0x200 */ | 1705 | } __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extensions info, level 0x200 */ |
| 1706 | |||
| 1707 | /* Version numbers for CIFS UNIX major and minor. */ | ||
| 1708 | #define CIFS_UNIX_MAJOR_VERSION 1 | ||
| 1709 | #define CIFS_UNIX_MINOR_VERSION 0 | ||
| 1710 | |||
| 1554 | /* Linux/Unix extensions capability flags */ | 1711 | /* Linux/Unix extensions capability flags */ |
| 1555 | #define CIFS_UNIX_FCNTL_CAP 0x00000001 /* support for fcntl locks */ | 1712 | #define CIFS_UNIX_FCNTL_CAP 0x00000001 /* support for fcntl locks */ |
| 1556 | #define CIFS_UNIX_POSIX_ACL_CAP 0x00000002 /* support getfacl/setfacl */ | 1713 | #define CIFS_UNIX_POSIX_ACL_CAP 0x00000002 /* support getfacl/setfacl */ |
| 1557 | #define CIFS_UNIX_XATTR_CAP 0x00000004 /* support new namespace */ | 1714 | #define CIFS_UNIX_XATTR_CAP 0x00000004 /* support new namespace */ |
| 1558 | #define CIFS_UNIX_EXTATTR_CAP 0x00000008 /* support chattr/chflag */ | 1715 | #define CIFS_UNIX_EXTATTR_CAP 0x00000008 /* support chattr/chflag */ |
| 1716 | #define CIFS_UNIX_POSIX_PATHNAMES_CAP 0x00000010 /* Use POSIX pathnames on the wire. */ | ||
| 1717 | |||
| 1559 | #define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */ | 1718 | #define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */ |
| 1719 | |||
| 1560 | typedef struct { | 1720 | typedef struct { |
| 1561 | /* For undefined recommended transfer size return -1 in that field */ | 1721 | /* For undefined recommended transfer size return -1 in that field */ |
| 1562 | __le32 OptimalTransferSize; /* bsize on some os, iosize on other os */ | 1722 | __le32 OptimalTransferSize; /* bsize on some os, iosize on other os */ |
| @@ -1577,7 +1737,7 @@ typedef struct { | |||
| 1577 | __le64 FileSysIdentifier; /* fsid */ | 1737 | __le64 FileSysIdentifier; /* fsid */ |
| 1578 | /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */ | 1738 | /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */ |
| 1579 | /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */ | 1739 | /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */ |
| 1580 | } FILE_SYSTEM_POSIX_INFO; | 1740 | } __attribute__((packed)) FILE_SYSTEM_POSIX_INFO; |
| 1581 | 1741 | ||
| 1582 | /* DeviceType Flags */ | 1742 | /* DeviceType Flags */ |
| 1583 | #define FILE_DEVICE_CD_ROM 0x00000002 | 1743 | #define FILE_DEVICE_CD_ROM 0x00000002 |
| @@ -1602,14 +1762,14 @@ typedef struct { | |||
| 1602 | typedef struct { | 1762 | typedef struct { |
| 1603 | __le32 DeviceType; | 1763 | __le32 DeviceType; |
| 1604 | __le32 DeviceCharacteristics; | 1764 | __le32 DeviceCharacteristics; |
| 1605 | } FILE_SYSTEM_DEVICE_INFO; /* device info, level 0x104 */ | 1765 | } __attribute__((packed)) FILE_SYSTEM_DEVICE_INFO; /* device info, level 0x104 */ |
| 1606 | 1766 | ||
| 1607 | typedef struct { | 1767 | typedef struct { |
| 1608 | __le32 Attributes; | 1768 | __le32 Attributes; |
| 1609 | __le32 MaxPathNameComponentLength; | 1769 | __le32 MaxPathNameComponentLength; |
| 1610 | __le32 FileSystemNameLen; | 1770 | __le32 FileSystemNameLen; |
| 1611 | char FileSystemName[52]; /* do not really need to save this - so potentially get only subset of name */ | 1771 | char FileSystemName[52]; /* do not really need to save this - so potentially get only subset of name */ |
| 1612 | } FILE_SYSTEM_ATTRIBUTE_INFO; | 1772 | } __attribute__((packed)) FILE_SYSTEM_ATTRIBUTE_INFO; |
| 1613 | 1773 | ||
| 1614 | /******************************************************************************/ | 1774 | /******************************************************************************/ |
| 1615 | /* QueryFileInfo/QueryPathinfo (also for SetPath/SetFile) data buffer formats */ | 1775 | /* QueryFileInfo/QueryPathinfo (also for SetPath/SetFile) data buffer formats */ |
| @@ -1636,7 +1796,7 @@ typedef struct { /* data block encoding of response to level 263 QPathInfo */ | |||
| 1636 | __le32 AlignmentRequirement; | 1796 | __le32 AlignmentRequirement; |
| 1637 | __le32 FileNameLength; | 1797 | __le32 FileNameLength; |
| 1638 | char FileName[1]; | 1798 | char FileName[1]; |
| 1639 | } FILE_ALL_INFO; /* level 0x107 QPathInfo */ | 1799 | } __attribute__((packed)) FILE_ALL_INFO; /* level 0x107 QPathInfo */ |
| 1640 | 1800 | ||
| 1641 | /* defines for enumerating possible values of the Unix type field below */ | 1801 | /* defines for enumerating possible values of the Unix type field below */ |
| 1642 | #define UNIX_FILE 0 | 1802 | #define UNIX_FILE 0 |
| @@ -1660,11 +1820,11 @@ typedef struct { | |||
| 1660 | __u64 UniqueId; | 1820 | __u64 UniqueId; |
| 1661 | __le64 Permissions; | 1821 | __le64 Permissions; |
| 1662 | __le64 Nlinks; | 1822 | __le64 Nlinks; |
| 1663 | } FILE_UNIX_BASIC_INFO; /* level 0x200 QPathInfo */ | 1823 | } __attribute__((packed)) FILE_UNIX_BASIC_INFO; /* level 0x200 QPathInfo */ |
| 1664 | 1824 | ||
| 1665 | typedef struct { | 1825 | typedef struct { |
| 1666 | char LinkDest[1]; | 1826 | char LinkDest[1]; |
| 1667 | } FILE_UNIX_LINK_INFO; /* level 0x201 QPathInfo */ | 1827 | } __attribute__((packed)) FILE_UNIX_LINK_INFO; /* level 0x201 QPathInfo */ |
| 1668 | 1828 | ||
| 1669 | /* The following three structures are needed only for | 1829 | /* The following three structures are needed only for |
| 1670 | setting time to NT4 and some older servers via | 1830 | setting time to NT4 and some older servers via |
| @@ -1673,13 +1833,13 @@ typedef struct { | |||
| 1673 | __u16 Day:5; | 1833 | __u16 Day:5; |
| 1674 | __u16 Month:4; | 1834 | __u16 Month:4; |
| 1675 | __u16 Year:7; | 1835 | __u16 Year:7; |
| 1676 | } SMB_DATE; | 1836 | } __attribute__((packed)) SMB_DATE; |
| 1677 | 1837 | ||
| 1678 | typedef struct { | 1838 | typedef struct { |
| 1679 | __u16 TwoSeconds:5; | 1839 | __u16 TwoSeconds:5; |
| 1680 | __u16 Minutes:6; | 1840 | __u16 Minutes:6; |
| 1681 | __u16 Hours:5; | 1841 | __u16 Hours:5; |
| 1682 | } SMB_TIME; | 1842 | } __attribute__((packed)) SMB_TIME; |
| 1683 | 1843 | ||
| 1684 | typedef struct { | 1844 | typedef struct { |
| 1685 | __le16 CreationDate; /* SMB Date see above */ | 1845 | __le16 CreationDate; /* SMB Date see above */ |
| @@ -1692,7 +1852,7 @@ typedef struct { | |||
| 1692 | __le32 AllocationSize; | 1852 | __le32 AllocationSize; |
| 1693 | __le16 Attributes; /* verify not u32 */ | 1853 | __le16 Attributes; /* verify not u32 */ |
| 1694 | __le32 EASize; | 1854 | __le32 EASize; |
| 1695 | } FILE_INFO_STANDARD; /* level 1 SetPath/FileInfo */ | 1855 | } __attribute__((packed)) FILE_INFO_STANDARD; /* level 1 SetPath/FileInfo */ |
| 1696 | 1856 | ||
| 1697 | typedef struct { | 1857 | typedef struct { |
| 1698 | __le64 CreationTime; | 1858 | __le64 CreationTime; |
| @@ -1701,19 +1861,19 @@ typedef struct { | |||
| 1701 | __le64 ChangeTime; | 1861 | __le64 ChangeTime; |
| 1702 | __le32 Attributes; | 1862 | __le32 Attributes; |
| 1703 | __u32 Pad; | 1863 | __u32 Pad; |
| 1704 | } FILE_BASIC_INFO; /* size info, level 0x101 */ | 1864 | } __attribute__((packed)) FILE_BASIC_INFO; /* size info, level 0x101 */ |
| 1705 | 1865 | ||
| 1706 | struct file_allocation_info { | 1866 | struct file_allocation_info { |
| 1707 | __le64 AllocationSize; /* Note old Samba srvr rounds this up too much */ | 1867 | __le64 AllocationSize; /* Note old Samba srvr rounds this up too much */ |
| 1708 | }; /* size used on disk, level 0x103 for set, 0x105 for query */ | 1868 | } __attribute__((packed)); /* size used on disk, level 0x103 for set, 0x105 for query */ |
| 1709 | 1869 | ||
| 1710 | struct file_end_of_file_info { | 1870 | struct file_end_of_file_info { |
| 1711 | __le64 FileSize; /* offset to end of file */ | 1871 | __le64 FileSize; /* offset to end of file */ |
| 1712 | }; /* size info, level 0x104 for set, 0x106 for query */ | 1872 | } __attribute__((packed)); /* size info, level 0x104 for set, 0x106 for query */ |
| 1713 | 1873 | ||
| 1714 | struct file_alt_name_info { | 1874 | struct file_alt_name_info { |
| 1715 | __u8 alt_name[1]; | 1875 | __u8 alt_name[1]; |
| 1716 | }; /* level 0x0108 */ | 1876 | } __attribute__((packed)); /* level 0x0108 */ |
| 1717 | 1877 | ||
| 1718 | struct file_stream_info { | 1878 | struct file_stream_info { |
| 1719 | __le32 number_of_streams; /* BB check sizes and verify location */ | 1879 | __le32 number_of_streams; /* BB check sizes and verify location */ |
| @@ -1730,7 +1890,7 @@ struct file_compression_info { | |||
| 1730 | __u8 ch_shift; | 1890 | __u8 ch_shift; |
| 1731 | __u8 cl_shift; | 1891 | __u8 cl_shift; |
| 1732 | __u8 pad[3]; | 1892 | __u8 pad[3]; |
| 1733 | }; /* level 0x10b */ | 1893 | } __attribute__((packed)); /* level 0x10b */ |
| 1734 | 1894 | ||
| 1735 | /* POSIX ACL set/query path info structures */ | 1895 | /* POSIX ACL set/query path info structures */ |
| 1736 | #define CIFS_ACL_VERSION 1 | 1896 | #define CIFS_ACL_VERSION 1 |
| @@ -1738,7 +1898,7 @@ struct cifs_posix_ace { /* access control entry (ACE) */ | |||
| 1738 | __u8 cifs_e_tag; | 1898 | __u8 cifs_e_tag; |
| 1739 | __u8 cifs_e_perm; | 1899 | __u8 cifs_e_perm; |
| 1740 | __le64 cifs_uid; /* or gid */ | 1900 | __le64 cifs_uid; /* or gid */ |
| 1741 | }; | 1901 | } __attribute__((packed)); |
| 1742 | 1902 | ||
| 1743 | struct cifs_posix_acl { /* access conrol list (ACL) */ | 1903 | struct cifs_posix_acl { /* access conrol list (ACL) */ |
| 1744 | __le16 version; | 1904 | __le16 version; |
| @@ -1747,7 +1907,7 @@ struct cifs_posix_acl { /* access conrol list (ACL) */ | |||
| 1747 | struct cifs_posix_ace ace_array[0]; | 1907 | struct cifs_posix_ace ace_array[0]; |
| 1748 | /* followed by | 1908 | /* followed by |
| 1749 | struct cifs_posix_ace default_ace_arraay[] */ | 1909 | struct cifs_posix_ace default_ace_arraay[] */ |
| 1750 | }; /* level 0x204 */ | 1910 | } __attribute__((packed)); /* level 0x204 */ |
| 1751 | 1911 | ||
| 1752 | /* types of access control entries already defined in posix_acl.h */ | 1912 | /* types of access control entries already defined in posix_acl.h */ |
| 1753 | /* #define CIFS_POSIX_ACL_USER_OBJ 0x01 | 1913 | /* #define CIFS_POSIX_ACL_USER_OBJ 0x01 |
| @@ -1766,15 +1926,15 @@ struct cifs_posix_acl { /* access conrol list (ACL) */ | |||
| 1766 | 1926 | ||
| 1767 | struct file_internal_info { | 1927 | struct file_internal_info { |
| 1768 | __u64 UniqueId; /* inode number */ | 1928 | __u64 UniqueId; /* inode number */ |
| 1769 | }; /* level 0x3ee */ | 1929 | } __attribute__((packed)); /* level 0x3ee */ |
| 1770 | struct file_mode_info { | 1930 | struct file_mode_info { |
| 1771 | __le32 Mode; | 1931 | __le32 Mode; |
| 1772 | }; /* level 0x3f8 */ | 1932 | } __attribute__((packed)); /* level 0x3f8 */ |
| 1773 | 1933 | ||
| 1774 | struct file_attrib_tag { | 1934 | struct file_attrib_tag { |
| 1775 | __le32 Attribute; | 1935 | __le32 Attribute; |
| 1776 | __le32 ReparseTag; | 1936 | __le32 ReparseTag; |
| 1777 | }; /* level 0x40b */ | 1937 | } __attribute__((packed)); /* level 0x40b */ |
| 1778 | 1938 | ||
| 1779 | 1939 | ||
| 1780 | /********************************************************/ | 1940 | /********************************************************/ |
| @@ -1798,7 +1958,7 @@ typedef struct { | |||
| 1798 | __le64 Permissions; | 1958 | __le64 Permissions; |
| 1799 | __le64 Nlinks; | 1959 | __le64 Nlinks; |
| 1800 | char FileName[1]; | 1960 | char FileName[1]; |
| 1801 | } FILE_UNIX_INFO; /* level 0x202 */ | 1961 | } __attribute__((packed)) FILE_UNIX_INFO; /* level 0x202 */ |
| 1802 | 1962 | ||
| 1803 | typedef struct { | 1963 | typedef struct { |
| 1804 | __le32 NextEntryOffset; | 1964 | __le32 NextEntryOffset; |
| @@ -1812,7 +1972,7 @@ typedef struct { | |||
| 1812 | __le32 ExtFileAttributes; | 1972 | __le32 ExtFileAttributes; |
| 1813 | __le32 FileNameLength; | 1973 | __le32 FileNameLength; |
| 1814 | char FileName[1]; | 1974 | char FileName[1]; |
| 1815 | } FILE_DIRECTORY_INFO; /* level 0x101 FF response data area */ | 1975 | } __attribute__((packed)) FILE_DIRECTORY_INFO; /* level 0x101 FF response data area */ |
| 1816 | 1976 | ||
| 1817 | typedef struct { | 1977 | typedef struct { |
| 1818 | __le32 NextEntryOffset; | 1978 | __le32 NextEntryOffset; |
| @@ -1827,7 +1987,7 @@ typedef struct { | |||
| 1827 | __le32 FileNameLength; | 1987 | __le32 FileNameLength; |
| 1828 | __le32 EaSize; /* length of the xattrs */ | 1988 | __le32 EaSize; /* length of the xattrs */ |
| 1829 | char FileName[1]; | 1989 | char FileName[1]; |
| 1830 | } FILE_FULL_DIRECTORY_INFO; /* level 0x102 FF response data area */ | 1990 | } __attribute__((packed)) FILE_FULL_DIRECTORY_INFO; /* level 0x102 FF response data area */ |
| 1831 | 1991 | ||
| 1832 | typedef struct { | 1992 | typedef struct { |
| 1833 | __le32 NextEntryOffset; | 1993 | __le32 NextEntryOffset; |
| @@ -1844,7 +2004,7 @@ typedef struct { | |||
| 1844 | __le32 Reserved; | 2004 | __le32 Reserved; |
| 1845 | __u64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/ | 2005 | __u64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/ |
| 1846 | char FileName[1]; | 2006 | char FileName[1]; |
| 1847 | } SEARCH_ID_FULL_DIR_INFO; /* level 0x105 FF response data area */ | 2007 | } __attribute__((packed)) SEARCH_ID_FULL_DIR_INFO; /* level 0x105 FF response data area */ |
| 1848 | 2008 | ||
| 1849 | typedef struct { | 2009 | typedef struct { |
| 1850 | __le32 NextEntryOffset; | 2010 | __le32 NextEntryOffset; |
| @@ -1862,18 +2022,18 @@ typedef struct { | |||
| 1862 | __u8 Reserved; | 2022 | __u8 Reserved; |
| 1863 | __u8 ShortName[12]; | 2023 | __u8 ShortName[12]; |
| 1864 | char FileName[1]; | 2024 | char FileName[1]; |
| 1865 | } FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FF response data area */ | 2025 | } __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FF response data area */ |
| 1866 | 2026 | ||
| 1867 | 2027 | ||
| 1868 | struct gea { | 2028 | struct gea { |
| 1869 | unsigned char name_len; | 2029 | unsigned char name_len; |
| 1870 | char name[1]; | 2030 | char name[1]; |
| 1871 | }; | 2031 | } __attribute__((packed)); |
| 1872 | 2032 | ||
| 1873 | struct gealist { | 2033 | struct gealist { |
| 1874 | unsigned long list_len; | 2034 | unsigned long list_len; |
| 1875 | struct gea list[1]; | 2035 | struct gea list[1]; |
| 1876 | }; | 2036 | } __attribute__((packed)); |
| 1877 | 2037 | ||
| 1878 | struct fea { | 2038 | struct fea { |
| 1879 | unsigned char EA_flags; | 2039 | unsigned char EA_flags; |
| @@ -1881,21 +2041,21 @@ struct fea { | |||
| 1881 | __le16 value_len; | 2041 | __le16 value_len; |
| 1882 | char name[1]; | 2042 | char name[1]; |
| 1883 | /* optionally followed by value */ | 2043 | /* optionally followed by value */ |
| 1884 | }; | 2044 | } __attribute__((packed)); |
| 1885 | /* flags for _FEA.fEA */ | 2045 | /* flags for _FEA.fEA */ |
| 1886 | #define FEA_NEEDEA 0x80 /* need EA bit */ | 2046 | #define FEA_NEEDEA 0x80 /* need EA bit */ |
| 1887 | 2047 | ||
| 1888 | struct fealist { | 2048 | struct fealist { |
| 1889 | __le32 list_len; | 2049 | __le32 list_len; |
| 1890 | struct fea list[1]; | 2050 | struct fea list[1]; |
| 1891 | }; | 2051 | } __attribute__((packed)); |
| 1892 | 2052 | ||
| 1893 | /* used to hold an arbitrary blob of data */ | 2053 | /* used to hold an arbitrary blob of data */ |
| 1894 | struct data_blob { | 2054 | struct data_blob { |
| 1895 | __u8 *data; | 2055 | __u8 *data; |
| 1896 | size_t length; | 2056 | size_t length; |
| 1897 | void (*free) (struct data_blob * data_blob); | 2057 | void (*free) (struct data_blob * data_blob); |
| 1898 | }; | 2058 | } __attribute__((packed)); |
| 1899 | 2059 | ||
| 1900 | 2060 | ||
| 1901 | #ifdef CONFIG_CIFS_POSIX | 2061 | #ifdef CONFIG_CIFS_POSIX |
| @@ -1907,18 +2067,17 @@ struct data_blob { | |||
| 1907 | perhaps add a CreateDevice - to create Pipes and other special .inodes | 2067 | perhaps add a CreateDevice - to create Pipes and other special .inodes |
| 1908 | Also note POSIX open flags | 2068 | Also note POSIX open flags |
| 1909 | 2) Close - to return the last write time to do cache across close more safely | 2069 | 2) Close - to return the last write time to do cache across close more safely |
| 1910 | 3) PosixQFSInfo - to return statfs info | 2070 | 3) FindFirst return unique inode number - what about resume key, two |
| 1911 | 4) FindFirst return unique inode number - what about resume key, two forms short (matches readdir) and full (enough info to cache inodes) | 2071 | forms short (matches readdir) and full (enough info to cache inodes) |
| 1912 | 5) Mkdir - set mode | 2072 | 4) Mkdir - set mode |
| 1913 | 2073 | ||
| 1914 | And under consideration: | 2074 | And under consideration: |
| 1915 | 6) FindClose2 (return nanosecond timestamp ??) | 2075 | 5) FindClose2 (return nanosecond timestamp ??) |
| 1916 | 7) Use nanosecond timestamps throughout all time fields if | 2076 | 6) Use nanosecond timestamps throughout all time fields if |
| 1917 | corresponding attribute flag is set | 2077 | corresponding attribute flag is set |
| 1918 | 8) sendfile - handle based copy | 2078 | 7) sendfile - handle based copy |
| 1919 | 9) Direct i/o | 2079 | 8) Direct i/o |
| 1920 | 10) "POSIX ACL" support | 2080 | 9) Misc fcntls? |
| 1921 | 11) Misc fcntls? | ||
| 1922 | 2081 | ||
| 1923 | what about fixing 64 bit alignment | 2082 | what about fixing 64 bit alignment |
| 1924 | 2083 | ||
| @@ -1974,7 +2133,7 @@ struct data_blob { | |||
| 1974 | 2133 | ||
| 1975 | */ | 2134 | */ |
| 1976 | 2135 | ||
| 1977 | /* xsymlink is a symlink format that can be used | 2136 | /* xsymlink is a symlink format (used by MacOS) that can be used |
| 1978 | to save symlink info in a regular file when | 2137 | to save symlink info in a regular file when |
| 1979 | mounted to operating systems that do not | 2138 | mounted to operating systems that do not |
| 1980 | support the cifs Unix extensions or EAs (for xattr | 2139 | support the cifs Unix extensions or EAs (for xattr |
| @@ -1999,7 +2158,7 @@ struct xsymlink { | |||
| 1999 | char cr2; /* \n */ | 2158 | char cr2; /* \n */ |
| 2000 | /* if room left, then end with \n then 0x20s by convention but not required */ | 2159 | /* if room left, then end with \n then 0x20s by convention but not required */ |
| 2001 | char path[1024]; | 2160 | char path[1024]; |
| 2002 | }; | 2161 | } __attribute__((packed)); |
| 2003 | 2162 | ||
| 2004 | typedef struct file_xattr_info { | 2163 | typedef struct file_xattr_info { |
| 2005 | /* BB do we need another field for flags? BB */ | 2164 | /* BB do we need another field for flags? BB */ |
| @@ -2007,7 +2166,7 @@ typedef struct file_xattr_info { | |||
| 2007 | __u32 xattr_value_len; | 2166 | __u32 xattr_value_len; |
| 2008 | char xattr_name[0]; | 2167 | char xattr_name[0]; |
| 2009 | /* followed by xattr_value[xattr_value_len], no pad */ | 2168 | /* followed by xattr_value[xattr_value_len], no pad */ |
| 2010 | } FILE_XATTR_INFO; /* extended attribute, info level 0x205 */ | 2169 | } __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute, info level 0x205 */ |
| 2011 | 2170 | ||
| 2012 | 2171 | ||
| 2013 | /* flags for chattr command */ | 2172 | /* flags for chattr command */ |
| @@ -2033,10 +2192,8 @@ typedef struct file_xattr_info { | |||
| 2033 | typedef struct file_chattr_info { | 2192 | typedef struct file_chattr_info { |
| 2034 | __le64 mask; /* list of all possible attribute bits */ | 2193 | __le64 mask; /* list of all possible attribute bits */ |
| 2035 | __le64 mode; /* list of actual attribute bits on this inode */ | 2194 | __le64 mode; /* list of actual attribute bits on this inode */ |
| 2036 | } FILE_CHATTR_INFO; /* ext attributes (chattr, chflags) level 0x206 */ | 2195 | } __attribute__((packed)) FILE_CHATTR_INFO; /* ext attributes (chattr, chflags) level 0x206 */ |
| 2037 | 2196 | ||
| 2038 | #endif | 2197 | #endif |
| 2039 | 2198 | ||
| 2040 | #pragma pack() /* resume default structure packing */ | ||
| 2041 | |||
| 2042 | #endif /* _CIFSPDU_H */ | 2199 | #endif /* _CIFSPDU_H */ |
